STM32復位及通過函數判斷是何種條件出發的復位


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 }
View Code

 

 當然判斷完后,我們需要將復位類型的標志置位以防后期出現重復多次判斷

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 }
View Code

 

在使用時,只需要執行如下語句即可:

 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(); //復位

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM