mirror of
https://github.com/iNavFlight/inav.git
synced 2025-07-13 11:29:56 +03:00
Merge pull request #4756 from iNavFlight/de_disable_irq
[SYS] Disable all hardware IRQs prior to reboot to ensure they don't fire when handler is not initialized
This commit is contained in:
commit
c336dd9c24
3 changed files with 52 additions and 5 deletions
|
@ -27,19 +27,36 @@
|
|||
#define AIRCR_VECTKEY_MASK ((uint32_t)0x05FA0000)
|
||||
void SetSysClock(uint8_t underclock);
|
||||
|
||||
inline static void NVIC_DisableAllIRQs(void)
|
||||
{
|
||||
// We access CMSIS NVIC registers directly here
|
||||
for (int x = 0; x < 8; x++) {
|
||||
// Mask all IRQs controlled by a ICERx
|
||||
NVIC->ICER[x] = 0xFFFFFFFF;
|
||||
// Clear all pending IRQs controlled by a ICPRx
|
||||
NVIC->ICPR[x] = 0xFFFFFFFF;
|
||||
}
|
||||
}
|
||||
|
||||
void systemReset(void)
|
||||
{
|
||||
// Disable all NVIC interrupts
|
||||
__disable_irq();
|
||||
NVIC_DisableAllIRQs();
|
||||
|
||||
// Generate system reset
|
||||
SCB->AIRCR = AIRCR_VECTKEY_MASK | (uint32_t)0x04;
|
||||
}
|
||||
|
||||
void systemResetToBootloader(void)
|
||||
{
|
||||
// 1FFFF000 -> 20000200 -> SP
|
||||
// 1FFFF004 -> 1FFFF021 -> PC
|
||||
__disable_irq();
|
||||
NVIC_DisableAllIRQs();
|
||||
|
||||
*((uint32_t *)0x20009FFC) = 0xDEADBEEF; // 40KB SRAM STM32F30X
|
||||
systemReset();
|
||||
|
||||
// Generate system reset
|
||||
SCB->AIRCR = AIRCR_VECTKEY_MASK | (uint32_t)0x04;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -32,16 +32,31 @@
|
|||
#define AIRCR_VECTKEY_MASK ((uint32_t)0x05FA0000)
|
||||
void SetSysClock(void);
|
||||
|
||||
inline static void NVIC_DisableAllIRQs(void)
|
||||
{
|
||||
// We access CMSIS NVIC registers directly here
|
||||
for (int x = 0; x < 8; x++) {
|
||||
// Mask all IRQs controlled by a ICERx
|
||||
NVIC->ICER[x] = 0xFFFFFFFF;
|
||||
// Clear all pending IRQs controlled by a ICPRx
|
||||
NVIC->ICPR[x] = 0xFFFFFFFF;
|
||||
}
|
||||
}
|
||||
|
||||
void systemReset(void)
|
||||
{
|
||||
__disable_irq();
|
||||
NVIC_DisableAllIRQs();
|
||||
NVIC_SystemReset();
|
||||
}
|
||||
|
||||
void systemResetToBootloader(void)
|
||||
{
|
||||
*((uint32_t *)0x2001FFFC) = 0xDEADBEEF; // 128KB SRAM STM32F4XX
|
||||
__disable_irq();
|
||||
NVIC_DisableAllIRQs();
|
||||
|
||||
*((uint32_t *)0x2001FFFC) = 0xDEADBEEF; // 128KB SRAM STM32F4XX
|
||||
|
||||
NVIC_SystemReset();
|
||||
}
|
||||
|
||||
|
|
|
@ -31,16 +31,31 @@
|
|||
#define AIRCR_VECTKEY_MASK ((uint32_t)0x05FA0000)
|
||||
void SystemClock_Config(void);
|
||||
|
||||
inline static void NVIC_DisableAllIRQs(void)
|
||||
{
|
||||
// We access CMSIS NVIC registers directly here
|
||||
for (int x = 0; x < 8; x++) {
|
||||
// Mask all IRQs controlled by a ICERx
|
||||
NVIC->ICER[x] = 0xFFFFFFFF;
|
||||
// Clear all pending IRQs controlled by a ICPRx
|
||||
NVIC->ICPR[x] = 0xFFFFFFFF;
|
||||
}
|
||||
}
|
||||
|
||||
void systemReset(void)
|
||||
{
|
||||
__disable_irq();
|
||||
NVIC_DisableAllIRQs();
|
||||
NVIC_SystemReset();
|
||||
}
|
||||
|
||||
void systemResetToBootloader(void)
|
||||
{
|
||||
(*(__IO uint32_t *) (BKPSRAM_BASE + 4)) = 0xDEADBEEF; // flag that will be readable after reboot
|
||||
__disable_irq();
|
||||
NVIC_DisableAllIRQs();
|
||||
|
||||
(*(__IO uint32_t *) (BKPSRAM_BASE + 4)) = 0xDEADBEEF; // flag that will be readable after reboot
|
||||
|
||||
NVIC_SystemReset();
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue