diff --git a/windows/mpconfigport.h b/windows/mpconfigport.h
index da49bc0dcb7fac3872ed0a61e9d08e71feffd201..88596977cf4abeb78c9c64fc5af41d7560f26e62 100644
--- a/windows/mpconfigport.h
+++ b/windows/mpconfigport.h
@@ -92,6 +92,7 @@
 #define MICROPY_PY_UBINASCII        (1)
 #define MICROPY_PY_URANDOM          (1)
 #define MICROPY_PY_UTIME            (1)
+#define MICROPY_PY_UTIME_MP_HAL     (1)
 #define MICROPY_PY_MACHINE          (1)
 
 #define MICROPY_ERROR_REPORTING     (MICROPY_ERROR_REPORTING_DETAILED)
diff --git a/windows/windows_mphal.c b/windows/windows_mphal.c
index 6cc4f65428cd2684115f5520e2ffd0e78e4da879..0f00597af0bffce624d2a504617a83d481583043 100644
--- a/windows/windows_mphal.c
+++ b/windows/windows_mphal.c
@@ -30,6 +30,7 @@
 
 #include <windows.h>
 #include <unistd.h>
+#include <sys/time.h>
 
 HANDLE std_in = NULL;
 HANDLE con_out = NULL;
@@ -204,3 +205,15 @@ void mp_hal_stdout_tx_strn_cooked(const char *str, size_t len) {
 void mp_hal_stdout_tx_str(const char *str) {
     mp_hal_stdout_tx_strn(str, strlen(str));
 }
+
+mp_uint_t mp_hal_ticks_ms(void) {
+    struct timeval tv;
+    gettimeofday(&tv, NULL);
+    return tv.tv_sec * 1000 + tv.tv_usec / 1000;
+}
+
+mp_uint_t mp_hal_ticks_us(void) {
+    struct timeval tv;
+    gettimeofday(&tv, NULL);
+    return tv.tv_sec * 1000000 + tv.tv_usec;
+}
diff --git a/windows/windows_mphal.h b/windows/windows_mphal.h
index dce24845501baac465453367ac26f2c58bf4cd01..a17f170214a59d2c5512b6561e80d2a195d393b5 100644
--- a/windows/windows_mphal.h
+++ b/windows/windows_mphal.h
@@ -31,3 +31,6 @@
 
 void mp_hal_move_cursor_back(unsigned int pos);
 void mp_hal_erase_line_from_cursor(unsigned int n_chars_to_erase);
+
+// TODO: Implement.
+#define mp_hal_ticks_cpu() 0