CM3(STM32)內核復位與系統復位區別及應用

ARM 300瀏覽

相關標題:STM32軟件復位 ?、?Cortex - M芯片軟件內核復位 ?、 ?STM32系統復位

為方便大家閱讀,本文內容已經整理成PDF文件:

http://pan.baidu.com/s/1gfHygyn

Ⅰ、寫在前面

某些系統允許復位,但對外設又有特殊要求:某一個IO狀態不能因為復位而改變,某一個定時器計數器不能改變等。

?

例子:我一個A系統通過一個IO控制另一個B系統的電源,而這個IO置高時才開啟B系統的電源。

正常工作過程中,B系統只有收到A系統關機命令任務才會進行關機(也就是說不能掉電關機),而A系統在工作過程中有復位的需求。

?

這個時候如果我使用常規的引腳復位,就會使IO置低,不符合要求,就需要使用到本文說到的內核復位

?

Ⅱ、關于復位

說到復位,我們都不會陌生,學習時,開發板上基本都有一個復位按鍵

?

復位的種類有很多:上電復位、掉電復位、復位引腳復位、看門狗復位、軟件復位等。

?

上面說的復位按鍵,也就是對應復位引腳復位;而本文說的內核復位系統復位是屬于軟件復位

?

?

Ⅲ、內核與系統復位區別

本文說的內核是指處理器內核,拿STM321處理器來說,STM32F1的內核就是Cortex-M3內核,而這里的系統就是包含內核和外設整個一起。

?

內核復位:它會使Cortex-M3進行復位,而不會影響其外設,如GPIOTIMUSARTSPI等這些寄存器的復位。

?

系統復位:這個復位會使整個芯片的所有電路都進行復位,我們查看寄存器手冊時,會發現某某某寄存器復位值等于多少。

?

因此,我們常說的復位一般指的就是系統復位。

?

Ⅳ、內核與系統復位應用及代碼分析

本文拿CM3STM32F1)進行舉例說明,其他芯片類似。在下一節提供源代碼工程供大家參考學習。

本文提供的復位函數分:內核和系統復位C語言和匯編共四個版本(在一個工程),主要講解其4個函數:

void NVIC_CoreReset(void);

void NVIC_CoreReset_a(void);

?

void NVIC_SysReset(void);

void NVIC_SysReset_a(void);

?

本章節內容可以參照Cotrex-M3權威指南中,Cotrex-M3其他特性章節下的自復位控制(軟件復位)。中文版位于第13張,英文版位于第14張。

同時結合core_cm3.h源代碼,其中系統復位中的C語言版就是core_cm3.h里面的源代碼。

?

1.NVIC_CoreReset內核復位

CM3 允許由軟件觸發復位序列,用于特殊的調試或維護目的。在CM3中,有兩種方法可以執行自我復位。第一種方法,是通過置位 NVIC 中應用程序中斷與復位控制寄存器(AIRCR)VECTRESET 位(位偏移:0)。

這種復位的作用范圍覆蓋了整個CM3處理器中,除了調試邏輯之外的所有角落,但是它不會影響到 CM3 處理器外部的任何電路,所以單片機上的各片上外設和其它電路都不受影響。

?

C語言版函數:

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);

}

?

匯編版函數:

__asm void NVIC_CoreReset_a(void)

{

??LDR R0, =0xE000ED0C

??LDR R1, =0x05FA0001 ?//置位VECTRESET

??STR R1, [R0]

deadloop_Core

??B deadloop_Core

}

?

內核主要注意:SCB_AIRCR_VECTRESET_MskLDR R1, =0x05FA0001,它是和系統復位唯一的區別。

?

2.NVIC_SysReset系統復位

系統復位是置位同一個寄存器中的 SYSRESETREQ 位。這種復位則會波及整個芯片上的電路:它會使 CM3 處理器把送往系統復位發生器的請求線置為有效。但是系統復位發生器不是CM3的一部分,而是由芯片廠商實現,因此不同的芯片對此復位的響應也不同。因此,讀者需要認真參閱該芯片規格書,明白當發生片內復位時,各外設和功能模塊都會回到什么樣的初始狀態,或者有哪些功能模塊不受影響(比如, STM32系列的芯片有后備存儲區,該區就被特殊對待)。

?

大多數情況下,復位發生器在響應 SYSRESETREQ 時,它也會同時把 CM3 處理器的系統復位信號(SYSRESETn)置為有效。通常, SYSRESETREQ 不應復位調試邏輯。

?

這里有一個要注意的問題:從 SYSRESETREQ 被置為有效,到復位發生器執行復位命令,往往會有一個延時。在此延時期間,處理器仍然可以響應中斷請求。但我們的本意往往是要讓此次執行到此為止,不要再做任何其它事情了。所以,最好在發出復位請求前,先把FAULTMASK置位。因此,我在提供源代碼中有這么一句:__set_FAULTMASK(1);,也就是置位FAULTMASK

?

C語言版函數:

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);

}

?

匯編版函數:

__asm void NVIC_SysReset_a(void)

{

??LDR R0, =0xE000ED0C

??LDR R1, =0x05FA0004

??STR R1, [R0]

deadloop_Sys

??B deadloop_Sys

}

細心的朋友可能會發現:

1.內核復位與系統源代碼和相近,差異在于SYSRESETREQSYSRESETREQ這兩位。

2.C語言版本的代碼和core_cm3.hNVIC_SystemReset函數相似。對的這個函數就是系統復位函數,而我們的內核復位只是簡單修改了一下。

?

3.main函數應用

Main函數中主要以LED1LED2兩個IO來說明。

LED1作為"標志燈": 上電"標志"置為高;

LED2作為指示燈:看從內核啟動改變狀態沒有。

?

請在main函數中應用不同的配置進行測試:

#if 0 /* 內核復位 */

????NVIC_CoreReset();

// ?NVIC_CoreReset_a();

?

#else /* 系統復位 */

????NVIC_SysReset();

// ?NVIC_SysReset_a();

#endif

?

Ⅴ、代碼下載

Cotrex-M3權威指南:

http://pan.baidu.com/s/1mhQYa1q

?

本文源代碼工程(STM32F103ZEKeil_Reset):

http://pan.baidu.com/s/1hskScba

?

提示:如果網盤鏈接失效,可以微信公眾號“底部菜單”查看更新鏈接。

?

Ⅵ、最后

微信搜索EmbeddDeveloper” 或者掃描下面二維碼、關注,查看更多精彩內容!

?

七星彩走势图2元网官网