Ⅰ寫在前面
某些系統(tǒng)允許復位,但對外設又有特殊要求:某一個IO狀態(tài)不能因為復位而改變,某一個定時器計數(shù)器不能改變等。
例子:我一個A系統(tǒng)通過一個IO控制另一個B系統(tǒng)的電源,而這個IO置高時才開啟B系統(tǒng)的電源。
正常工作過程中,B系統(tǒng)只有收到A系統(tǒng)關機命令任務才會進行關機(也就是說不能掉電關機),而A系統(tǒng)在工作過程中有復位的需求。
這個時候如果我使用常規(guī)的引腳復位,就會使IO置低,不符合要求,就需要使用到本文說到的內(nèi)核復位。
Ⅱ關于復位
說到復位,我們都不會陌生,學習時,開發(fā)板上基本都有一個復位按鍵。
復位的種類有很多:上電復位、掉電復位、復位引腳復位、看門狗復位、軟件復位等。
上面說的復位按鍵,也就是對應復位引腳復位;而本文說的內(nèi)核復位與系統(tǒng)復位是屬于軟件復位。
Ⅲ內(nèi)核與系統(tǒng)復位區(qū)別
本文說的內(nèi)核是指處理器內(nèi)核,拿STM32F1處理器來說,STM32F1的內(nèi)核就是Cortex-M3內(nèi)核,而這里的系統(tǒng)就是包含內(nèi)核和外設整個一起。
內(nèi)核復位:它會使Cortex-M3進行復位,而不會影響其外設,如GPIO、TIM、USART、SPI等這些寄存器的復位。
系統(tǒng)復位:這個復位會使整個芯片的所有電路都進行復位,我們查看寄存器手冊時,會發(fā)現(xiàn)某某某寄存器復位值等于多少。
因此,我們常說的復位一般指的就是系統(tǒng)復位。
Ⅳ內(nèi)核與系統(tǒng)復位應用及代碼分析
本文拿CM3(STM32F1)進行舉例說明,其他芯片類似。在下一節(jié)提供源代碼工程供大家參考學習。
本文提供的復位函數(shù)分:內(nèi)核和系統(tǒng)復位、C語言和匯編共四個版本(在一個工程),主要講解其4個函數(shù)。
void NVIC_CoreReset(void);
void NVIC_CoreReset_a(void);
void NVIC_SysReset(void);
void NVIC_SysReset_a(void);
本章節(jié)內(nèi)容可以參照Cotrex-M3權威指南中,Cotrex-M3其他特性章節(jié)下的自復位控制(軟件復位)。中文版位于第13張,英文版位于第14張。
同時結(jié)合core_cm3.h源代碼,其中系統(tǒng)復位中的C語言版就是core_cm3.h里面的源代碼。
1.NVIC_CoreReset內(nèi)核復位
CM3 允許由軟件觸發(fā)復位序列,用于特殊的調(diào)試或維護目的。在CM3中,有兩種方法可以執(zhí)行自我復位。第一種方法,是通過置位 NVIC 中應用程序中斷與復位控制寄存器(AIRCR)的VECTRESET 位(位偏移:0)。
這種復位的作用范圍覆蓋了整個CM3處理器中,除了調(diào)試邏輯之外的所有角落,但是它不會影響到 CM3 處理器外部的任何電路,所以單片機上的各片上外設和其它電路都不受影響。
C語言版函數(shù):
voidNVIC_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ū)別。
2.NVIC_SysReset系統(tǒng)復位
系統(tǒng)復位是置位同一個寄存器中的 SYSRESETREQ 位。這種復位則會波及整個芯片上的電路:它會使 CM3 處理器把送往系統(tǒng)復位發(fā)生器的請求線置為有效。但是系統(tǒng)復位發(fā)生器不是CM3的一部分,而是由芯片廠商實現(xiàn),因此不同的芯片對此復位的響應也不同。因此,讀者需要認真參閱該芯片規(guī)格書,明白當發(fā)生片內(nèi)復位時,各外設和功能模塊都會回到什么樣的初始狀態(tài),或者有哪些功能模塊不受影響(比如, STM32系列的芯片有后備存儲區(qū),該區(qū)就被特殊對待)。
大多數(shù)情況下,復位發(fā)生器在響應 SYSRESETREQ 時,它也會同時把 CM3 處理器的系統(tǒng)復位信號(SYSRESETn)置為有效。通常, SYSRESETREQ 不應復位調(diào)試邏輯。
這里有一個要注意的問題:從 SYSRESETREQ 被置為有效,到復位發(fā)生器執(zhí)行復位命令,往往會有一個延時。在此延時期間,處理器仍然可以響應中斷請求。但我們的本意往往是要讓此次執(zhí)行到此為止,不要再做任何其它事情了。所以,最好在發(fā)出復位請求前,先把FAULTMASK置位。因此,我在提供源代碼中有這么一句:__set_FAULTMASK(1);,也就是置位FAULTMASK。
C語言版函數(shù):
void NVIC_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
}
細心的朋友可能會發(fā)現(xiàn):
內(nèi)核復位與系統(tǒng)源代碼和相近,差異在于SYSRESETREQ和SYSRESETREQ這兩位。
C語言版本的代碼和core_cm3.h中NVIC_SystemReset函數(shù)相似。對的這個函數(shù)就是系統(tǒng)復位函數(shù),而我們的內(nèi)核復位只是簡單修改了一下。
3.main函數(shù)應用
Main函數(shù)中主要以LED1和LED2兩個IO來說明。
LED1作為"標志燈": 上電"標志"置為高;
LED2作為指示燈:看從內(nèi)核啟動改變狀態(tài)沒有。
請在main函數(shù)中應用不同的配置進行測試:
#if 0 /* 內(nèi)核復位 */
NVIC_CoreReset();
// NVIC_CoreReset_a();
#else /* 系統(tǒng)復位 */
NVIC_SysReset();
// NVIC_SysReset_a();
#endif
Ⅴ下載
Cotrex-M3權威指南:
http://pan.baidu.com/s/1mhQYa1q
本文講解的源代碼工程(STM32F103ZE(Keil)_Reset):
http://pan.baidu.com/s/1hskScba
提示:如果網(wǎng)盤鏈接失效,可以微信公眾號“底部菜單”查看更新鏈接。
-
內(nèi)核
+關注
關注
3文章
1372瀏覽量
40276 -
STM32
+關注
關注
2270文章
10895瀏覽量
355731 -
復位
+關注
關注
0文章
171瀏覽量
24211 -
定時器計數(shù)器
+關注
關注
0文章
3瀏覽量
1045
發(fā)布評論請先 登錄
相關推薦
評論