STM32關全域性中斷開全域性中斷多種方式

2021-09-12 04:11:07 字數 1536 閱讀 3064

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。程式寫好以後發現始終無法進入中斷,開始查...