diff --git a/Documentation/pycardium/utime.rst b/Documentation/pycardium/utime.rst
index 30af11ef7dcd9e9ae9da6dcd877621a4dc7d3d89..b28d7b11bd6fe6d56770048b2711df928ced0f0e 100644
--- a/Documentation/pycardium/utime.rst
+++ b/Documentation/pycardium/utime.rst
@@ -45,6 +45,20 @@ alarm.
 
    .. versionadded:: 1.11
 
+.. py:function:: ticks_ms()
+
+   Return processor ticks (converted to milliseconds) since Pycardium startup.
+
+   This function should be the preferred method for timing and profiling
+   because it does not need an API call and thus is very fast.
+
+.. py:function:: ticks_us()
+
+   Return processor ticks (converted to microseconds) since Pycardium startup.
+
+   This function should be the preferred method for timing and profiling
+   because it does not need an API call and thus is very fast.
+
 .. py:function:: unix_time()
 
    Return the current unix time as seconds since the epoch.
diff --git a/pycardium/modules/utime.c b/pycardium/modules/utime.c
index f6fd365bafef1c311feff286a09d9630cb1deff5..d29708205e24a1b6f2c16e8b64b6d340feedb205 100644
--- a/pycardium/modules/utime.c
+++ b/pycardium/modules/utime.c
@@ -202,6 +202,8 @@ static const mp_rom_map_elem_t time_module_globals_table[] = {
 	{ MP_ROM_QSTR(MP_QSTR_sleep), MP_ROM_PTR(&mp_utime_sleep_obj) },
 	{ MP_ROM_QSTR(MP_QSTR_sleep_ms), MP_ROM_PTR(&mp_utime_sleep_ms_obj) },
 	{ MP_ROM_QSTR(MP_QSTR_sleep_us), MP_ROM_PTR(&mp_utime_sleep_us_obj) },
+	{ MP_ROM_QSTR(MP_QSTR_ticks_ms), MP_ROM_PTR(&mp_utime_ticks_ms_obj) },
+	{ MP_ROM_QSTR(MP_QSTR_ticks_us), MP_ROM_PTR(&mp_utime_ticks_us_obj) },
 	{ MP_ROM_QSTR(MP_QSTR_alarm), MP_ROM_PTR(&time_alarm_obj) },
 #if 0
 	/* TODO: Implement those */
diff --git a/pycardium/mphalport.c b/pycardium/mphalport.c
index 3e0c6de185c44d2a56d13e2164f46255b29ad852..95954bba61af875201cd0806eb1ff52327420b53 100644
--- a/pycardium/mphalport.c
+++ b/pycardium/mphalport.c
@@ -271,7 +271,12 @@ void mp_hal_delay_us(mp_uint_t us)
 
 mp_uint_t mp_hal_ticks_ms(void)
 {
-	return 0;
+	return (mp_uint_t)(systick_get_us() / 1000);
+}
+
+mp_uint_t mp_hal_ticks_us(void)
+{
+	return (mp_uint_t)systick_get_us();
 }
 
 /******************************************************************************