Skip to content

Commit 986ad6b

Browse files
jimmodpgeorge
authored andcommitted
stm32/boardctrl: Use HAL_Delay instead of mp_hal_delay_ms.
Not safe to use mp_hal_delay_ms before boot if threading is enabled, because threading will not have been initialised, and MICROPY_EVENT_POLL_HOOK assumes threading is initialised. HAL_Delay doesn't call MICROPY_EVENT_POLL_HOOK, but is still power-efficient like mp_hal_delay_ms (unlike mp_hal_delay_us). Fixes adafruit#7816. Signed-off-by: Jim Mussared <[email protected]>
1 parent 492ba5e commit 986ad6b

File tree

1 file changed

+13
-10
lines changed

1 file changed

+13
-10
lines changed

ports/stm32/boardctrl.c

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,9 @@ void boardctrl_maybe_enter_mboot(size_t n_args, const void *args_in) {
8989

9090
#if !MICROPY_HW_USES_BOOTLOADER
9191
STATIC uint update_reset_mode(uint reset_mode) {
92+
// Note: Must use HAL_Delay here as MicroPython is not yet initialised
93+
// and mp_hal_delay_ms will attempt to invoke the scheduler.
94+
9295
#if MICROPY_HW_HAS_SWITCH
9396
if (switch_get()) {
9497

@@ -100,7 +103,7 @@ STATIC uint update_reset_mode(uint reset_mode) {
100103
led_state(3, reset_mode & 2);
101104
led_state(4, reset_mode & 4);
102105
for (uint j = 0; j < 30; ++j) {
103-
mp_hal_delay_ms(20);
106+
HAL_Delay(20);
104107
if (!switch_get()) {
105108
goto select_mode;
106109
}
@@ -115,13 +118,13 @@ STATIC uint update_reset_mode(uint reset_mode) {
115118
led_state(2, 0);
116119
led_state(3, 0);
117120
led_state(4, 0);
118-
mp_hal_delay_ms(50);
121+
HAL_Delay(50);
119122
led_state(2, reset_mode & 1);
120123
led_state(3, reset_mode & 2);
121124
led_state(4, reset_mode & 4);
122-
mp_hal_delay_ms(50);
125+
HAL_Delay(50);
123126
}
124-
mp_hal_delay_ms(400);
127+
HAL_Delay(400);
125128

126129
#elif defined(MICROPY_HW_LED1)
127130

@@ -134,11 +137,11 @@ STATIC uint update_reset_mode(uint reset_mode) {
134137
break;
135138
}
136139
led_state(1, 1);
137-
mp_hal_delay_ms(100);
140+
HAL_Delay(100);
138141
led_state(1, 0);
139-
mp_hal_delay_ms(200);
142+
HAL_Delay(200);
140143
}
141-
mp_hal_delay_ms(400);
144+
HAL_Delay(400);
142145
if (!switch_get()) {
143146
break;
144147
}
@@ -150,11 +153,11 @@ STATIC uint update_reset_mode(uint reset_mode) {
150153
for (uint i = 0; i < 2; i++) {
151154
for (uint j = 0; j < reset_mode; j++) {
152155
led_state(1, 1);
153-
mp_hal_delay_ms(100);
156+
HAL_Delay(100);
154157
led_state(1, 0);
155-
mp_hal_delay_ms(200);
158+
HAL_Delay(200);
156159
}
157-
mp_hal_delay_ms(400);
160+
HAL_Delay(400);
158161
}
159162
#else
160163
#error Need a reset mode update method

0 commit comments

Comments
 (0)