整理:MilerShao 時(shí)不時(shí)會(huì)有人詢問(wèn)基于ARM CORTEX Mn 內(nèi)核的STM32各系列MCU芯片應(yīng)用開(kāi)發(fā)時(shí)開(kāi)、關(guān)總中斷的函數(shù)或指令的話題,尤其最近,頻繁有人問(wèn)起STM32F0系列 MCU關(guān)閉總中斷的問(wèn)題,其中有些人還是用過(guò)STM32F1系列芯片的,說(shuō)找不到相應(yīng)的函數(shù)。 隨著基于CORTEX Mn 各內(nèi)核的MCU芯片越來(lái)越多和相關(guān)編譯工具的升級(jí)換代,編譯工具在有關(guān)內(nèi)核指令操作的文檔安排及函數(shù)書寫等方面可能會(huì)發(fā)生些細(xì)微變化。 所以即使用過(guò)STM32F1系列產(chǎn)品的工程師,在使用較晚推出的STM32F0芯片開(kāi)發(fā)時(shí)發(fā)現(xiàn)那些跟內(nèi)核操作有關(guān)的指令或函數(shù)不知哪里去找了。以STM32各系列的標(biāo)準(zhǔn)固件庫(kù)為例,與內(nèi)核有關(guān)的指令及函數(shù)都可以在...\LIBRARIES\CMSIS\...后面目錄的相關(guān)文件里找到。于不同系列的標(biāo)準(zhǔn)固件庫(kù)中所對(duì)應(yīng)的子目錄及相關(guān)文件名略有差異。 一般來(lái)講,我們是不用或者說(shuō)用不著做總中斷的關(guān)閉動(dòng)作的,或許個(gè)別時(shí)刻可能真有需要。當(dāng)然也不排除部分人可能出于之前使用別的MCU開(kāi)發(fā)習(xí)慣或者好奇想知道怎么用。這里簡(jiǎn)單地分享下。 這個(gè)開(kāi)、關(guān)STM32芯片總中斷的指令,是針對(duì)ARM CORTEX內(nèi)核的操作指令。在各ARM內(nèi)核編程手冊(cè)上一定可以找到,但在STM32芯片相關(guān)技術(shù)手冊(cè)上是找不到的。開(kāi)、關(guān)總中斷的匯編指令分別就是CPSIE i、CPSID i,對(duì)于各個(gè)ARM CORTEX系列MCU芯片來(lái)說(shuō),都是一樣的。 
目前各編譯工具都把與內(nèi)核相關(guān)ARM指令根據(jù)指令功能將其中某一條或幾條匯編指令封裝為C函數(shù),函數(shù)名相對(duì)更為直觀、好記,方便用戶需要時(shí)拿來(lái)使用。比方在ARM MDK環(huán)境下,上面兩個(gè)開(kāi)關(guān)總中斷的指令封裝成如下2個(gè)內(nèi)嵌函數(shù)。 1、關(guān)閉【或禁用】總中斷的指令函數(shù): __attribute__( ( always_inline ) ) __STATIC_INLINE void __disable_irq(void) { __ASM volatile ("cpsid i" : : : "memory"); }
2、開(kāi)啟【或使能】總中斷的指令函數(shù)【芯片復(fù)位后總中斷時(shí)默認(rèn)打開(kāi)的,即使能的】: __attribute__( ( always_inline ) ) __STATIC_INLINE void __enable_irq(void) { __ASM volatile ("cpsie i" : : : "memory"); }
需要關(guān)閉總中斷時(shí),在用戶代碼里直接放置 __disable_irq( ); 需要開(kāi)啟總中斷時(shí),在用戶代碼里直接放置 __enable_irq( ); 。注意是下劃線是兩個(gè)橫杠。 |