最近有朋友問了些關于STM32復位的問題,今天結合前面文章再次總結一下復位相關知識。
1STM32的復位和時鐘控制
RCC:Reset and Clock Control
每一塊STM32中都有這么一個RCC復位和時鐘控制模塊。
STM32的復位為三類:系統復位、電源復位和后備域復位。
系統復位:
1. NRST引腳上的低電平(外部復位)
2. 窗口看門狗計數終止(WWDG復位)
3. 獨立看門狗計數終止(IWDG復位)
4. 軟件復位(SW復位)
5. 低功耗管理復位
電源復位:
1. 上電/掉電復位(POR/PDR復位)
2. 從待機模式中返回
備份區域復位:
1. 軟件復位,備份區域復位可由設置備份域控制寄存器(RCC_BDCR)中的BDRST位產生。
2. 在VDD和VBAT兩者掉電的前提下, VDD或VBAT上電將引發備份區域復位。
2STM32的復位來源
在很多應用中,都會判斷是什么引起的復位。
比如:判斷為看門狗引起的復位,我們進行xxx操作。軟件引起的復位,我們又執行xxx操作。
在STM32RCC模塊中,有這么一個寄存器:控制/狀態寄存器 (RCC_CSR):
這個寄存器就會記錄各種復位的狀態,我們直接讀取這個寄存器(庫函數有讀寄存器接口)就能知道是什么引起的復位。
3STM32的復位來源例程
之前我提供了一個簡單Demo,STM32F103ZE(Keil)_復位來源(寄存器版):
http://pan.baidu.com/s/1hskScba
4STM32系統和內核復位
內核復位:它會使STM32內核(Cortex-M)進行復位,而不會影響其外設,如GPIO、TIM、USART、SPI等這些寄存器的復位。
系統復位:這個復位會使整個芯片的所有電路都進行復位,系統默認的函數接口NVIC_SystemReset就是系統復位(位于core_cm*.h)。
1.NVIC_CoreReset內核復位
CM3 允許由軟件觸發復位序列,用于特殊的調試或維護目的。在CM3中,有兩種方法可以執行自我復位。第一種方法,是通過置位 NVIC 中應用程序中斷與復位控制寄存器(AIRCR)的VECTRESET 位(位偏移:0)。
這種復位的作用范圍覆蓋了整個CM3處理器中,除了調試邏輯之外的所有角落,但是它不會影響到 CM3 處理器外部的任何電路,所以單片機上的各片上外設和其它電路都不受影響。
C語言版函數:
void NVIC_CoreReset(void){__DSB(); //置位VECTRESET SCB->AIRCR = ((0x5FA << SCB_AIRCR_VECTKEY_Pos) | (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) |SCB_AIRCR_VECTRESET_Msk); __DSB(); while(1);}
匯編版函數:
__asm void NVIC_CoreReset_a(void){ LDR R0, =0xE000ED0C LDR R1, =0x05FA0001 //置位VECTRESET STR R1, [R0] deadloop_Core B deadloop_Core}
內核主要注意:
SCB_AIRCR_VECTRESET_Msk
LDR R1, =0x05FA0001
它是和系統復位唯一的區別。
2.NVIC_SysReset系統復位
系統復位是置位同一個寄存器中的 SYSRESETREQ 位。這種復位則會波及整個芯片上的電路:它會使 CM3 處理器把送往系統復位發生器的請求線置為有效。但是系統復位發生器不是CM3的一部分,而是由芯片廠商實現,因此不同的芯片對此復位的響應也不同。因此,讀者需要認真參閱該芯片規格書,明白當發生片內復位時,各外設和功能模塊都會回到什么樣的初始狀態,或者有哪些功能模塊不受影響(比如, STM32系列的芯片有后備存儲區,該區就被特殊對待)。
大多數情況下,復位發生器在響應 SYSRESETREQ 時,它也會同時把 CM3 處理器的系統復位信號(SYSRESETn)置為有效。通常, SYSRESETREQ 不應復位調試邏輯。
這里有一個要注意的問題:從 SYSRESETREQ 被置為有效,到復位發生器執行復位命令,往往會有一個延時。在此延時期間,處理器仍然可以響應中斷請求。但我們的本意往往是要讓此次執行到此為止,不要再做任何其它事情了。所以,最好在發出復位請求前,先把FAULTMASK置位。因此,我在提供源代碼中有這么一句:__set_FAULTMASK(1);,也就是置位FAULTMASK。
C語言版函數:
voidNVIC_SysReset(void){ __DSB(); SCB->AIRCR = ((0x5FA << SCB_AIRCR_VECTKEY_Pos) | (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | SCB_AIRCR_SYSRESETREQ_Msk); __DSB(); while(1);}
匯編版函數:
__asm void NVIC_SysReset_a(void){ LDR R0, =0xE000ED0C LDR R1, =0x05FA0004 STR R1, [R0] deadloop_Sys B deadloop_Sys}
內核復位與系統源代碼和相近,差異在于SYSRESETREQ和SYSRESETREQ這兩位。
關于復位的知識,在實際項目中應用的比較多。
-
STM32
+關注
關注
2270文章
10895瀏覽量
355744 -
引腳
+關注
關注
16文章
1193瀏覽量
50412 -
電復位
+關注
關注
0文章
5瀏覽量
6061
發布評論請先 登錄
相關推薦
評論