最近項目遇到了一個問題:一個子系統,具有IAP升級的功能,Bootloader位于0x08000000,也就是說系統在運行過程允許復位。但是,該子系統需要在上電的過程中處理某項任務(而且只需要上電的那一次)。
問題來了:我們如何判斷系統是第一次上電復位?
解決的辦法有很多種,但是最簡單的辦法就是獲取系統復位來源,詳情請看文章。
其實,這篇文章的內容也能回答之前一位網友的問題,不知你會不會閱讀本文。
Ⅰ
RCC復位和時鐘控制
RCC:Reset and Clock Control
相信大家都知道RCC是什么,主要就是講述復位和時鐘的章節。先來講述一下復位種類。
STM32的復位大概分為三類:系統復位、電源復位和后備域復位。
系統復位:
1. NRST引腳上的低電平(外部復位)
2. 窗口看門狗計數終止(WWDG復位)
3. 獨立看門狗計數終止(IWDG復位)
4. 軟件復位(SW復位)
5. 低功耗管理復位
電源復位:
1. 上電/掉電復位(POR/PDR復位)
2. 從待機模式中返回
備份區域復位:
1. 軟件復位,備份區域復位可由設置備份域控制寄存器(RCC_BDCR)中的BDRST位產生。
2. 在VDD和VBAT兩者掉電的前提下, VDD或VBAT上電將引發備份區域復位。
Ⅱ
RCC_CSR
CSR:Control/Status Register,即控制/狀態寄存器。
在STM32種,RCC的寄存器和功能因芯片的不同而不同,但RCC_CSR寄存器是眾多STM32種都具有的一個。
這個寄存器就會記錄各種復位的狀態,我們只需要讀取這個寄存器即可知道是什么樣子引起的復位。
Ⅲ
源代碼實例
上面說了那么多,其實大家都容易理解,但只有真正實測過源代碼,才能真正起到掌握的作用。
為了方便某些懶惰的朋友,我將提供測試源代碼,方便大家學習和掌握。
本文源代碼給予前面文章【CM3內核復位與系統復位區別及應用】提供的源代碼的基礎上修改而來。
現在主要看下測試源代碼和測試效果:
各種情況打印結果:
1.上電復位打印信息
CSR = C000000
5.POR/PDR reset
6.PIN reset
Demo...
Demo...
2.按鍵(PIN)復位打印信息
CSR = 4000000
6.PIN reset
Demo...
Demo...
3.內核復位 NVIC_CoreReset();打印信息
CSR = 0
Demo...
Demo...
4.系統復位 NVIC_SysReset();打印信息
CSR = 14000000
4.Software reset
6.PIN reset
Demo...
Demo...
到了這一步,相信大家基本明白了。但是,還有值得進一步分析的地方,這里我算是給大家安排的作業(只有愿意動腦思考的人,才會有進步)。
為了方便大家學習,我將源代碼提供給大家下載(雖只有STM32F1,但其他系列類似)。
STM32F103ZE(Keil)_復位來源(寄存器版):
http://pan.baidu.com/s/1hskScba
推薦閱讀:
CM3(STM32)內核復位與系統復位區別及應用
有一種修飾符能使變量在處理器復位而不被初始化
Ⅳ
最后
微信搜索“EmbeddDeveloper” 或者掃描下面二維碼、關注,在我的底部菜單查看更多精彩內容!
長按識別二維碼 關注
原文標題:一篇很簡單,有必要了解的文章 - STM32復位來源(寄存器版)
文章出處:【微信公眾號:strongerHuang】歡迎添加關注!文章轉載請注明出處。
-
寄存器
+關注
關注
31文章
5363瀏覽量
120932 -
STM32
+關注
關注
2270文章
10923瀏覽量
357057 -
IAP
+關注
關注
2文章
164瀏覽量
24348
發布評論請先 登錄
相關推薦
評論