使用中斷之前,第一步要了解的是其優先順序管理,下面總結一下stm32 nvic的中斷優先順序管理。(正點原子系列)
以smt32f103系列為例,其具有16個核心中斷和60個可遮蔽中斷。
下面介紹其庫函式的開發:
mdk內與nvic相關的暫存器包含在結構體中,通過建立結構體,配置其內部組成員也就是暫存器,來配置nvic各個配置。
先介紹其結構體的內部內容:在結構體內有介紹!
[ ]內的8表示有8個這樣的暫存器!
typedef struct
nvic_type;
將中斷分為5組,每組有對應的搶占優先順序和子優先順序。
由暫存器scb->aircr暫存器的位8-10來定義的!具體配置參考下圖:
關於優先順序,注意一下兩點:
這裡需要注意兩點:第一,如果個中斷的搶占優先順序和響應都是樣話則看哪個中斷先發生就先執行;第二,高優先順序的搶占優先順序是可以打斷正在進行的低搶占優先順序中斷的。而搶占優先順序相同的中斷,高優先順序的響應優先順序不可以打斷低響應優先順序的中斷。
以上就是原理的一點總結了,下面到使用中斷時庫函式的配置:
配置中斷三步走:
第一!分組配置優先順序在aircr中的分配位數!
第二!配置結構體內需要用到的成員 、什麼中斷 、什麼搶占優先順序、 什麼子優先順序 、是否使能 !
第三!將結構體首位址傳入,裝載配置!
分組
void nvic_prioritygroupconfig(uint32_t nvic_prioritygroup)
//is_nvic_priority_group詳解
#define is_nvic_priority_group(group) (((group) == nvic_prioritygroup_0) || \
((group) == nvic_prioritygroup_1) || \
((group) == nvic_prioritygroup_2) || \
((group) == nvic_prioritygroup_3) || \
((group) == nvic_prioritygroup_4))
中斷的分組直接通過void nvic_prioritygroupconfig(uint32_t nvic_prioritygroup)傳參傳入nvic_prioritygroup_x對應的值就行。
配置通過結構體配置(如下)
typedef struct
nvic_inittypedef;
傳入引數
通過下面函式傳址,把配置的結構體傳入暫存器中,
void nvic_init(nvic_inittypedef* nvic_initstruct)
比如我們要使能串列埠 1 的中斷,同時設定搶占優先順序為 1,子優先順序位 2,初始化的方法是(分組省去):
nvic_inittypedef nvic_initstructure;
nvic_initstructure.nvic_irqchannel = usart1_irqn; //串列埠 1 中斷
nvic_initstructure.nvic_irqchannelpreemptionpriority=1 ; // 搶占優先順序為 1
nvic_initstructure.nvic_irqchannelsubpriority = 2; // 子優先順序位 2
nvic_initstructure.nvic_irqchannelcmd = enable; //irq 通道使能
nvic_init(&nvic_initstructure); //根據上面指定的引數初始化 nvic 暫存器
over!
NVIC中斷優先順序管理
1.stm32的中斷分組 每個中斷設定乙個搶占優先順序和乙個響應優先順序值,分組配置是在暫存器scb aircr中配置。注意 一般情況下,系統 執行過程中,只設定一次中斷優先順序分組 數值越小所代表的優先順序就越高。1 高優先順序的搶占優先順序可以打斷正在進行的低搶占優先順序中斷的。2 搶占優先順序...
NVIC中斷優先順序管理
1 參考資料 stm32f1開發指南 庫函式版本 4.5 小節 中斷優先順序分組管理 stm32中文參考手冊v10 第9章 中斷和事件 2 nvic中斷優先順序分組 cm3核心支援256個中斷,其中包含了16個核心中斷和240個外部中斷,並且具有256級的可程式設計中斷設定。stm32並沒有使用cm...
NVIC中斷優先順序管理
首先,對 stm32 中斷進行分組,組 0 4。同時,對每個中斷設定乙個搶占優先順序和乙個響應優先順序值。分組配置是在暫存器 scb aircr 中配置 組 aircr 10 8 ip bit 7 4 分配情況 分配結果 0 111 0 4 0位搶占優先順序,4位響應優先順序 1 110 1 3 1...