From bff1ff28eec5611a2e963601b98044135694df57 Mon Sep 17 00:00:00 2001 From: Damien George Date: Sat, 3 May 2014 14:11:56 +0100 Subject: [PATCH] stmhal: Fix bug where negative delay/udelay lead to huge delays. A negative ms/us is now treated as a delay of 0 ms/us. This patch also improves the calibration of udelay. --- stmhal/modpyb.c | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/stmhal/modpyb.c b/stmhal/modpyb.c index 6ffc92553a..1ffff1d17a 100644 --- a/stmhal/modpyb.c +++ b/stmhal/modpyb.c @@ -143,22 +143,26 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_0(pyb_millis_obj, pyb_millis); /// \function delay(ms) /// Delay for the given number of milliseconds. -STATIC mp_obj_t pyb_delay(mp_obj_t count) { - HAL_Delay(mp_obj_get_int(count)); +STATIC mp_obj_t pyb_delay(mp_obj_t ms_in) { + machine_int_t ms = mp_obj_get_int(ms_in); + if (ms >= 0) { + HAL_Delay(ms); + } return mp_const_none; } STATIC MP_DEFINE_CONST_FUN_OBJ_1(pyb_delay_obj, pyb_delay); /// \function udelay(us) /// Delay for the given number of microseconds. -STATIC mp_obj_t pyb_udelay(mp_obj_t usec) { - uint32_t count = 0; - const uint32_t utime = (168 * mp_obj_get_int(usec) / 5); - for (;;) { - if (++count > utime) { - return mp_const_none; +STATIC mp_obj_t pyb_udelay(mp_obj_t usec_in) { + machine_int_t usec = mp_obj_get_int(usec_in); + if (usec > 0) { + uint32_t count = 0; + const uint32_t utime = (168 * usec / 4); + while (++count <= utime) { } } + return mp_const_none; } STATIC MP_DEFINE_CONST_FUN_OBJ_1(pyb_udelay_obj, pyb_udelay);