STM32之EXTI

1. 什么是EXTI

1.1 EXTI简介

• EXTI全称是(External Interrupt and Event Controller),中文是外部中断和事件控制器

• 如图GPIO 的作用是可以读取引脚上面的数据,0是低电压,1是高电压

• 而EXTI作用:可以检测GPIO引脚上的电压变化(可以用来边沿检测),可以检测上升沿或者下降沿,上升沿是由低电压变为高电压,下降沿是由高电压变为低电压。

• 总结就是,EXTI可以用来捕获引脚上信号变化,并产生中断。

1.2 EXTI应用举例

• 在按键实验中(GPIO那里),是通过一个while(1)循环一直检测按键的状态,对比previous和current的状态,得出按键的状态,只有在按下松开才切换LED的亮灭,一直按着LED亮灭不变。如图:

• 如果使用的EXTI就可以不用while循环检测,一旦按键按下,在松开的时候会产生一个上升沿触发中断,在中断响应函数里面就可以在那里熄灭led。

1.3 线的概念

• 如图,EXTI的内部是由一条一条的EXTI线组成,下图是其中的一条EXTI线的结构

• 这里的线的意思是EXTI线,EXTI一共有20条EXTI线,其中前16条EXTI线是在GPIO中挑选的。根据上图,从每组GPIO里面挑选出一个EXTI线。

• 例如,假如要挑选EXTI0线,会从每组的GPIO中0引脚中挑选。例如从PA0,PB0,PC0,PD0中选一个出来作为EXTI0,但是不能同时选择两个,假如选择了PA0作为EXTI0线之后,后面的PB0,PC0,PD0都不能作为EXTI线了。

1.4 线的内部结构,如图:

• 上图是EXTI的内部结构,由20条EXTI线组成,其中GPIO那部分的EXTI线是经过AFIO复用器挑选,挑选完之后,就可以作为EXTI线了

• AFIO的作用 就是 让EXTIx线分配给某一组的GPIO。

• 之后就可以去检测该引脚的电压变化,检测上升沿或者下降沿。看要求是否产生中断。

• 上图的例子,PA0是按键的引脚,需要配置为中断引脚的。

• PA0,其中0是表示选择EXTI0这条线,A表示的是EXTI线选择GPIOA这一组的引脚中的PA0.

• 然后进入边沿检测,捕获上升沿和下降沿,这里设置了上升沿触发中断,所以上升沿就被选择触发了中断。

2. 实战

• 一些编程的要用的接口:

2.1 分配EXTI线,如图:

• 由于前16个EXTI线是由GPIO引脚输入的信号来触发中断,所以需要选择是那个GPIO端口中的那个引脚作为EXTI线,在AFIO里面。

2.2 配置EXTI线的参数,如图:

• 选择的是,选择的那个EXTI线,初始化EXTI。例子:

2.3 配置NVIC模块,如图:

• 如图EXTI中断也是受NVIC管理的,所以也需要配置NVIC。

• 使用NVIC_Init()配置。

• 获取是那个EXTI线触发的中断,如图:

• 清除EXTI线的标志位,不然会一直发生中断。

3. 代码:

复制代码
#include "stm32f10x.h"

void LED_Init();
void Button_Init();

int main(void)
{
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置分组
    LED_Init();
    Button_Init();
   while(1)
	{
	}
}


