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