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 #7816. Signed-off-by: Jim Mussared <jim.mussared@gmail.com>
This commit is contained in:
committed by
Damien George
parent
492ba5eaf2
commit
986ad6bf1d
@@ -89,6 +89,9 @@ void boardctrl_maybe_enter_mboot(size_t n_args, const void *args_in) {
|
|||||||
|
|
||||||
#if !MICROPY_HW_USES_BOOTLOADER
|
#if !MICROPY_HW_USES_BOOTLOADER
|
||||||
STATIC uint update_reset_mode(uint reset_mode) {
|
STATIC uint update_reset_mode(uint reset_mode) {
|
||||||
|
// Note: Must use HAL_Delay here as MicroPython is not yet initialised
|
||||||
|
// and mp_hal_delay_ms will attempt to invoke the scheduler.
|
||||||
|
|
||||||
#if MICROPY_HW_HAS_SWITCH
|
#if MICROPY_HW_HAS_SWITCH
|
||||||
if (switch_get()) {
|
if (switch_get()) {
|
||||||
|
|
||||||
@@ -100,7 +103,7 @@ STATIC uint update_reset_mode(uint reset_mode) {
|
|||||||
led_state(3, reset_mode & 2);
|
led_state(3, reset_mode & 2);
|
||||||
led_state(4, reset_mode & 4);
|
led_state(4, reset_mode & 4);
|
||||||
for (uint j = 0; j < 30; ++j) {
|
for (uint j = 0; j < 30; ++j) {
|
||||||
mp_hal_delay_ms(20);
|
HAL_Delay(20);
|
||||||
if (!switch_get()) {
|
if (!switch_get()) {
|
||||||
goto select_mode;
|
goto select_mode;
|
||||||
}
|
}
|
||||||
@@ -115,13 +118,13 @@ STATIC uint update_reset_mode(uint reset_mode) {
|
|||||||
led_state(2, 0);
|
led_state(2, 0);
|
||||||
led_state(3, 0);
|
led_state(3, 0);
|
||||||
led_state(4, 0);
|
led_state(4, 0);
|
||||||
mp_hal_delay_ms(50);
|
HAL_Delay(50);
|
||||||
led_state(2, reset_mode & 1);
|
led_state(2, reset_mode & 1);
|
||||||
led_state(3, reset_mode & 2);
|
led_state(3, reset_mode & 2);
|
||||||
led_state(4, reset_mode & 4);
|
led_state(4, reset_mode & 4);
|
||||||
mp_hal_delay_ms(50);
|
HAL_Delay(50);
|
||||||
}
|
}
|
||||||
mp_hal_delay_ms(400);
|
HAL_Delay(400);
|
||||||
|
|
||||||
#elif defined(MICROPY_HW_LED1)
|
#elif defined(MICROPY_HW_LED1)
|
||||||
|
|
||||||
@@ -134,11 +137,11 @@ STATIC uint update_reset_mode(uint reset_mode) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
led_state(1, 1);
|
led_state(1, 1);
|
||||||
mp_hal_delay_ms(100);
|
HAL_Delay(100);
|
||||||
led_state(1, 0);
|
led_state(1, 0);
|
||||||
mp_hal_delay_ms(200);
|
HAL_Delay(200);
|
||||||
}
|
}
|
||||||
mp_hal_delay_ms(400);
|
HAL_Delay(400);
|
||||||
if (!switch_get()) {
|
if (!switch_get()) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -150,11 +153,11 @@ STATIC uint update_reset_mode(uint reset_mode) {
|
|||||||
for (uint i = 0; i < 2; i++) {
|
for (uint i = 0; i < 2; i++) {
|
||||||
for (uint j = 0; j < reset_mode; j++) {
|
for (uint j = 0; j < reset_mode; j++) {
|
||||||
led_state(1, 1);
|
led_state(1, 1);
|
||||||
mp_hal_delay_ms(100);
|
HAL_Delay(100);
|
||||||
led_state(1, 0);
|
led_state(1, 0);
|
||||||
mp_hal_delay_ms(200);
|
HAL_Delay(200);
|
||||||
}
|
}
|
||||||
mp_hal_delay_ms(400);
|
HAL_Delay(400);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
#error Need a reset mode update method
|
#error Need a reset mode update method
|
||||||
|
|||||||
Reference in New Issue
Block a user