一、什么是中斷?
打斷當(dāng)前的操作,執(zhí)行中斷需要做的事情。
中斷的作用:中斷機(jī)制不僅賦予了系統(tǒng)處理意外情況的能力,就可以“同時(shí)”完成多個(gè)任務(wù),提高了并發(fā)“處理”能力。
和線程的區(qū)別:線程是同時(shí)執(zhí)行多個(gè)任務(wù),中斷是停下來(lái)去執(zhí)行其他的(注意優(yōu)先級(jí)),執(zhí)行完了再回來(lái)執(zhí)行,
定時(shí)器才相當(dāng)于線程,定一個(gè)時(shí)間,每到這個(gè)時(shí)間執(zhí)行一次
二、中斷概述
STM32F4并沒(méi)有使用CM4內(nèi)核的全部東西,而是只用了它的一部分。
STM32F40xx/STM32F41xx總共有92個(gè)中斷
STM32F42xx/STM32F43xx則總共有96個(gè)中斷
STM32F40xx/STM32F41xx的92個(gè)中斷里面,包括10個(gè)內(nèi)核中斷和82個(gè)可屏蔽中斷,具有16級(jí)可編程的中斷優(yōu)先級(jí),而我們常用的就是這82個(gè)可屏蔽中斷。
三、外部中斷/事件線映射多達(dá)140個(gè)GPIO。
根據(jù)圖文,發(fā)現(xiàn)我們的中斷線總共有23根,其中16根是連接PA~PI引腳。
STM32F4供IO使用的中斷線只有16個(gè):EXTI線0~15:對(duì)應(yīng)外部IO口的輸入中斷。
剩下的七根是分別連接專用設(shè)備的:
另外七根 EXTI 線連接方式如下:
● EXTI 線 16 連接到 PVD 輸出
● EXTI 線 17 連接到 RTC 鬧鐘事件
● EXTI 線 18 連接到 USB OTG FS 喚醒事件
● EXTI 線 19 連接到以太網(wǎng)喚醒事件
● EXTI 線 20 連接到 USB OTG HS(在 FS 中配置)喚醒事件
● EXTI 線 21 連接到 RTC 入侵和時(shí)間戳事件
● EXTI 線 22 連接到 RTC 喚醒事件
四、中斷服務(wù)函數(shù)分配
IO口外部中斷在中斷向量表中只分配了7個(gè)中斷向量,也就是只能使用7個(gè)中斷服務(wù)函數(shù)
從表中看出,外部中斷線5~9分配一個(gè)中斷向量,共用一個(gè)服務(wù)函數(shù) 外部中斷線10~15分配一個(gè)中斷向量,共用一個(gè)中斷服務(wù)函數(shù)
中斷服務(wù)函數(shù)列表如下:
四、設(shè)置中斷優(yōu)先級(jí)的分組
1、中斷優(yōu)先級(jí)有兩種:
搶占(占先式)優(yōu)先級(jí) --》 第一序列 響應(yīng)(副)優(yōu)先級(jí) --》 第二序列
2、搶占優(yōu)先級(jí) &響應(yīng)優(yōu)先級(jí)區(qū)別:
高優(yōu)先級(jí)的搶占優(yōu)先級(jí)是可以打斷正在進(jìn)行的低搶占優(yōu)先級(jí)中斷的。
搶占優(yōu)先級(jí)相同的中斷,高響應(yīng)優(yōu)先級(jí)不可以打斷低響應(yīng)優(yōu)先級(jí)的中斷。
搶占優(yōu)先級(jí)相同的中斷,當(dāng)兩個(gè)中斷同時(shí)發(fā)生的情況下,哪個(gè)響應(yīng)優(yōu)先級(jí)高,哪個(gè)先執(zhí)行。
如果兩個(gè)中斷的搶占優(yōu)先級(jí)和響應(yīng)優(yōu)先級(jí)都是一樣的話,則看哪個(gè)中斷先發(fā)生就先執(zhí)行;
3、中斷優(yōu)先級(jí)設(shè)置步驟
①系統(tǒng)運(yùn)行后先設(shè)置中斷優(yōu)先級(jí)分組。調(diào)用函數(shù):
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);整個(gè)系統(tǒng)執(zhí)行中只設(shè)置一次中斷分組。
②針對(duì)每個(gè)中斷,設(shè)置對(duì)應(yīng)的搶占優(yōu)先級(jí)和響應(yīng)優(yōu)先級(jí):
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);
③如果需要掛起/解掛,查看中斷當(dāng)前激活狀態(tài),分別調(diào)用相關(guān)函數(shù)即可
五、外部中斷的一般配置步驟
①使能SYSCFG時(shí)鐘:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
②初始化IO口為輸入。
GPIO_Init();
③設(shè)置IO口與中斷線的映射關(guān)系。
void SYSCFG_EXTILineConfig();//通過(guò)設(shè)置SYSCFG寄存器,建立IO口和中斷線的連接
④初始化線上中斷,設(shè)置觸發(fā)條件等。
EXTI_Init();
⑤配置中斷分組(NVIC),并使能中斷。
NVIC_Init();
⑥編寫中斷服務(wù)函數(shù)。
EXTIx_IRQHandler();
且清除中斷標(biāo)志位
EXTI_ClearITPendingBit();//清除中斷標(biāo)志位是為了表示中斷已經(jīng)開始執(zhí)行,可以接收下一個(gè)中斷。
----------------------------------------------------------------------------------------------------------------------------------------------------------
代碼如下:
/**********************************************
*
*功能:四個(gè)按鍵中斷
*
**********************************************/
#include "exti.h"
//外部中斷初始化程序
//初始化PE2~4,PA0為中斷輸入.
void EXTI4_Init(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);//使能GPIOA,GPIOE時(shí)鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//使能SYSCFG時(shí)鐘
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; //KEY0 KEY1 KEY2對(duì)應(yīng)引腳
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//普通輸入模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100M
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIOE2,3,4
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource4);//PE4 連接到中斷線4
/* 配置EXTI_Line2,3,4 */
EXTI_InitStructure.EXTI_Line = EXTI_Line4;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中斷事件
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿觸發(fā)
EXTI_InitStructure.EXTI_LineCmd = ENABLE;//中斷線使能
EXTI_Init(&EXTI_InitStructure);//配置
NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;//外部中斷4
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;//搶占優(yōu)先級(jí)1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;//子優(yōu)先級(jí)2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中斷通道
NVIC_Init(&NVIC_InitStructure);//配置
}
void EXTI3_Init(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);//使能GPIOA,GPIOE時(shí)鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//使能SYSCFG時(shí)鐘
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //KEY0 KEY1 KEY2對(duì)應(yīng)引腳
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//普通輸入模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100M
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIOE2,3,4
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource3);//PE4 連接到中斷線4
/* 配置EXTI_Line2,3,4 */
EXTI_InitStructure.EXTI_Line = EXTI_Line3;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中斷事件
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿觸發(fā)
EXTI_InitStructure.EXTI_LineCmd = ENABLE;//中斷線使能
EXTI_Init(&EXTI_InitStructure);//配置
NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;//外部中斷4
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;//搶占優(yōu)先級(jí)1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;//子優(yōu)先級(jí)2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中斷通道
NVIC_Init(&NVIC_InitStructure);//配置
}
void EXTI2_Init(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);//使能GPIOA,GPIOE時(shí)鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//使能SYSCFG時(shí)鐘
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //KEY0 KEY1 KEY2對(duì)應(yīng)引腳
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//普通輸入模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100M
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIOE2,3,4
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource2);//PE4 連接到中斷線4
/* 配置EXTI_Line2,3,4 */
EXTI_InitStructure.EXTI_Line = EXTI_Line2;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中斷事件
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿觸發(fā)
EXTI_InitStructure.EXTI_LineCmd = ENABLE;//中斷線使能
EXTI_Init(&EXTI_InitStructure);//配置
NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;//外部中斷4
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;//搶占優(yōu)先級(jí)1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;//子優(yōu)先級(jí)2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中斷通道
NVIC_Init(&NVIC_InitStructure);//配置
}
void EXTI0_Init(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能GPIOA,GPIOE時(shí)鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//使能SYSCFG時(shí)鐘
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //KEY0 KEY1 KEY2對(duì)應(yīng)引腳
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//普通輸入模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100M
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOE2,3,4
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0);//PE4 連接到中斷線4
/* 配置EXTI_Line2,3,4 */
EXTI_InitStructure.EXTI_Line = EXTI_Line0;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中斷事件
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿觸發(fā)
EXTI_InitStructure.EXTI_LineCmd = ENABLE;//中斷線使能
EXTI_Init(&EXTI_InitStructure);//配置
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;//外部中斷4
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;//搶占優(yōu)先級(jí)1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;//子優(yōu)先級(jí)2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中斷通道
NVIC_Init(&NVIC_InitStructure);//配置
}
//外部中斷4服務(wù)程序
void EXTI4_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line4) != RESET)//判斷是否置位
{}
EXTI_ClearITPendingBit(EXTI_Line4);//清除LINE4上的中斷標(biāo)志位
}
//外部中斷3服務(wù)程序
void EXTI3_IRQHandler(void)
{
delay_ms(15);
EXTI_ClearITPendingBit(EXTI_Line4);//清除LINE4上的中斷標(biāo)志位
}
//外部中斷2服務(wù)程序
void EXTI2_IRQHandler(void)
{
EXTI_ClearITPendingBit(EXTI_Line4);//清除LINE4上的中斷標(biāo)志位
}
//外部中斷0服務(wù)程序
void EXTI0_IRQHandler(void)
{
EXTI_ClearITPendingBit(EXTI_Line4);//清除LINE4上的中斷標(biāo)志位
}
上一篇:Cortex-M0 LPC11C14中斷控制器
下一篇:LPC824 一種IAP實(shí)現(xiàn)方法
推薦閱讀
史海拾趣
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦
- 神經(jīng)形態(tài)芯片可能是革新機(jī)器人實(shí)時(shí)電機(jī)控制的未來(lái)
- 從三個(gè)方面理解ARM嵌入式系統(tǒng)
- 自動(dòng)報(bào)警 基于MCU的家庭防盜報(bào)警系統(tǒng)的設(shè)計(jì)
- 存儲(chǔ)控制器及其訪問(wèn)外設(shè)的原理
- 基于51系列單片機(jī)的智能照明控制系統(tǒng)設(shè)計(jì)方案
- 基于STM32的四旋翼飛行器控制系統(tǒng)
- 單片機(jī)應(yīng)用編程技巧解析
- 基于89C52的教室智能節(jié)能照明系統(tǒng)設(shè)計(jì)
- 一種新型的雨量光照傳感器的設(shè)計(jì)
- 【EEWORLD第十屆社區(qū)明星人物】12月明星人物
- 闖關(guān)集卡|輕型電動(dòng)車與電動(dòng)工具正當(dāng)時(shí),英飛凌邀你上道!
- 有獎(jiǎng)活動(dòng)|逛安富利人工智能云會(huì)展,解鎖AI資料,贏好禮!
- 下午2點(diǎn)微信群語(yǔ)音答疑:Vicor電源專家答網(wǎng)友的電源設(shè)計(jì)問(wèn)題
- 迎端午,芯幣可以兌換粽子啦!
- 有獎(jiǎng)直播 | 德州儀器基于 Arm 的 AM62 處理器簡(jiǎn)介
- 智能云鎖哪家強(qiáng)?TI市場(chǎng)和技術(shù)大咖邀你1月16日10:00直播間暢聊
- 有獎(jiǎng)直播報(bào)名|ST 家用電器三相電機(jī)控制解決方案
- VISHAY汽車電子主題月 幸運(yùn)闖關(guān)贏大獎(jiǎng)!
- 華為昇騰AI生態(tài)開發(fā)者已經(jīng)超過(guò)35萬(wàn)
- 預(yù)計(jì)2025年全球新增逆變器需求將達(dá)到500GW
- 中小型工商業(yè)光伏勢(shì)頭正盛!看微型逆變器技術(shù)如何發(fā)揮領(lǐng)先優(yōu)勢(shì)!
- 光伏逆變器行業(yè)研究與投資機(jī)會(huì)分析
- 西門子博途Graph語(yǔ)言編程之在線調(diào)試方法
- 精度提升50%!匯頂科技為vivo NEX獨(dú)家供應(yīng)屏下指紋方案
- 未來(lái)手機(jī)標(biāo)桿 vivo發(fā)布全面屏新機(jī)NEX
- 中興通訊:與美國(guó)和解協(xié)議已于6月8日生效,明日復(fù)牌
- 小米和愛立信和解?搭載聯(lián)發(fā)科芯片的小米手機(jī)重返印度市場(chǎng)
- 無(wú)線充電SoC方案歷代大解密——5W篇
- 【CH579M-R1】+開發(fā)環(huán)境的構(gòu)建與使用
- 【BB大賽】第一輯——智能小車器件選型
- 去ti網(wǎng)站申請(qǐng)lm3s的樣片能成功不?
- VHDL絕佳學(xué)習(xí)網(wǎng)站!
- 【ESP32】計(jì)算性能測(cè)試
- 【國(guó)民技術(shù)N32G457評(píng)測(cè)】四、移植小型嵌入式任務(wù)管理器 MillisTaskManager
- 關(guān)于脈沖的”沿“
- FRDM-KW41Z入門——SDK生成
- 【Labview】模擬IO與數(shù)字IO 技術(shù)文檔.pdf
- 新注冊(cè)的注冊(cè)就有芯幣么?