本文介紹了STM32基于標(biāo)準(zhǔn)外設(shè)庫(kù)的外部中斷配置,以及基于參考手冊(cè)如何更加寄存器配置外部中斷
2 STM32的外部中斷
下圖來(lái)自《STM32參考手冊(cè)》,從整個(gè)架構(gòu)圖可以知道,外部中斷的功能可以配置六個(gè)寄存器;
中斷屏蔽寄存器(EXTI_IMR)
事件屏蔽寄存器(EXTI_EMR)
上升沿觸發(fā)選擇寄存器(EXTI_RTSR)
下降沿觸發(fā)選擇寄存器(EXTI_FTSR)
軟件中斷事件寄存器(EXTI_SWIER)
掛起寄存器(EXTI_PR)
EXTI支持配置20個(gè)中斷和事件屏蔽位;
GPIO端口以下圖的方式連接到16個(gè)外部中斷/事件線上;EXTI_Line0 — EXTI_Line15;
EXTI_Line16 連接到PVD輸出 ;
EXTI_Line17連接到RTC鬧鐘事件;
EXTI_Line18連接到USB喚醒事件;
EXTI_Line19連接到以太網(wǎng)喚醒事件(只適用于互聯(lián)型產(chǎn)品);
GPIO的映射關(guān)系圖如下所示;
3 中斷服務(wù)函數(shù)的映射關(guān)系
4 外部中斷的配置
宏定義,抽象一下接口,方便后面修改;
#define Z_GPIO_PIN GPIO_Pin_5
#define Z_GPIO_PORT GPIOE
#define Z_PortSource GPIO_PortSourceGPIOE
#define Z_PinSource GPIO_PinSource5
#define Z_Line EXTI_Line5
#define Z_IRQ EXTI9_5_IRQn
GPIO的配置;這里GPIO的輸入模式可以配置為浮空輸入(GPIO_Mode_IN_FLOATING),上拉輸入(GPIO_Mode_IPU)或者下拉輸入(GPIO_Mode_IPD),具體如下圖所示;
GPIO的配置代碼如下;
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = Z_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(Z_GPIO_PORT, &GPIO_InitStructure);
不要忘記外設(shè)總線時(shí)鐘的配置;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC |
RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | RCC_APB2Periph_GPIOF |
RCC_APB2Periph_GPIOG, ENABLE);
EXTI的配置,EXTI_Trigger這里支持三種模式;
EXTI_Trigger_Rising 上升沿觸發(fā);
EXTI_Trigger_Falling 下降沿觸發(fā);
EXTI_Trigger_Rising_Falling 上升沿和下降沿都可以觸發(fā);
GPIO_EXTILineConfig(Z_PortSource, Z_PinSource);
EXTI_InitStructure.EXTI_Line = Z_Line;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
NVIC的配置
NVIC_InitStructure.NVIC_IRQChannel = Z_IRQ;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
中斷服務(wù)函數(shù)
void EXTI9_5_IRQHandler(void)
{
//中斷服務(wù)函數(shù)
}
以上就完成了檢測(cè)下降沿信號(hào)的GPIOE5的外部中斷;
也參考官方DEMO,
STM32F10x_StdPeriph_Lib_V3.5.0ProjectSTM32F10x_StdPeriph_ExamplesEXTIEXTI_Config。
5 寄存器的操作
以下摘自**《STM32參考手冊(cè)》**
產(chǎn)生產(chǎn)生中斷的步驟,必須先配置好并使能中斷線。根據(jù)需要的邊沿檢測(cè)設(shè)置2個(gè)觸發(fā)寄存器,同時(shí)在**中斷屏蔽寄存器(EXTI_IMR)的相應(yīng)位寫(xiě)1允許中斷請(qǐng)求。當(dāng)外部中斷線上發(fā)生了期待的邊沿時(shí),將產(chǎn)生一個(gè)中斷請(qǐng)求,對(duì)應(yīng)的掛起位也隨之被置1。在掛起寄存器(EXTI_PR)的對(duì)應(yīng)位寫(xiě)1,將清除該中斷請(qǐng)求。
產(chǎn)生事件的步驟:必須先配置好并使能事件線。根據(jù)需要的邊沿檢測(cè)通過(guò)設(shè)置2個(gè)觸發(fā)寄存器,同時(shí)在中斷屏蔽寄存器(EXTI_IMR)**的相應(yīng)位寫(xiě)1允許事件請(qǐng)求。當(dāng)事件線上發(fā)生了需要的邊沿時(shí),將產(chǎn)生一個(gè)事件請(qǐng)求脈沖,對(duì)應(yīng)的掛起位不被置1。通過(guò)在軟件中斷/事件寄存器寫(xiě)1,也可以通過(guò)軟件產(chǎn)生中斷/事件請(qǐng)求。
中斷屏蔽寄存器(EXTI_IMR)
事件屏蔽寄存器(EXTI_EMR)
上升沿觸發(fā)選擇寄存器(EXTI_RTSR)
下降沿觸發(fā)選擇寄存器(EXTI_FTSR)
軟件中斷事件寄存器(EXTI_SWIER)
掛起寄存器(EXTI_PR)
IMR如下圖所示,其他幾個(gè)類似;
5.1 硬件中斷選擇
通過(guò)下面的過(guò)程來(lái)配置20個(gè)線路做為中斷源:
配置20個(gè)中斷線的屏蔽位(EXTI_IMR)
配置所選中斷線的觸發(fā)選擇位(EXTI_RTSR和EXTI_FTSR);
配置對(duì)應(yīng)到外部中斷控制器(EXTI)的NVIC中斷通道的使能和屏蔽位,使得20個(gè)中斷線中的請(qǐng)求可以被正確地響應(yīng)。
5.2 硬件事件選擇
通過(guò)下面的過(guò)程,可以配置20個(gè)線路為事件源
配置20個(gè)事件線的屏蔽位(EXTI_EMR)
配置事件線的觸發(fā)選擇位(EXTI_RTSR和EXTI_FTSR)
5.3 軟件中斷/事件的選擇
20個(gè)線路可以被配置成軟件中斷/事件線。下面是產(chǎn)生軟件中斷的過(guò)程:
配置20個(gè)中斷/事件線屏蔽位(EXTI_IMR, EXTI_EMR)
設(shè)置軟件中斷寄存器的請(qǐng)求位(EXTI_SWIER)
6 總結(jié)
本文參考stm32手冊(cè)對(duì)于外部中斷的概念以及配置進(jìn)行了介紹,本人能力有限,難免存在錯(cuò)誤和紕漏,請(qǐng)大佬不吝賜教。
審核編輯:湯梓紅
-
寄存器
+關(guān)注
關(guān)注
31文章
5336瀏覽量
120224 -
STM32
+關(guān)注
關(guān)注
2270文章
10895瀏覽量
355717 -
外部中斷
+關(guān)注
關(guān)注
1文章
131瀏覽量
15816 -
EXTI
+關(guān)注
關(guān)注
0文章
27瀏覽量
3686 -
標(biāo)準(zhǔn)外設(shè)庫(kù)
+關(guān)注
關(guān)注
0文章
16瀏覽量
3539
原文標(biāo)題:STM32 外部中斷詳解(原理+配置代碼)
文章出處:【微信號(hào):mcu168,微信公眾號(hào):硬件攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論