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