0x01 > 什么是中斷
所謂中斷就是指CPU正處于工作狀態(tài)時,外部發(fā)生了某一事件(按鍵按下),請求CPU進行處理,于是 CPU暫時中斷當前的工作,轉(zhuǎn)而處理所發(fā)生的的事件,處理完畢在回到原來被中斷的地方繼續(xù)工作,這樣的過程被稱為中斷
中斷示意圖
中斷包括以下幾部分
中斷源
中斷申請
開放中斷
保護現(xiàn)場
中斷服務
恢復現(xiàn)場
中斷返回
我們知道 傳統(tǒng)的51單片機一共有 5 個中斷源,它們分別為:
外部中斷0
定時器0
外部中斷1
定時器1
現(xiàn)在正在學習的 STM32 有多少中斷呢?
0x02 > STM32 中斷基礎知識
Cortex-m3支持256個中斷,其中包含了16個內(nèi)核中斷,240個外部中斷。
STM32 只有84個中斷,包括16個內(nèi)核中斷和68個可屏蔽中斷
STM32 上只有60個可屏蔽中斷,f107上才有68個中斷
先占優(yōu)先級也就是搶占優(yōu)先級,概念等同于51單片機中的中斷。假設有兩中斷先后觸發(fā),已經(jīng)在執(zhí)行的中斷先占優(yōu)先級如果沒有后觸發(fā)的中斷 先占優(yōu)先級更高,就會先處理先占優(yōu)先級高的中斷。也就是說又有較高的先占優(yōu)先級的中斷可以打斷先占優(yōu)先級較低的中斷。這是實現(xiàn)中斷嵌套的基礎。
次占優(yōu)先級,也就是響應優(yōu)先級,只在同一先占優(yōu)先級的中斷同時觸發(fā)時起作用,先占優(yōu)先級相同,則優(yōu)先執(zhí)行次占優(yōu)先級較高的中斷。次占優(yōu)先級不會造成中斷嵌套。 如果中斷的兩個優(yōu)先級都一致,則優(yōu)先執(zhí)行位于中斷向量表中位置較高的中斷。
? 0x001 >> 嵌套向量中斷控制器 (NVIC)
? ? STM32 的中斷既然有這么多,那么要怎么管理呢?
ST也給了我們一些解決方案就是 使用 嵌套中斷向量控制器 NVIC,NVIC屬于內(nèi)核級的寄存器,所以當我們需要查詢 NVIC 相關定義 應該到 core_cm3.h 中(這里講解的芯片是 STM32F103ZE 是基于 Coretex-M3)
/* 訪問嵌套向量中斷控制器 (NVIC)的結(jié)構類型 */
typedef struct
{
__IOM uint32_t ISER[8U]; /* 中斷使能寄存器 */
uint32_t RESERVED0[24U];
__IOM uint32_t ICER[8U]; /* 中斷清除寄存器 */
uint32_t RSERVED1[24U];
__IOM uint32_t ISPR[8U]; /* 中斷懸起寄存器 */
uint32_t RESERVED2[24U];
__IOM uint32_t ICPR[8U]; /* 中斷清空懸起寄存器 */
uint32_t RESERVED3[24U];
__IOM uint32_t IABR[8U]; /* 中斷有效位寄存器 */
uint32_t RESERVED4[56U];
__IOM uint8_t IP[240U]; /* 中斷優(yōu)先級寄存器(8Bit wide) */
uint32_t RESERVED5[644U];
__OM uint32_t STIR; /* 軟件觸發(fā)中斷寄存器 */
} NVIC_Type;
? 0x002 >> 中斷優(yōu)先級定義 ☆
中斷優(yōu)先級設定寄存器
coretex-M3 內(nèi)核的中斷定義寄存器的寬度是8位的,在上圖中,我們能看到ST在設計中斷的時候只使用了高4位 [7:4]
The processor implements only bits[7:4] of each field, bits[3:0] read as zero and ignore writes.
處理器只實現(xiàn)每個字段的位[7:4],位[3:0]讀為零,忽略寫。
ST在上述分組中,ST還將中斷分成了主優(yōu)先級(搶占優(yōu)先級)和子優(yōu)先級(響應優(yōu)先級)。對應的寄存器
優(yōu)先級分組寄存器
優(yōu)先級組
上圖就是,優(yōu)先級分組寄存器和對應的優(yōu)先級分組,下面來簡單的總結(jié)一下優(yōu)先級分組怎么用。
優(yōu)先級分組
/* LL 庫中斷優(yōu)先級分組,選項和實現(xiàn) */
#define NVIC_PRIORITYGROUP_0 ((uint32_t)0x00000007) /*!< 0 bit for pre-emption priority,
4 bits for subpriority */
#define NVIC_PRIORITYGROUP_1 ((uint32_t)0x00000006) /*!< 1 bit for pre-emption priority,
3 bits for subpriority */
#define NVIC_PRIORITYGROUP_2 ((uint32_t)0x00000005) /*!< 2 bits for pre-emption priority,
2 bits for subpriority */
#define NVIC_PRIORITYGROUP_3 ((uint32_t)0x00000004) /*!< 3 bits for pre-emption priority,
1 bit for subpriority */
#define NVIC_PRIORITYGROUP_4 ((uint32_t)0x00000003) /*!< 4 bits for pre-emption priority,
0 bit for subpriority */
/**
brief Set Priority Grouping
details Sets the priority grouping field using the required unlock sequence.
The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field.
Only values from 0..7 are used.
In case of a conflict between priority grouping and available
priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set.
param [in] PriorityGroup Priority grouping field.
*/
__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup)
{
uint32_t reg_value;
uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */
reg_value = SCB->AIRCR; /* read old register configuration */
reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */
reg_value = (reg_value |
((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) |
(PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */
SCB->AIRCR = reg_value;
}
假設我們有兩個外設 外設A 和外設B 我們將 兩個外設的主優(yōu)先級都配置為 0,將外設 A 的子優(yōu)先級配置為 1,外設 B 的子優(yōu)先級配置為 2,。當它們的中斷請求同時到來時,內(nèi)核將如何執(zhí)行?
內(nèi)核將比較兩個外設的主優(yōu)先級,如果外設的主優(yōu)先級相等,就會對子優(yōu)先級進行比較,子優(yōu)先級越高,子優(yōu)先級的數(shù)字就越小。
令人頭痛的問題,如果外設的主優(yōu)先級、子優(yōu)先級都相同,怎么判斷?
如果外設的主優(yōu)先級和子優(yōu)先級都相等,那么將會對硬件中斷編號進行比較
硬件編號在哪?
硬件編號 位于 《STM32 中文參考手冊_V10》第九章 中斷和事件 第9.1.2小節(jié) 中斷和異常向量表
0x03 > 總結(jié)
以上就是 關于 STM32F103ZE 的外部中斷與中斷管理的理論部分。這篇文章可能會讓你感到晦澀難懂,或者有漏洞,那是在所難免的問題。
上一篇:STM32代碼的啟動過程
下一篇:如何在 VScode 創(chuàng)建 stm32 項目?
推薦閱讀最新更新時間:2025-05-02 10:51




設計資源 培訓 開發(fā)板 精華推薦
- LTC3615IUF-1 雙路 4MHz、3A 同步降壓型 DC/DC 轉(zhuǎn)換器的典型應用
- LT6556 的典型應用 - 1 個三重 2:1 視頻多路復用器的 750MHz 增益
- C8051F989DK,用于工業(yè)應用的 C8051F989 8051 微控制器的開發(fā)系統(tǒng)
- RT8561A 1MHz、20mA 滿量程電流模擬調(diào)光控制的典型應用
- 用于 FPF1204 電源開關的 FPF120x 評估板
- LT1579CS 的典型應用電路附加邏輯迫使 LT1579 進入關斷狀態(tài)以保護輸入電池
- LTC1294單片機12位數(shù)據(jù)采集系統(tǒng)典型應用
- 使用 ROHM Semiconductor 的 BU4929 的參考設計
- LTC3646IDE-1 28V 輸出、500kHz 工作頻率同步降壓轉(zhuǎn)換器的典型應用電路
- 咩時鐘