2929#include STM32_HAL_H
3030
3131#include "py/nlr.h"
32+ #include "py/smallint.h"
3233#include "py/obj.h"
34+ #include "systick.h"
3335#include "timeutils.h"
3436#include "portmodules.h"
3537#include "rtc.h"
@@ -112,6 +114,18 @@ STATIC mp_obj_t time_mktime(mp_obj_t tuple) {
112114}
113115MP_DEFINE_CONST_FUN_OBJ_1 (time_mktime_obj , time_mktime );
114116
117+ /// \function time()
118+ /// Returns the number of seconds, as an integer, since 1/1/2000.
119+ STATIC mp_obj_t time_time (void ) {
120+ // get date and time
121+ // note: need to call get time then get date to correctly access the registers
122+ RTC_DateTypeDef date ;
123+ RTC_TimeTypeDef time ;
124+ HAL_RTC_GetTime (& RTCHandle , & time , FORMAT_BIN );
125+ HAL_RTC_GetDate (& RTCHandle , & date , FORMAT_BIN );
126+ return mp_obj_new_int (timeutils_seconds_since_2000 (2000 + date .Year , date .Month , date .Date , time .Hours , time .Minutes , time .Seconds ));
127+ }
128+ MP_DEFINE_CONST_FUN_OBJ_0 (time_time_obj , time_time );
115129
116130/// \function sleep(seconds)
117131/// Sleep for the given number of seconds. Seconds can be a floating-point number to
@@ -130,26 +144,67 @@ STATIC mp_obj_t time_sleep(mp_obj_t seconds_o) {
130144}
131145MP_DEFINE_CONST_FUN_OBJ_1 (time_sleep_obj , time_sleep );
132146
133- /// \function time()
134- /// Returns the number of seconds, as an integer, since 1/1/2000.
135- STATIC mp_obj_t time_time (void ) {
136- // get date and time
137- // note: need to call get time then get date to correctly access the registers
138- RTC_DateTypeDef date ;
139- RTC_TimeTypeDef time ;
140- HAL_RTC_GetTime (& RTCHandle , & time , FORMAT_BIN );
141- HAL_RTC_GetDate (& RTCHandle , & date , FORMAT_BIN );
142- return mp_obj_new_int (timeutils_seconds_since_2000 (2000 + date .Year , date .Month , date .Date , time .Hours , time .Minutes , time .Seconds ));
147+ STATIC mp_obj_t time_sleep_ms (mp_obj_t ms_in ) {
148+ mp_int_t ms = mp_obj_get_int (ms_in );
149+ if (ms > 0 ) {
150+ HAL_Delay (ms );
151+ }
152+ return mp_const_none ;
143153}
144- MP_DEFINE_CONST_FUN_OBJ_0 (time_time_obj , time_time );
154+ MP_DEFINE_CONST_FUN_OBJ_1 (time_sleep_ms_obj , time_sleep_ms );
155+
156+ STATIC mp_obj_t time_sleep_us (mp_obj_t usec_in ) {
157+ mp_int_t usec = mp_obj_get_int (usec_in );
158+ if (usec > 0 ) {
159+ sys_tick_udelay (usec );
160+ }
161+ return mp_const_none ;
162+ }
163+ MP_DEFINE_CONST_FUN_OBJ_1 (time_sleep_us_obj , time_sleep_us );
164+
165+ STATIC mp_obj_t time_ticks_ms (void ) {
166+ return MP_OBJ_NEW_SMALL_INT (HAL_GetTick () & MP_SMALL_INT_POSITIVE_MASK );
167+ }
168+ STATIC MP_DEFINE_CONST_FUN_OBJ_0 (time_ticks_ms_obj , time_ticks_ms );
169+
170+ STATIC mp_obj_t time_ticks_us (void ) {
171+ return MP_OBJ_NEW_SMALL_INT (sys_tick_get_microseconds () & MP_SMALL_INT_POSITIVE_MASK );
172+ }
173+ STATIC MP_DEFINE_CONST_FUN_OBJ_0 (time_ticks_us_obj , time_ticks_us );
174+
175+ STATIC mp_obj_t time_ticks_cpu (void ) {
176+ static bool enabled = false;
177+ if (!enabled ) {
178+ CoreDebug -> DEMCR |= CoreDebug_DEMCR_TRCENA_Msk ;
179+ DWT -> CYCCNT = 0 ;
180+ DWT -> CTRL |= DWT_CTRL_CYCCNTENA_Msk ;
181+ enabled = true;
182+ }
183+ return MP_OBJ_NEW_SMALL_INT (DWT -> CYCCNT & MP_SMALL_INT_POSITIVE_MASK );
184+ }
185+ STATIC MP_DEFINE_CONST_FUN_OBJ_0 (time_ticks_cpu_obj , time_ticks_cpu );
186+
187+ STATIC mp_obj_t time_ticks_diff (mp_obj_t start_in , mp_obj_t end_in ) {
188+ // we assume that the arguments come from ticks_xx so are small ints
189+ uint32_t start = MP_OBJ_SMALL_INT_VALUE (start_in );
190+ uint32_t end = MP_OBJ_SMALL_INT_VALUE (end_in );
191+ return MP_OBJ_NEW_SMALL_INT ((end - start ) & MP_SMALL_INT_POSITIVE_MASK );
192+ }
193+ STATIC MP_DEFINE_CONST_FUN_OBJ_2 (time_ticks_diff_obj , time_ticks_diff );
145194
146195STATIC const mp_map_elem_t time_module_globals_table [] = {
147196 { MP_OBJ_NEW_QSTR (MP_QSTR___name__ ), MP_OBJ_NEW_QSTR (MP_QSTR_utime ) },
148197
149198 { MP_OBJ_NEW_QSTR (MP_QSTR_localtime ), (mp_obj_t )& time_localtime_obj },
150199 { MP_OBJ_NEW_QSTR (MP_QSTR_mktime ), (mp_obj_t )& time_mktime_obj },
151- { MP_OBJ_NEW_QSTR (MP_QSTR_sleep ), (mp_obj_t )& time_sleep_obj },
152200 { MP_OBJ_NEW_QSTR (MP_QSTR_time ), (mp_obj_t )& time_time_obj },
201+ { MP_OBJ_NEW_QSTR (MP_QSTR_sleep ), (mp_obj_t )& time_sleep_obj },
202+ { MP_OBJ_NEW_QSTR (MP_QSTR_sleep_ms ), (mp_obj_t )& time_sleep_ms_obj },
203+ { MP_OBJ_NEW_QSTR (MP_QSTR_sleep_us ), (mp_obj_t )& time_sleep_us_obj },
204+ { MP_OBJ_NEW_QSTR (MP_QSTR_ticks_ms ), (mp_obj_t )& time_ticks_ms_obj },
205+ { MP_OBJ_NEW_QSTR (MP_QSTR_ticks_us ), (mp_obj_t )& time_ticks_us_obj },
206+ { MP_OBJ_NEW_QSTR (MP_QSTR_ticks_cpu ), (mp_obj_t )& time_ticks_cpu_obj },
207+ { MP_OBJ_NEW_QSTR (MP_QSTR_ticks_diff ), (mp_obj_t )& time_ticks_diff_obj },
153208};
154209
155210STATIC MP_DEFINE_CONST_DICT (time_module_globals , time_module_globals_table );
0 commit comments