diff --git a/zephyr/modutime.c b/zephyr/modutime.c
index 8b96a5ab1e2b02aa553538acb15fe8a4ec71e6c0..378068bb3859006c0941ae3ddd2bf37e6faa80b7 100644
--- a/zephyr/modutime.c
+++ b/zephyr/modutime.c
@@ -40,7 +40,7 @@ STATIC mp_obj_t mod_time_time(void) {
      * single precision floats so the fraction component will start to
      * lose precision on devices with a long uptime.
      */
-    return mp_obj_new_int(sys_tick_get() / sys_clock_ticks_per_sec);
+    return mp_obj_new_int(k_uptime_get() / 1000);
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_0(mod_time_time_obj, mod_time_time);
 
diff --git a/zephyr/mphalport.h b/zephyr/mphalport.h
index fafbb9ebe53cbc7f311c00081ee946dfe447ee9a..e3cca8d37def72e1f8c7ddb6a52400f11f710eb9 100644
--- a/zephyr/mphalport.h
+++ b/zephyr/mphalport.h
@@ -2,20 +2,18 @@
 #include "lib/utils/interrupt_char.h"
 
 static inline mp_uint_t mp_hal_ticks_us(void) {
-    return sys_tick_get() * sys_clock_us_per_tick;
+    return SYS_CLOCK_HW_CYCLES_TO_NS(k_cycle_get_32()) / 1000;
 }
 
 static inline mp_uint_t mp_hal_ticks_ms(void) {
-    int64_t us = sys_tick_get() * sys_clock_us_per_tick;
-    mp_int_t ms = us / 1000;
-    return ms;
+    return k_uptime_get();
 }
 
 static inline mp_uint_t mp_hal_ticks_cpu(void) {
     // ticks_cpu() is defined as using the highest-resolution timing source
     // in the system. This is usually a CPU clock, but doesn't have to be,
     // here we just use Zephyr hi-res timer.
-    return sys_cycle_get_32();
+    return k_cycle_get_32();
 }
 
 static inline void mp_hal_delay_us(mp_uint_t delay) {