Skip to content

Commit 3609c29

Browse files
committed
Update STM DFU mode software implementation.
- fix for sizeof array calculation. - follow ARM recommendation to turn off interruptions with NVIC.
1 parent 03f02c7 commit 3609c29

File tree

1 file changed

+13
-4
lines changed

1 file changed

+13
-4
lines changed

ports/stm/supervisor/port.c

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -290,13 +290,22 @@ condition and generating hardware reset or using Go command to execute user code
290290
HAL_RCC_DeInit();
291291
HAL_DeInit();
292292

293-
// disable all interupts
294-
__disable_irq();
293+
// Disable all pending interrupts using NVIC
294+
for (uint8_t i = 0; i < (sizeof(NVIC->ICER) / sizeof(NVIC->ICER[0])); ++i) {
295+
NVIC->ICER[i] = 0xFFFFFFFF;
296+
}
295297

296-
// Clear all pending interrupts
297-
for (uint8_t i = 0; i < (sizeof(NVIC->ICPR) / NVIC->ICPR[0]); ++i) {
298+
// if it is necessary to ensure an interrupt will not be triggered after disabling it in the NVIC,
299+
// add a DSB instruction and then an ISB instruction. (ARM Cortex™-M Programming Guide to
300+
// Memory Barrier Instructions, 4.6 Disabling Interrupts using NVIC)
301+
__DSB();
302+
__ISB();
303+
304+
// Clear all pending interrupts using NVIC
305+
for (uint8_t i = 0; i < (sizeof(NVIC->ICPR) / sizeof(NVIC->ICPR[0])); ++i) {
298306
NVIC->ICPR[i] = 0xFFFFFFFF;
299307
}
308+
300309
// information about jump addresses has been taken from STM AN2606.
301310
#if defined(STM32F4)
302311
__set_MSP(*((uint32_t *)0x1FFF0000));

0 commit comments

Comments
 (0)