STM32:獲取復位源,軟件復位

 RCC CSR寄存器會存儲復位標示,可經過它來知道復位緣由,來源:ide

 1     if(RCC_GetFlagStatus(RCC_FLAG_PINRST))
 2        printf("PINRST\r\n");
 3     if(RCC_GetFlagStatus(RCC_FLAG_PORRST))
 4        printf("PORRST\r\n");
 5     if(RCC_GetFlagStatus(RCC_FLAG_SFTRST))
 6        printf("SFTRST\r\n");
 7     if(RCC_GetFlagStatus(RCC_FLAG_IWDGRST))
 8        printf("IWDGRST\r\n");
 9     if(RCC_GetFlagStatus(RCC_FLAG_WWDGRST))
10        printf("WWDGRST\r\n");
11     if(RCC_GetFlagStatus(RCC_FLAG_LPWRRST))
12        printf("LPWRRST\r\n");
13     printf("RCC->CSR:%x \r\n",RCC->CSR);
14     RCC->CSR|=0X1000000    ; //清楚中斷標示
15     printf("RCC->CSR:%x \r\n",RCC->CSR);    
簡單示例

軟件復位:轉載函數

在官方軟件庫的 core_cm3.h 文件裏 直接提供了 系統復位的函數 
static __INLINE void NVIC_SystemReset(void)
{
  SCB->AIRCR  = ((0x5FA << SCB_AIRCR_VECTKEY_Pos)      | 
                           (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | 
                           SCB_AIRCR_SYSRESETREQ_Msk);                   /* Keep priority group unchanged */
  __DSB();                                                                                       /* Ensure completion of memory access */              
  while(1);                                                                                        /* wait until reset */
}
  
可是不是直接調用這個函數就OK了? 
  
在Cortex-M3權威指南中有這麼一句話:
這裏有一個要注意的問題:從SYSRESETREQ 被置爲有效,到復位發生器執行復位命令,每每會有一個延時。在此延時期間,處理器仍然能夠響應中斷請求。但咱們的本意每每是要讓這次執行到此爲止,不要再作任何其它事情了。因此,最好在發出復位請求前,先把
FAULTMASK 置位。 因此最好在將FAULTMASK 置位才萬無一失。 
 
一樣官方 core_cm3.h 文件裏也直接提供了該函數 
static __INLINE void __set_FAULTMASK(uint32_t faultMask)
{
register uint32_t __regFaultMask       __ASM("faultmask");
__regFaultMask = (faultMask & 1);
}
 
把上面這兩個函數寫在一塊兒就能夠實現軟件復位了~~
void SoftReset(void)
{
__set_FAULTMASK(1);      // 關閉全部中端
NVIC_SystemReset();// 復位
}

 

測試:按鍵中斷進行軟件復位,獨立看門狗復位,窗口看門狗復位測試

測試發現:分別使用軟件復位,獨立看門狗復位,窗口看門狗復位,復位按鍵,掉電覆位,都會觸發復位按鍵標識位。ui

 1 PINRST
 2 SFTRST
 3 RCC->CSR:14000000 
 4 RCC->CSR:0 
 5 PINRST
 6 IWDGRST
 7 RCC->CSR:24000000 
 8 RCC->CSR:0 
 9 PINRST
10 WWDGRST
11 RCC->CSR:44000000 
12 RCC->CSR:0 
13 PINRST
14 RCC->CSR:4000000 
15 RCC->CSR:0 
16 PINRST
17 PORRST
18 RCC->CSR:c000000 
19 RCC->CSR:0 
測試結果
相關文章
相關標籤/搜索