void Button_Init(){
    //1.配置PA0和PA1
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    GPIO_InitTypeDef gpio_initStruct = {0};
    
    gpio_initStruct.GPIO_Mode = GPIO_Mode_IPU;
    gpio_initStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
    
    GPIO_Init(GPIOA,&gpio_initStruct);
    
    //2.分配EXTI线
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);//在AFIO选择GPIO作为EXTI线
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource1);
    //3.配置EXTI线参数
    EXTI_InitTypeDef exti_initStruct = {0};
    
    exti_initStruct.EXTI_Line = EXTI_Line0;
    exti_initStruct.EXTI_LineCmd = ENABLE;
    exti_initStruct.EXTI_Mode = EXTI_Mode_Interrupt;
    exti_initStruct.EXTI_Trigger = EXTI_Trigger_Rising;
    
    EXTI_Init(&exti_initStruct);
    
    exti_initStruct.EXTI_Line = EXTI_Line1;
    exti_initStruct.EXTI_LineCmd = ENABLE;
    exti_initStruct.EXTI_Mode = EXTI_Mode_Interrupt;
    exti_initStruct.EXTI_Trigger = EXTI_Trigger_Rising;
    
    EXTI_Init(&exti_initStruct);
    
    //4.配置NVIC
    NVIC_InitTypeDef nvic_initStruct = {0};
    
    nvic_initStruct.NVIC_IRQChannel = EXTI0_IRQn;
    nvic_initStruct.NVIC_IRQChannelCmd = ENABLE;
    nvic_initStruct.NVIC_IRQChannelPreemptionPriority = 0;
    nvic_initStruct.NVIC_IRQChannelSubPriority = 0;
    
    NVIC_Init(&nvic_initStruct);
    
    nvic_initStruct.NVIC_IRQChannel = EXTI1_IRQn;
    nvic_initStruct.NVIC_IRQChannelCmd = ENABLE;
    nvic_initStruct.NVIC_IRQChannelPreemptionPriority = 0;
    nvic_initStruct.NVIC_IRQChannelSubPriority = 0;
    
    NVIC_Init(&nvic_initStruct);
    

}

void EXTI0_IRQHandler(){
    if(EXTI_GetFlagStatus(EXTI_Line0) == SET){
        EXTI_ClearFlag(EXTI_Line0);
        GPIO_WriteBit(GPIOB,GPIO_Pin_8,Bit_RESET);
    }
}

void EXTI1_IRQHandler(){
    if(EXTI_GetFlagStatus(EXTI_Line1) == SET){
        EXTI_ClearFlag(EXTI_Line1);
        GPIO_WriteBit(GPIOB,GPIO_Pin_8,Bit_SET);
    }
}


void LED_Init(){
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
    
    GPIO_InitTypeDef gpio_initStruct = {0};
    
    gpio_initStruct.GPIO_Mode = GPIO_Mode_Out_OD;
    gpio_initStruct.GPIO_Pin = GPIO_Pin_8;
    gpio_initStruct.GPIO_Speed = GPIO_Speed_2MHz;
    
    GPIO_Init(GPIOB,&gpio_initStruct);
    
    GPIO_WriteBit(GPIOB,GPIO_Pin_8,Bit_SET);
}
相关推荐
BSD_CGQ12 小时前
FSR传感器STM32 DMA高速采样工程实现(高精度、低CPU占用)
stm32·单片机·嵌入式硬件·压力传感器·源头工厂·柔性薄膜压力传感器·可变电阻压力传感器
芯岭技术郦15 小时前
32 位 ARM® Cortex®-M0+ 内核MCU普冉MS32C001-C
单片机·嵌入式硬件
骑着毛驴数星星15 小时前
STM32 CAN波特率与采样点计算,基于HAL库
stm32·单片机·嵌入式硬件
zhangrelay16 小时前
Arduino-MEGA-ESP单片机理论课笔记02-硬件-2026
笔记·单片机·嵌入式硬件
艾芯微科技16 小时前
钰泰 ETA5055V330DD1E|SOT-223 3.3V LDO,低压差、大电流线性稳压选型分享
网络·单片机·嵌入式硬件·集成测试·51单片机
新晨单片机设计17 小时前
S023A-基于STM32单片机智能插座【Proteus仿真+Keil程序+原理图】
stm32·单片机·proteus·单片机智能插座
威嵌神州18 小时前
恩智浦 T1022 性能怎么样?QorIQ 架构中端工业嵌入式优势解析
嵌入式硬件
weixin_6906547418 小时前
龙迅#LT9611EX 现MIPI转HDMI1.4功能主推型号,分辨率高达4K30HZ,IC内置I2C无需外部12C控制。
嵌入式硬件·音视频·信号处理
EatFans18 小时前
全栈自造 Status Deck(四):硬件终于到了,从点亮屏幕到跑通第一个 Demo
单片机·物联网
qq_4017004118 小时前
STM32 GPIO 精讲|推挽 / 开漏 / 上拉浮空,工程选型避坑
stm32·单片机·嵌入式硬件