0x01 > 什么是中斷
所謂中斷就是指CPU正處于工作狀態(tài)時(shí),外部發(fā)生了某一事件(按鍵按下),請(qǐng)求CPU進(jìn)行處理,于是 CPU暫時(shí)中斷當(dāng)前的工作,轉(zhuǎn)而處理所發(fā)生的的事件,處理完畢在回到原來(lái)被中斷的地方繼續(xù)工作,這樣的過(guò)程被稱(chēng)為中斷
中斷示意圖
中斷包括以下幾部分
中斷源
中斷申請(qǐng)
開(kāi)放中斷
保護(hù)現(xiàn)場(chǎng)
中斷服務(wù)
恢復(fù)現(xiàn)場(chǎng)
中斷返回
我們知道 傳統(tǒng)的51單片機(jī)一共有 5 個(gè)中斷源,它們分別為:
外部中斷0
外部中斷1
定時(shí)器1
現(xiàn)在正在學(xué)習(xí)的 STM32 有多少中斷呢?
0x02 > STM32 中斷基礎(chǔ)知識(shí)
Cortex-m3支持256個(gè)中斷,其中包含了16個(gè)內(nèi)核中斷,240個(gè)外部中斷。
STM32 只有84個(gè)中斷,包括16個(gè)內(nèi)核中斷和68個(gè)可屏蔽中斷
STM32 上只有60個(gè)可屏蔽中斷,f107上才有68個(gè)中斷
先占優(yōu)先級(jí)也就是搶占優(yōu)先級(jí),概念等同于51單片機(jī)中的中斷。假設(shè)有兩中斷先后觸發(fā),已經(jīng)在執(zhí)行的中斷先占優(yōu)先級(jí)如果沒(méi)有后觸發(fā)的中斷 先占優(yōu)先級(jí)更高,就會(huì)先處理先占優(yōu)先級(jí)高的中斷。也就是說(shuō)又有較高的先占優(yōu)先級(jí)的中斷可以打斷先占優(yōu)先級(jí)較低的中斷。這是實(shí)現(xiàn)中斷嵌套的基礎(chǔ)。
次占優(yōu)先級(jí),也就是響應(yīng)優(yōu)先級(jí),只在同一先占優(yōu)先級(jí)的中斷同時(shí)觸發(fā)時(shí)起作用,先占優(yōu)先級(jí)相同,則優(yōu)先執(zhí)行次占優(yōu)先級(jí)較高的中斷。次占優(yōu)先級(jí)不會(huì)造成中斷嵌套。 如果中斷的兩個(gè)優(yōu)先級(jí)都一致,則優(yōu)先執(zhí)行位于中斷向量表中位置較高的中斷。
? 0x001 >> 嵌套向量中斷控制器 (NVIC)
? ? STM32 的中斷既然有這么多,那么要怎么管理呢?
ST也給了我們一些解決方案就是 使用 嵌套中斷向量控制器 NVIC,NVIC屬于內(nèi)核級(jí)的寄存器,所以當(dāng)我們需要查詢 NVIC 相關(guān)定義 應(yīng)該到 core_cm3.h 中(這里講解的芯片是 STM32F103ZE 是基于 Coretex-M3)
/* 訪問(wèn)嵌套向量中斷控制器 (NVIC)的結(jié)構(gòu)類(lèi)型 */
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)先級(jí)寄存器(8Bit wide) */
uint32_t RESERVED5[644U];
__OM uint32_t STIR; /* 軟件觸發(fā)中斷寄存器 */
} NVIC_Type;
? 0x002 >> 中斷優(yōu)先級(jí)定義 ☆
中斷優(yōu)先級(jí)設(shè)定寄存器
coretex-M3 內(nèi)核的中斷定義寄存器的寬度是8位的,在上圖中,我們能看到ST在設(shè)計(jì)中斷的時(shí)候只使用了高4位 [7:4]
The processor implements only bits[7:4] of each field, bits[3:0] read as zero and ignore writes.
處理器只實(shí)現(xiàn)每個(gè)字段的位[7:4],位[3:0]讀為零,忽略寫(xiě)。
ST在上述分組中,ST還將中斷分成了主優(yōu)先級(jí)(搶占優(yōu)先級(jí))和子優(yōu)先級(jí)(響應(yīng)優(yōu)先級(jí))。對(duì)應(yīng)的寄存器
優(yōu)先級(jí)分組寄存器
優(yōu)先級(jí)組
上圖就是,優(yōu)先級(jí)分組寄存器和對(duì)應(yīng)的優(yōu)先級(jí)分組,下面來(lái)簡(jiǎn)單的總結(jié)一下優(yōu)先級(jí)分組怎么用。
優(yōu)先級(jí)分組
/* LL 庫(kù)中斷優(yōu)先級(jí)分組,選項(xiàng)和實(shí)現(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;
}
假設(shè)我們有兩個(gè)外設(shè) 外設(shè)A 和外設(shè)B 我們將 兩個(gè)外設(shè)的主優(yōu)先級(jí)都配置為 0,將外設(shè) A 的子優(yōu)先級(jí)配置為 1,外設(shè) B 的子優(yōu)先級(jí)配置為 2,。當(dāng)它們的中斷請(qǐng)求同時(shí)到來(lái)時(shí),內(nèi)核將如何執(zhí)行?
內(nèi)核將比較兩個(gè)外設(shè)的主優(yōu)先級(jí),如果外設(shè)的主優(yōu)先級(jí)相等,就會(huì)對(duì)子優(yōu)先級(jí)進(jìn)行比較,子優(yōu)先級(jí)越高,子優(yōu)先級(jí)的數(shù)字就越小。
令人頭痛的問(wèn)題,如果外設(shè)的主優(yōu)先級(jí)、子優(yōu)先級(jí)都相同,怎么判斷?
如果外設(shè)的主優(yōu)先級(jí)和子優(yōu)先級(jí)都相等,那么將會(huì)對(duì)硬件中斷編號(hào)進(jìn)行比較
硬件編號(hào)在哪?
硬件編號(hào) 位于 《STM32 中文參考手冊(cè)_V10》第九章 中斷和事件 第9.1.2小節(jié) 中斷和異常向量表
0x03 > 總結(jié)
以上就是 關(guān)于 STM32F103ZE 的外部中斷與中斷管理的理論部分。這篇文章可能會(huì)讓你感到晦澀難懂,或者有漏洞,那是在所難免的問(wèn)題。
上一篇:STM32代碼的啟動(dòng)過(guò)程
下一篇:如何在 VScode 創(chuàng)建 stm32 項(xiàng)目?
推薦閱讀最新更新時(shí)間:2025-05-02 10:51




設(shè)計(jì)資源 培訓(xùn) 開(kāi)發(fā)板 精華推薦
- Microchip 升級(jí)數(shù)字信號(hào)控制器(DSC)產(chǎn)品線 推出PWM 分辨率和 ADC 速度業(yè)界領(lǐng)先的新器件
- 意法半導(dǎo)體STM32MP23x:突破成本限制的工業(yè)AI應(yīng)用核心
- 意法半導(dǎo)體推出用于匹配遠(yuǎn)距離無(wú)線微控制器STM32WL33的集成的匹配濾波芯片
- ESP32開(kāi)發(fā)板連接TFT顯示屏ST7789跳坑記
- 如何讓ESP32支持analogWrite函數(shù)
- LGVL配合FreeType為可變字體設(shè)置字重-ESP32篇
- 使用樹(shù)莓派進(jìn)行 ESP32 Jtag 調(diào)試
- ESP32怎么在SPIFFS里面存儲(chǔ)html,css,js文件,以及網(wǎng)頁(yè)和arduino的通訊
- ESP32 freeRTOS使用測(cè)試
- LTC3615IUF-1 雙路 4MHz、3A 同步降壓型 DC/DC 轉(zhuǎn)換器的典型應(yīng)用
- LT6556 的典型應(yīng)用 - 1 個(gè)三重 2:1 視頻多路復(fù)用器的 750MHz 增益
- C8051F989DK,用于工業(yè)應(yīng)用的 C8051F989 8051 微控制器的開(kāi)發(fā)系統(tǒng)
- RT8561A 1MHz、20mA 滿量程電流模擬調(diào)光控制的典型應(yīng)用
- 用于 FPF1204 電源開(kāi)關(guān)的 FPF120x 評(píng)估板
- LT1579CS 的典型應(yīng)用電路附加邏輯迫使 LT1579 進(jìn)入關(guān)斷狀態(tài)以保護(hù)輸入電池
- LTC1294單片機(jī)12位數(shù)據(jù)采集系統(tǒng)典型應(yīng)用
- 使用 ROHM Semiconductor 的 BU4929 的參考設(shè)計(jì)
- LTC3646IDE-1 28V 輸出、500kHz 工作頻率同步降壓轉(zhuǎn)換器的典型應(yīng)用電路
- 咩時(shí)鐘
- 基于汽油直接噴射系統(tǒng)共軌壓力信號(hào)的診斷方案
- 韶音骨傳導(dǎo)耳機(jī):結(jié)構(gòu)雖簡(jiǎn)單,但拆解不易!
- 通過(guò)集成動(dòng)力總成系統(tǒng)降低電動(dòng)汽車(chē)成本并增加行駛里程
- 集邦:西安疫情將影響三星NAND Flash生產(chǎn)部分稼動(dòng)率
- 俄烏局勢(shì)至全球芯片供應(yīng)面臨沖擊
- 寶通科技和銀亞集團(tuán)就“元宇宙+”業(yè)務(wù)簽署戰(zhàn)略合作協(xié)議
- 02-JZ2440裸機(jī)學(xué)習(xí)之存儲(chǔ)管理器
- 手把手教你使用數(shù)字萬(wàn)用表,不會(huì)都不行!
- EUV設(shè)備爭(zhēng)搶熱度降溫 ASML傳首度遭砍單
- 國(guó)芯科技發(fā)布全球首款48V安全氣囊芯片,引領(lǐng)智能汽車(chē)新紀(jì)元
- 亞馬遜全球部署100萬(wàn)臺(tái)機(jī)器人
- 自動(dòng)駕駛只用激光雷達(dá)進(jìn)行感知會(huì)有哪些問(wèn)題?
- 為什么電源紋波測(cè)試結(jié)果與理論設(shè)計(jì)如此之大?
- UWB信標(biāo)與LoRa基站網(wǎng)關(guān)數(shù)據(jù)區(qū)別在哪里?
- 什么是AI 同傳技術(shù)
- 人工智能處理器和加速器到底是什么?
- PWM控制(脈沖寬度調(diào)制)的基本原理是什么
- 如何設(shè)計(jì)帶集成運(yùn)放構(gòu)成的方波發(fā)生器
- DSP調(diào)度算法的基本概念和原理
- 2019東芝PCIM在線展會(huì):會(huì)一會(huì) 電力領(lǐng)域中的高能晶體管們
- 齊分享,月月有獎(jiǎng)第25期活動(dòng)華麗升級(jí)來(lái)襲
- 福祿克首款熱成像萬(wàn)用表Fluke-279FC等你來(lái)嘗鮮!曬心得享好禮嘍!
- 我是大偵探之:尋找遺落的TI電源拼圖
- 【EEWORLD第二十五屆】2011年04月社區(qū)明星人物揭曉!
- 在挑戰(zhàn)中成長(zhǎng),一起進(jìn)修TI汽車(chē)技術(shù)集錦 贏積分有好禮
- 2018,EEWORLD邀請(qǐng)你定下新年成長(zhǎng)計(jì)劃
- 你玩板我有獎(jiǎng)|老板新玩還有獎(jiǎng)
- 報(bào)名觀看TI嵌入式主題月直播,場(chǎng)場(chǎng)精彩,好運(yùn)連連
- 人工智能“入侵”廚房,未來(lái)能做早餐?
- 中科院無(wú)人駕駛汽車(chē)通過(guò)結(jié)題驗(yàn)收
- 我國(guó)人工智能企業(yè)突破4000家
- 蘇黎世大學(xué)Rolf Pfeifer:機(jī)器人將與人類(lèi)一起見(jiàn)證未來(lái)
- 能源互聯(lián)網(wǎng)下的多能互補(bǔ)綜合能量管理
- STM32系統(tǒng)時(shí)鐘設(shè)置,采用外部有源晶振相關(guān)配置問(wèn)題
- stm32f105 spi 移植到stm32f103上
- STM32使用外部16MHZ晶振總結(jié)
- STM32_RTC晶振不起振的原因及解決方法
- STM32時(shí)鐘配置方法詳解