stm32關全域性中斷和開全域性中斷有多種方法,分別操作primask、faultmask和basepri暫存器。
注:完整資料請檢視cortex-m3權威指南中的nvic與中斷控制一節。
中斷相關暫存器(注:以下**為安富萊stm32 freertos裡文件的)
暫存器名字
暫存器功能描述
primask這是個只有 1 個 bit 的暫存器。 在它被置 1 後,就關掉所有可遮蔽的異常,只剩下nmi 和硬 fault 可以響應。它的預設值是 0,表示沒有關中斷。
faultmask這是個只有 1 個 bit 的暫存器。當它置 1 時,只有 nmi 才能響應,所有其它的異常,甚至是硬 fault,也通通閉嘴。它的預設值也是 0,表示沒有關異常。
basepri這個暫存器最多有 9 位(由表達優先順序的位數決定)。它定義了被遮蔽優先順序的閾值。當它被設成某個值後,所有優先順序號大於等於此值的中斷都被關(優先順序號越大,優先順序越低)。但若被設成 0,則不關閉任何中斷, 0 也是預設值
第一種方法,:操作primask暫存器
__set_primask(0) /* 使能全域性中斷 */
__set_primask(1) /* 禁止全域性中斷*/
或者__enable_irq(); /* 使能全域性中斷 */
__disable_irq(); /* 禁止全域性中斷*/
(在core_cm3.h和core_cmfunc.h)
該函式操作的是primask暫存器,primask 用於除能在 nmi 和硬 fault 之外的所有異常,它有效地把當前優先順序改為 0 (可程式設計優先順序中的最高優先順序)。該暫存器可以通過 mrs 和 msr 以下例方式訪問
1. 關中斷
mov r0, #1
msr primask, r0
2. 開中斷
mov r0, #0
msr primask, r0
第二種方法:操作faultmask暫存器
__set_faultmask(0); /* 使能全域性中斷*/
__set_faultmask(1) /* 禁止全域性中斷*/
該函式操作faultmask暫存器,faultmask更絕,它把當前優先順序改為‐1。這麼一來,連硬fault都被掩蔽了。使用方案
與primask的相似。但要注意的是,faultmask會在異常退出時自動清零。
第三種方法:操作basepri暫存器
__static_inline void __set_basepri(uint32_t basepri)
該函式操作的是basepri暫存器,在更精巧的設計中,需要對中斷掩蔽進行更細膩的控制——只掩蔽優先順序低於某一閾值的中斷——它們的優先順序在數字上大於等於某個數。那麼這個數儲存在**?就儲存在basepri中。不過,如果往basepri中寫0,則另當別論——basepri將停止掩蔽任何中斷。例如,如果你需要掩蔽所有優先順序不高於0x60的中斷,則可以如下程式設計:
__set_basepri(0x60);
STM32外部中斷
一 基本概念 arm coetex m3核心共支援256個中斷,其中16個內部中斷,240個外部中斷和可程式設計的256級中斷優先順序的設定。stm32目前支援的中斷共84個 16個內部 68個外部 還有16級可程式設計的中斷優先順序的設定,僅使用中斷優先順序設定8bit中的高4位。stm32可支援...
stm32外部中斷
外部中斷程式配置流程 rcc 時鐘配置 void rcc configuration void 時鐘配置 開啟各路時鐘 rcc apb2periphclockcmd rcc apb2periph usart1 rcc apb2periph gpioa rcc apb2periph afio,enab...
stm32外部中斷
好久沒玩微控制器了,最近閒著沒事想拿出來玩玩,沒想到乙個stm32的外部中斷讓我花費了兩天時間,好的的挫折啊!終於下午除錯成功,下面來說一下我的除錯之路吧!硬體就是兩個按鍵,四個led,led事共陽極接法,按鍵一端接地一端接gpio口,通過按鍵中斷控制led。程式寫好以後發現始終無法進入中斷,開始查...