Ⅰ寫在前面
某些系統(tǒng)允許復(fù)位,但對(duì)外設(shè)又有特殊要求:某一個(gè)IO狀態(tài)不能因?yàn)閺?fù)位而改變,某一個(gè)定時(shí)器計(jì)數(shù)器不能改變等。
例子:我一個(gè)A系統(tǒng)通過一個(gè)IO控制另一個(gè)B系統(tǒng)的電源,而這個(gè)IO置高時(shí)才開啟B系統(tǒng)的電源。
正常工作過程中,B系統(tǒng)只有收到A系統(tǒng)關(guān)機(jī)命令任務(wù)才會(huì)進(jìn)行關(guān)機(jī)(也就是說不能掉電關(guān)機(jī)),而A系統(tǒng)在工作過程中有復(fù)位的需求。
這個(gè)時(shí)候如果我使用常規(guī)的引腳復(fù)位,就會(huì)使IO置低,不符合要求,就需要使用到本文說到的內(nèi)核復(fù)位。
Ⅱ關(guān)于復(fù)位
說到復(fù)位,我們都不會(huì)陌生,學(xué)習(xí)時(shí),開發(fā)板上基本都有一個(gè)復(fù)位按鍵。
復(fù)位的種類有很多:上電復(fù)位、掉電復(fù)位、復(fù)位引腳復(fù)位、看門狗復(fù)位、軟件復(fù)位等。
上面說的復(fù)位按鍵,也就是對(duì)應(yīng)復(fù)位引腳復(fù)位;而本文說的內(nèi)核復(fù)位與系統(tǒng)復(fù)位是屬于軟件復(fù)位。
Ⅲ內(nèi)核與系統(tǒng)復(fù)位區(qū)別
本文說的內(nèi)核是指處理器內(nèi)核,拿STM32F1處理器來說,STM32F1的內(nèi)核就是Cortex-M3內(nèi)核,而這里的系統(tǒng)就是包含內(nèi)核和外設(shè)整個(gè)一起。
內(nèi)核復(fù)位:它會(huì)使Cortex-M3進(jìn)行復(fù)位,而不會(huì)影響其外設(shè),如GPIO、TIM、USART、SPI等這些寄存器的復(fù)位。
系統(tǒng)復(fù)位:這個(gè)復(fù)位會(huì)使整個(gè)芯片的所有電路都進(jìn)行復(fù)位,我們查看寄存器手冊(cè)時(shí),會(huì)發(fā)現(xiàn)某某某寄存器復(fù)位值等于多少。
因此,我們常說的復(fù)位一般指的就是系統(tǒng)復(fù)位。
Ⅳ內(nèi)核與系統(tǒng)復(fù)位應(yīng)用及代碼分析
本文拿CM3(STM32F1)進(jìn)行舉例說明,其他芯片類似。在下一節(jié)提供源代碼工程供大家參考學(xué)習(xí)。
本文提供的復(fù)位函數(shù)分:內(nèi)核和系統(tǒng)復(fù)位、C語言和匯編共四個(gè)版本(在一個(gè)工程),主要講解其4個(gè)函數(shù)。
void NVIC_CoreReset(void);
void NVIC_CoreReset_a(void);
void NVIC_SysReset(void);
void NVIC_SysReset_a(void);
本章節(jié)內(nèi)容可以參照Cotrex-M3權(quán)威指南中,Cotrex-M3其他特性章節(jié)下的自復(fù)位控制(軟件復(fù)位)。中文版位于第13張,英文版位于第14張。
同時(shí)結(jié)合core_cm3.h源代碼,其中系統(tǒng)復(fù)位中的C語言版就是core_cm3.h里面的源代碼。
1.NVIC_CoreReset內(nèi)核復(fù)位
CM3 允許由軟件觸發(fā)復(fù)位序列,用于特殊的調(diào)試或維護(hù)目的。在CM3中,有兩種方法可以執(zhí)行自我復(fù)位。第一種方法,是通過置位 NVIC 中應(yīng)用程序中斷與復(fù)位控制寄存器(AIRCR)的VECTRESET 位(位偏移:0)。
這種復(fù)位的作用范圍覆蓋了整個(gè)CM3處理器中,除了調(diào)試邏輯之外的所有角落,但是它不會(huì)影響到 CM3 處理器外部的任何電路,所以單片機(jī)上的各片上外設(shè)和其它電路都不受影響。
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)復(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ī)格書,明白當(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è)要注意的問題:從 SYSRESETREQ 被置為有效,到復(fù)位發(fā)生器執(zhí)行復(fù)位命令,往往會(huì)有一個(gè)延時(shí)。在此延時(shí)期間,處理器仍然可以響應(yīng)中斷請(qǐng)求。但我們的本意往往是要讓此次執(zhí)行到此為止,不要再做任何其它事情了。所以,最好在發(fā)出復(fù)位請(qǐng)求前,先把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
}
細(xì)心的朋友可能會(huì)發(fā)現(xiàn):
內(nèi)核復(fù)位與系統(tǒng)源代碼和相近,差異在于SYSRESETREQ和SYSRESETREQ這兩位。
C語言版本的代碼和core_cm3.h中NVIC_SystemReset函數(shù)相似。對(duì)的這個(gè)函數(shù)就是系統(tǒng)復(fù)位函數(shù),而我們的內(nèi)核復(fù)位只是簡(jiǎn)單修改了一下。
3.main函數(shù)應(yīng)用
Main函數(shù)中主要以LED1和LED2兩個(gè)IO來說明。
LED1作為"標(biāo)志燈": 上電"標(biāo)志"置為高;
LED2作為指示燈:看從內(nèi)核啟動(dòng)改變狀態(tài)沒有。
請(qǐng)?jiān)趍ain函數(shù)中應(yīng)用不同的配置進(jìn)行測(cè)試:
#if 0 /* 內(nèi)核復(fù)位 */
NVIC_CoreReset();
// NVIC_CoreReset_a();
#else /* 系統(tǒng)復(fù)位 */
NVIC_SysReset();
// NVIC_SysReset_a();
#endif
Ⅴ下載
Cotrex-M3權(quán)威指南:
http://pan.baidu.com/s/1mhQYa1q
本文講解的源代碼工程(STM32F103ZE(Keil)_Reset):
http://pan.baidu.com/s/1hskScba
提示:如果網(wǎng)盤鏈接失效,可以微信公眾號(hào)“底部菜單”查看更新鏈接。
-
內(nèi)核
+關(guān)注
關(guān)注
4文章
1467瀏覽量
42873 -
STM32
+關(guān)注
關(guān)注
2309文章
11162瀏覽量
373414 -
復(fù)位
+關(guān)注
關(guān)注
0文章
179瀏覽量
25045 -
定時(shí)器計(jì)數(shù)器
+關(guān)注
關(guān)注
0文章
3瀏覽量
1143
發(fā)布評(píng)論請(qǐng)先 登錄
MAX6443–MAX6452:具備長(zhǎng)手動(dòng)復(fù)位設(shè)置周期的微處理器復(fù)位電路
智多晶MCU硬核IP全面升級(jí)|CM3和STAR新特性介紹
Microchip TCM809/TCM810:高效的3引腳微控制器復(fù)位監(jiān)控器
CW32在不同復(fù)位方式對(duì)應(yīng)的復(fù)位范圍
什么是內(nèi)核LOCKUP故障復(fù)位?
CW32F030支持的6種系統(tǒng)復(fù)位方式分享
內(nèi)核LOCKUP故障復(fù)位方法
用于穩(wěn)定電源設(shè)計(jì)的復(fù)位IC應(yīng)用實(shí)例
揭秘RESET復(fù)位鍵:引腳設(shè)計(jì)如何支撐硬件系統(tǒng)的重啟通路
GraniStudio:軸復(fù)位例程
GraniStudio零代碼平臺(tái)軸復(fù)位算子支持多少個(gè)軸同時(shí)復(fù)位,有哪些回零模式?
復(fù)位電路的核心功能和主要類型
LM3724系列 低功率電壓監(jiān)控和復(fù)位IC,帶手動(dòng)復(fù)位功能數(shù)據(jù)手冊(cè)
RT1170EVKB如何設(shè)置CM7和CM4內(nèi)核來實(shí)現(xiàn)它們自己的看門狗外設(shè)?
復(fù)位電路的作用、控制方式和類型
CM3(STM32) 內(nèi)核復(fù)位與系統(tǒng)復(fù)位區(qū)別及應(yīng)用
評(píng)論