時(shí)間:2018-08-10 14:40:24來源:網(wǎng)絡(luò)轉(zhuǎn)載
說到復(fù)位,我們都不會(huì)陌生,系統(tǒng)基本都有一個(gè)復(fù)位按鍵。復(fù)位的種類有很多:上電復(fù)位、掉電復(fù)位、復(fù)位引腳復(fù)位、看門狗復(fù)位、軟件復(fù)位等。本文探討的就是在stm32中復(fù)位電路如何設(shè)計(jì)。
STM32介紹
STM32系列基于專為要求高性能、低成本、低功耗的嵌入式應(yīng)用專門設(shè)計(jì)的ARMCortex?-M0,M0+,M3,M4和M7內(nèi)核在STM32F105和STM32F107互連型系列微控制器之前,意法半導(dǎo)體已經(jīng)推出STM32基本型系列、增強(qiáng)型系列、USB基本型系列、互補(bǔ)型系列;新系列產(chǎn)品沿用增強(qiáng)型系列的72MHz處理頻率。內(nèi)存包括64KB到256KB閃存和20KB到64KB嵌入式SRAM。
新系列采用LQFP64、LQFP100和LFBGA100三種封裝,不同的封裝保持引腳排列一致性,結(jié)合STM32平臺(tái)的設(shè)計(jì)理念,開發(fā)人員通過選擇產(chǎn)品可重新優(yōu)化功能、存儲(chǔ)器、性能和引腳數(shù)量,以最小的硬件變化來滿足個(gè)性化的應(yīng)用需求。
stm32復(fù)位電路設(shè)計(jì)
復(fù)位電路的作用是為了是系統(tǒng)恢復(fù)到初始狀態(tài)的,單片機(jī)的復(fù)位方式也是存在好幾種的:上電復(fù)位,系統(tǒng)復(fù)位,備份區(qū)域復(fù)位
上電復(fù)位:其產(chǎn)生的條件是,當(dāng)系統(tǒng)上電、掉電,以及系統(tǒng)從待機(jī)模式返回時(shí),發(fā)生電源復(fù)位。電源復(fù)位能夠復(fù)位除了備份區(qū)域寄存器之外的所有寄存器的狀態(tài)。
系統(tǒng)復(fù)位:以下任一事件發(fā)生時(shí),均能產(chǎn)生一個(gè)系統(tǒng)復(fù)位:
1.NRST引腳上的低電平(外部復(fù)位)
2.窗口看門狗計(jì)數(shù)終止(WWDG復(fù)位)
3.獨(dú)立看門狗計(jì)數(shù)終止(IWDG復(fù)位)
4.軟件復(fù)位(SW復(fù)位)
5.低功耗管理復(fù)位
系統(tǒng)復(fù)位能夠復(fù)位除時(shí)鐘控制寄存器CRS中的復(fù)位標(biāo)志和備份區(qū)域中的寄存器之外的所有寄存器。
備份區(qū)域復(fù)位:對(duì)于備份區(qū)域的復(fù)位,一種是在軟件復(fù)位的時(shí)候設(shè)定備份區(qū)域控制寄存器中的對(duì)應(yīng)位產(chǎn)生的;另一種是當(dāng)電源和電池都掉電又重新上電時(shí)產(chǎn)生的。
平常我們常用的復(fù)位方式有兩種,一種是NRST引腳的低電平復(fù)位,通過按鍵復(fù)位電路給這個(gè)引腳一個(gè)低電平,讓系統(tǒng)完成復(fù)位,另一種大家都知道,那就是上電復(fù)位了,有時(shí)候是復(fù)位電路莫名失效了,有時(shí)是剛啟動(dòng)的時(shí)候,雖然用的沒有按鍵復(fù)位電路多,不過也算是很常用的一種復(fù)位方式了。按鍵復(fù)位電路直接給圖了,網(wǎng)上的講解可能把這電路圖都講爛了,我就不費(fèi)口舌了。
電容充電時(shí)間計(jì)算:T=1.1RC=1.1*10000*0.0000001=0.0011s=1.1ms
STM32內(nèi)核復(fù)位與系統(tǒng)復(fù)位
內(nèi)核復(fù)位與系統(tǒng)復(fù)位的區(qū)別
本文說的內(nèi)核是指處理器內(nèi)核,也就是MPU(MicroprocessorUnit)。比如STM32F103,其內(nèi)核就是Cortex-M3內(nèi)核。
而這里的系統(tǒng)就是包含內(nèi)核和外設(shè),也就是MCU(MicrocontrollerUnit),對(duì)于STM32F103來說,就是Cortex-M3內(nèi)核+各種外設(shè)接口。
內(nèi)核復(fù)位:只復(fù)位Cortex-M3處理器,而不復(fù)位外設(shè)如GPIO、TIM、USART、SPI等的寄存器。
系統(tǒng)復(fù)位:即復(fù)位Cortex-M3處理器,又復(fù)位外設(shè)寄存器。
因此,我們常說的復(fù)位一般指的是系統(tǒng)復(fù)位。
內(nèi)核復(fù)位與系統(tǒng)復(fù)位的函數(shù)源代碼
本文以Cortex-M3(STM32F103)為例來說明,其他芯片類似。
編寫了4個(gè)復(fù)位函數(shù),內(nèi)核復(fù)位(C語言)、內(nèi)核復(fù)位(匯編)和系統(tǒng)復(fù)位(C語言)、系統(tǒng)復(fù)位(匯編):
voidNVIC_CoreReset(void);//內(nèi)核復(fù)位(C語言)
voidNVIC_CoreReset_a(void);//內(nèi)核復(fù)位(匯編)
voidNVIC_SystemReset(void);//系統(tǒng)復(fù)位(C語言)
voidNVIC_SystemReset_a(void);//系統(tǒng)復(fù)位(匯編)
在ST官方庫(kù)中的core_cm3.h文件中已經(jīng)提供了NVIC_SystemReset的C語言源代碼。
Cortex-M3允許由軟件觸發(fā)復(fù)位序列,用于特殊的調(diào)試或維護(hù)。在Cortex-M3中,有兩種方法可以實(shí)現(xiàn)自我復(fù)位。
第一種方法:置位NVIC中應(yīng)用程序中斷與復(fù)位控制寄存器(AIRCR)的VECTRESET位(位偏移:0)。
NVIC_CoreReset內(nèi)核復(fù)位
這種復(fù)位的作用范圍覆蓋了整個(gè)Cortex-M3處理器,除了調(diào)試邏輯之外的所有角落,但是它不會(huì)影響到Cortex-M3處理器外部的任何電路,所以STM32上的各片上外設(shè)和其它電路都不受影響。
編寫的NVIC_CoreReset函數(shù)C語言源碼:
staTIc__INLINEvoidNVIC_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ù)源碼:
__asmvoidNVIC_CoreReset_a(void)
{
LDRR0,=0xE000ED0C
LDRR1,=0x05FA0001//置位VECTRESET
STRR1,[R0]
deadloop_Core
Bdeadloop_Core
}
內(nèi)核復(fù)位主要注意:SCB_AIRCR_VECTRESET_Msk和LDRR1,=0x05FA0001,這是和系統(tǒng)復(fù)位唯一的區(qū)別。
第二種方法:置位NVIC中應(yīng)用程序中斷與復(fù)位控制寄存器(AIRCR)的SYSRESETREQ位(位偏移:2)。
NVIC_SysReset系統(tǒng)復(fù)位
系統(tǒng)復(fù)位是置位同一個(gè)寄存器中的SYSRESETREQ位。這種復(fù)位則會(huì)波及整個(gè)芯片上的電路:它會(huì)使Cortex-M3處理器把送往系統(tǒng)復(fù)位發(fā)生器的請(qǐng)求線置為有效。但是系統(tǒng)復(fù)位發(fā)生器不是Cortex-M3的一部分,而是由芯片廠商實(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í)把Cortex-M3處理器的系統(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置位。可以采用下列匯編語句:__disable_fault_irq();。
core_cm3.h中提供的NVIC_SystemReset函數(shù)C語言源碼:
staTIc__INLINEvoidNVIC_SystemReset(void)
{
SCB->AIRCR=((0x5FA<
(SCB->AIRCR&SCB_AIRCR_PRIGROUP_Msk)|
SCB_AIRCR_SYSRESETREQ_Msk);
__DSB();/*EnsurecompleTIonofmemoryaccess/
while(1);/*waitunTIlreset*/
}
匯編版函數(shù):
__asmvoidNVIC_SysReset_a(void)
{
LDRR0,=0xE000ED0C
LDRR1,=0x05FA0004
STRR1,[R0]
deadloop_Sys
Bdeadloop_Sys
}
結(jié)語
某些系統(tǒng)允許復(fù)位,但對(duì)外設(shè)又有特殊要求:某一個(gè)IO狀態(tài)不能因?yàn)閺?fù)位而改變,某一個(gè)定時(shí)器計(jì)數(shù)器不能改變等。例子:A系統(tǒng)通過一個(gè)IO控制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ì)復(fù)位IO,不符合要求。如果有一種方式只復(fù)位內(nèi)核而不復(fù)位外設(shè)就好了。
關(guān)于stm32復(fù)位電路相關(guān)介紹就到這了,希望通過本文能讓你對(duì)stm32復(fù)位電路有更深的認(rèn)識(shí),如有不足之處還望海涵。
標(biāo)簽:
中國(guó)傳動(dòng)網(wǎng)版權(quán)與免責(zé)聲明:凡本網(wǎng)注明[來源:中國(guó)傳動(dòng)網(wǎng)]的所有文字、圖片、音視和視頻文件,版權(quán)均為中國(guó)傳動(dòng)網(wǎng)(m.u63ivq3.com)獨(dú)家所有。如需轉(zhuǎn)載請(qǐng)與0755-82949061聯(lián)系。任何媒體、網(wǎng)站或個(gè)人轉(zhuǎn)載使用時(shí)須注明來源“中國(guó)傳動(dòng)網(wǎng)”,違反者本網(wǎng)將追究其法律責(zé)任。
本網(wǎng)轉(zhuǎn)載并注明其他來源的稿件,均來自互聯(lián)網(wǎng)或業(yè)內(nèi)投稿人士,版權(quán)屬于原版權(quán)人。轉(zhuǎn)載請(qǐng)保留稿件來源及作者,禁止擅自篡改,違者自負(fù)版權(quán)法律責(zé)任。
產(chǎn)品新聞
更多>新品發(fā)布:CD300系列總線型伺服驅(qū)動(dòng)器
2024-10-31
2024-10-31
2024-10-31
新勢(shì)能 新期待|維智B1L直線伺服驅(qū)動(dòng)器
2024-10-31
纖薄之間,化繁為簡(jiǎn)|合信全新simple系...
2024-10-29
2024-10-18
推薦專題
更多>