說到復位,我們都不會陌生,系統(tǒng)基本都有一個復位按鍵。復位的種類有很多:上電復位、掉電復位、復位引腳復位、看門狗復位、軟件復位等。本文探討的就是在stm32中復位電路如何設(shè)計。
STM32介紹
STM32系列基于專為要求高性能、低成本、低功耗的嵌入式應(yīng)用專門設(shè)計的ARM Cortex?-M0,M0+,M3, M4和M7內(nèi)核在STM32F105和STM32F107互連型系列微控制器之前,意法半導體已經(jīng)推出STM32基本型系列、增強型系列、USB基本型系列、互補型系列;新系列產(chǎn)品沿用增強型系列的72MHz處理頻率。內(nèi)存包括64KB到256KB閃存和 20KB到64KB嵌入式SRAM。新系列采用LQFP64、LQFP100和LFBGA100三種封裝,不同的封裝保持引腳排列一致性,結(jié)合STM32平臺的設(shè)計理念,開發(fā)人員通過選擇產(chǎn)品可重新優(yōu)化功能、存儲器、性能和引腳數(shù)量,以最小的硬件變化來滿足個性化的應(yīng)用需求。
stm32復位電路設(shè)計?
復位電路的作用是為了是系統(tǒng)恢復到初始狀態(tài)的,單片機的復位方式也是存在好幾種的:上電復位,系統(tǒng)復位,備份區(qū)域復位
上電復位:其產(chǎn)生的條件是,當系統(tǒng)上電、掉電,以及系統(tǒng)從待機模式返回時,發(fā)生電源復位。電源復位能夠復位除了備份區(qū)域寄存器之外的所有寄存器的狀態(tài)。
系統(tǒng)復位:以下任一事件發(fā)生時,均能產(chǎn)生一個系統(tǒng)復位:
1. NRST引腳上的低電平(外部復位)
2. 窗口看門狗計數(shù)終止(WWDG復位)
3. 獨立看門狗計數(shù)終止(IWDG復位)
4. 軟件復位(SW復位)
5. 低功耗管理復位
系統(tǒng)復位能夠復位除時鐘控制寄存器CRS中的復位標志和備份區(qū)域中的寄存器之外的所有寄存器。
備份區(qū)域復位:對于備份區(qū)域的復位,一種是在軟件復位的時候設(shè)定備份區(qū)域控制寄存器中的對應(yīng)位產(chǎn)生的;另一種是當電源和電池都掉電又重新上電時產(chǎn)生的。
平常我們常用的復位方式有兩種,一種是NRST引腳的低電平復位,通過按鍵復位電路給這個引腳一個低電平,讓系統(tǒng)完成復位,另一種大家都知道,那就是上電復位了,有時候是復位電路莫名失效了,有時是剛啟動的時候,雖然用的沒有按鍵復位電路多,不過也算是很常用的一種復位方式了。按鍵復位電路直接給圖了,網(wǎng)上的講解可能把這電路圖都講爛了,我就不費口舌了。
電容充電時間計算:T = 1.1RC = 1.1 * 10000 * 0.0000001 = 0.0011s = 1.1ms
STM32 內(nèi)核復位 與 系統(tǒng)復位?
內(nèi)核復位與系統(tǒng)復位的區(qū)別
本文說的內(nèi)核是指處理器內(nèi)核,也就是MPU(Microprocessor Unit)。比如STM32F103,其內(nèi)核就是Cortex-M3內(nèi)核。
而這里的系統(tǒng)就是包含內(nèi)核和外設(shè),也就是MCU(Microcontroller Unit),對于STM32F103來說,就是Cortex-M3內(nèi)核+各種外設(shè)接口。
內(nèi)核復位:只復位Cortex-M3處理器,而不復位外設(shè)如GPIO、TIM、USART、SPI等的寄存器。
系統(tǒng)復位:即復位Cortex-M3處理器,又復位外設(shè)寄存器。
因此,我們常說的復位一般指的是系統(tǒng)復位。
內(nèi)核復位與系統(tǒng)復位的函數(shù)源代碼
本文以Cortex-M3(STM32F103)為例來說明,其他芯片類似。
編寫了4個復位函數(shù),內(nèi)核復位(C語言)、內(nèi)核復位(匯編)和系統(tǒng)復位(C語言)、系統(tǒng)復位(匯編):
? ? ? ?void NVIC_CoreReset(void); //內(nèi)核復位(C語言)
? ? ? ?void NVIC_CoreReset_a(void); //內(nèi)核復位(匯編)
? ? ? ?void NVIC_SystemReset(void); //系統(tǒng)復位(C語言)
? ? ? ?void NVIC_SystemReset_a(void); //系統(tǒng)復位(匯編)
在ST官方庫中的core_cm3.h文件中已經(jīng)提供了NVIC_SystemReset的C語言源代碼。
Cortex-M3允許由軟件觸發(fā)復位序列,用于特殊的調(diào)試或維護。在Cortex-M3中,有兩種方法可以實現(xiàn)自我復位。
第一種方法:置位 NVIC 中應(yīng)用程序中斷與復位控制寄存器(AIRCR)的 VECTRESET 位(位偏移:0)。
NVIC_CoreReset內(nèi)核復位
這種復位的作用范圍覆蓋了整個Cortex-M3處理器,除了調(diào)試邏輯之外的所有角落,但是它不會影響到Cortex-M3處理器外部的任何電路,所以STM32上的各片上外設(shè)和其它電路都不受影響。
編寫的NVIC_CoreReset函數(shù)C語言源碼:
static __INLINE 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)復位唯一的區(qū)別。
第二種方法:置位 NVIC 中應(yīng)用程序中斷與復位控制寄存器(AIRCR)的 SYSRESETREQ位(位偏移:2)。
NVIC_SysReset系統(tǒng)復位
系統(tǒng)復位是置位同一個寄存器中的?SYSRESETREQ?位。這種復位則會波及整個芯片上的電路:它會使Cortex-M3處理器把送往系統(tǒng)復位發(fā)生器的請求線置為有效。但是系統(tǒng)復位發(fā)生器不是Cortex-M3的一部分,而是由芯片廠商實現(xiàn),因此不同的芯片對此復位的響應(yīng)也不同。因此,讀者需要認真參閱芯片規(guī)格書,明白當發(fā)生片內(nèi)復位時,各外設(shè)和功能模塊都會回到什么樣的初始狀態(tài),或者有哪些功能模塊不受影響(比如,STM32系列的芯片有后備存儲區(qū),該區(qū)就被特殊對待)。
大多數(shù)情況下,復位發(fā)生器在響應(yīng) SYSRESETREQ 時,它也會同時把Cortex-M3處理器的系統(tǒng)復位信號(SYSRESETn)置為有效。通常,SYSRESETREQ不應(yīng)復位調(diào)試邏輯。
這里有一個要注意的問題:從SYSRESETREQ被置為有效到復位發(fā)生器執(zhí)行復位命令,往往會有一個延時。在此延時期間,處理器仍然可以響應(yīng)中斷請求。但我們的本意往往是要讓此次執(zhí)行到此為止,不要再做任何其它事情了。所以,最好在發(fā)出復位請求前,先把FAULTMASK置位??梢圆捎孟铝袇R編語句:__disable_fault_irq();。
core_cm3.h中提供的NVIC_SystemReset函數(shù)C語言源碼:
static __INLINE void NVIC_SystemReset(void)
{
SCB->AIRCR? = ((0x5FA << SCB_AIRCR_VECTKEY_Pos)? ? ? |?
(SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) |?
SCB_AIRCR_SYSRESETREQ_Msk);? ? ? ? ? ??
__DSB();? ? ?/* Ensure completion of memory access /?
while(1);? ? ?/* wait until reset */
}
匯編版函數(shù):
__asm void NVIC_SysReset_a(void)
{
LDR R0, =0xE000ED0C
LDR R1, =0x05FA0004
STR R1, [R0]
deadloop_Sys
B deadloop_Sys
}
結(jié)語
某些系統(tǒng)允許復位,但對外設(shè)又有特殊要求:某一個IO狀態(tài)不能因為復位而改變,某一個定時器計數(shù)器不能改變等。例子:A系統(tǒng)通過一個IO控制B系統(tǒng)的電源,而這個IO置高時才開啟B系統(tǒng)的電源。
正常工作過程中,B系統(tǒng)只有收到A系統(tǒng)關(guān)機命令任務(wù)才會進行關(guān)機(也就是說不能掉電關(guān)機),而A系統(tǒng)在工作過程中有復位的需求。
這個時候如果使用常規(guī)的復位方式,就會復位IO,不符合要求。如果有一種方式只復位內(nèi)核而不復位外設(shè)就好了。
關(guān)于stm32復位電路相關(guān)介紹就到這了,希望通過本文能讓你對stm32復位電路有更深的認識,如有不足之處還望海涵。
評論