STM32F10xxx支持三種復位形式,分別為系統復位、上電復位和備份區域復位。
一、系統復位:
系統復位將復位所有寄存器至它們的復位狀態。 當發生以下任一事件時,產生一個系統復位:
- 1. NRST引腳上的低電平(外部復位) 2. 窗口看門狗計數終止(WWDG復位)
- 3. 獨立看門狗計數終止(IWDG復位)
- 4. 軟件復位(SW復位)
- 5. 低功耗管理復位 可通過查看RCC_CSR控制狀態寄存器中的復位狀態標志位識別復位事件來源。
軟件復位通過將Cortex™-M3中斷應用和復位控制寄存器中的SYSRESETREQ位置’1’,可實現軟件復位。請參考Cortex™-M3技術參考手冊獲得進一步信息。
低功耗管理復位在以下兩種情況下可產生低功耗管理復位:
- 1. 在進入待機模式時產生低功耗管理復位: 通過將用戶選擇字節中的nRST_STDBY位置’1’將使能該復位。這時,即使執行了進入待機模式的過程,系統將被復位而不是進入待機模式。
- 2. 在進入停止模式時產生低功耗管理復位: 通過將用戶選擇字節中的nRST_STOP位置’1’將使能該復位。這時,即使執行了進入停機模式的過程,系統將被復位而不是進入停機模式。
- 關於用戶選擇字節的進一步信息,請參考STM32F10xxx閃存編程手冊。
二、電源復位
電源復位當以下事件中之一發生時,產生電源復位:
- 1. 上電/掉電復位(POR/PDR復位)
- 2. 從待機模式中返回 圖4) 電源復位將復位除了備份區域外的所有寄存器。
(見圖中復位源將最終作用於RESET引腳,並在復位過程中保持低電平。復位入口矢量被固定在地址0x0000_0004。
芯片內部的復位信號會在NRST引腳上輸出,脈沖發生器保證每一個(外部或內部)復位源都能有至少20μs的脈沖延時;當NRST引腳被拉低產生外部復位時,它將產生復位脈沖。

三、備份域復位
備份區域擁有兩個專門的復位,它們只影響備份區域(見圖4)。 當以下事件中之一發生時,產生備份區域復位。
- 1. 軟件復位,備份區域復位可由設置備份域控制寄存器 (RCC_BDCR)(見6.3.9節)中的BDRST位產生。
- 2. 在VDD和VBAT兩者掉電的前提下,VDD或VBAT上電將引發備份區域復位。
四、復位的標志位



五、復位標志位檢索/判斷什么原因導致的復位
標志位判斷的代碼由官方庫中給定代碼如下:
FlagStatus RCC_GetFlagStatus(uint8_t RCC_FLAG);//FlagStatus 分為SET和RESET兩種;
1 /** 2 * @brief Checks whether the specified RCC flag is set or not. 3 * @param RCC_FLAG: specifies the flag to check. 4 * 5 * For @b STM32_Connectivity_line_devices, this parameter can be one of the 6 * following values: 7 * @arg RCC_FLAG_HSIRDY: HSI oscillator clock ready 8 * @arg RCC_FLAG_HSERDY: HSE oscillator clock ready 9 * @arg RCC_FLAG_PLLRDY: PLL clock ready 10 * @arg RCC_FLAG_PLL2RDY: PLL2 clock ready 11 * @arg RCC_FLAG_PLL3RDY: PLL3 clock ready 12 * @arg RCC_FLAG_LSERDY: LSE oscillator clock ready 13 * @arg RCC_FLAG_LSIRDY: LSI oscillator clock ready 14 * @arg RCC_FLAG_PINRST: Pin reset 15 * @arg RCC_FLAG_PORRST: POR/PDR reset 16 * @arg RCC_FLAG_SFTRST: Software reset 17 * @arg RCC_FLAG_IWDGRST: Independent Watchdog reset 18 * @arg RCC_FLAG_WWDGRST: Window Watchdog reset 19 * @arg RCC_FLAG_LPWRRST: Low Power reset 20 * 21 * For @b other_STM32_devices, this parameter can be one of the following values: 22 * @arg RCC_FLAG_HSIRDY: HSI oscillator clock ready 23 * @arg RCC_FLAG_HSERDY: HSE oscillator clock ready 24 * @arg RCC_FLAG_PLLRDY: PLL clock ready 25 * @arg RCC_FLAG_LSERDY: LSE oscillator clock ready 26 * @arg RCC_FLAG_LSIRDY: LSI oscillator clock ready 27 * @arg RCC_FLAG_PINRST: Pin reset 28 * @arg RCC_FLAG_PORRST: POR/PDR reset 29 * @arg RCC_FLAG_SFTRST: Software reset 30 * @arg RCC_FLAG_IWDGRST: Independent Watchdog reset 31 * @arg RCC_FLAG_WWDGRST: Window Watchdog reset 32 * @arg RCC_FLAG_LPWRRST: Low Power reset 33 * 34 * @retval The new state of RCC_FLAG (SET or RESET). 35 */ 36 FlagStatus RCC_GetFlagStatus(uint8_t RCC_FLAG) 37 { 38 uint32_t tmp = 0; 39 uint32_t statusreg = 0; 40 FlagStatus bitstatus = RESET; 41 /* Check the parameters */ 42 assert_param(IS_RCC_FLAG(RCC_FLAG)); 43 44 /* Get the RCC register index */ 45 tmp = RCC_FLAG >> 5; 46 if (tmp == 1) /* The flag to check is in CR register */ 47 { 48 statusreg = RCC->CR; 49 } 50 else if (tmp == 2) /* The flag to check is in BDCR register */ 51 { 52 statusreg = RCC->BDCR; 53 } 54 else /* The flag to check is in CSR register */ 55 { 56 statusreg = RCC->CSR; 57 } 58 59 /* Get the flag position */ 60 tmp = RCC_FLAG & FLAG_Mask; 61 if ((statusreg & ((uint32_t)1 << tmp)) != (uint32_t)RESET) 62 { 63 bitstatus = SET; 64 } 65 else 66 { 67 bitstatus = RESET; 68 } 69 70 /* Return the flag status */ 71 return bitstatus; 72 }
當然判斷完后,我們需要將復位類型的標志置位以防后期出現重復多次判斷
void RCC_ClearFlag(void);//清除復位執行函數
1 /** 2 * @brief Clears the RCC reset flags. 3 * @note The reset flags are: RCC_FLAG_PINRST, RCC_FLAG_PORRST, RCC_FLAG_SFTRST, 4 * RCC_FLAG_IWDGRST, RCC_FLAG_WWDGRST, RCC_FLAG_LPWRRST 5 * @param None 6 * @retval None 7 */ 8 void RCC_ClearFlag(void) 9 { 10 /* Set RMVF bit to clear the reset flags */ 11 RCC->CSR |= CSR_RMVF_Set; 12 }
在使用時,只需要執行如下語句即可:
1 if(RCC_GetFlagStatus(RCC_FLAG_PORRST) != RESET) 2 { 3 //這是上電復位 4 } 5 else if (RCC_GetFlagStatus(RCC_FLAG_PINRST) != RESET) 6 { 7 //這是外部RST管腳復位 8 } 9 else if (RCC_GetFlagStatus(RCC_FLAG_SFTRST)!= RESET) 10 { 11 //這是外部RST管腳復位 12 } 13 RCC_ClearFlag();//清除RCC中復位標志
當然軟件復位的代碼如下:
六、STM32軟件復位方法
在Cortex-M3權威指南中有這么一句話這里有一個要注意的問題:從SYSRESETREQ 被置為有效,到復位發生器執行復位命令,往往會有一個延時。在此延時期間,處理器仍然可以響應中斷請求。但我們的本意往往是要讓此次執行到此為止,不要再做任何其它事情了。所以,最好在發出復位請求前,先把FAULTMASK 置位。所以最好在將FAULTMASK 置位才萬無一失。
void mcuRestart(void)
{
__set_FAULTMASK(1); //關閉所有中斷
NVIC_SystemReset(); //復位
}
