STM32 外部中断(EXTI)

STM32 外部中断(EXTI)

实验:配置一个引脚的下降沿作为外部中断。

参考:江协科技

相关缩写

RCC(Reset and Clock Control) 复位和时钟控制

GPIO(General Purpose Input/Output) 通用输入/输出

AFIO(Alternate Function Input Output) 复用功能输入输出

EXTI(External Interrupt/Event Controller 外部中断/事件控制器)

NVIC(Nested vectored interrupt controller) 嵌套向量中断控制器

整体框图

主要步骤

0 使能时钟

复制代码
开启GPIO引脚和AFIO的时钟。AFIO用来把GPIO引脚作为EXTI线

1 初始化 GPIO

复制代码
设置为输入引脚

2 选择 GPIO 引脚做 EXTI_Line

复制代码
把GPIO引脚作为EXTI线

3 初始化 EXTI 外设

复制代码
配置这个EXTI线的使能、触发模式,触发后是中断还是事件

4 初始化 NVIC 外设

复制代码
配置这个中断源的使能、优先级

代码

复制代码
void CountSensor_Init(void) {
    /*0 开启时钟*/
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);  // 开启GPIOB的时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);  // 开启AFIO的时钟,外部中断必须开启AFIO的时钟

    /*1 GPIO初始化*/
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);  // 将PB14引脚初始化为上拉输入

    /*2 AFIO选择中断引脚*/
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,
                        GPIO_PinSource14);  // 将外部中断的14号线映射到GPIOB,即选择PB14为外部中断引脚

    /*3 EXTI初始化*/
    EXTI_InitTypeDef EXTI_InitStructure;                     // 定义结构体变量
    EXTI_InitStructure.EXTI_Line = EXTI_Line14;              // 选择配置外部中断的14号线
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;                // 指定外部中断线使能
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;      // 指定外部中断线为中断模式
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;  // 指定外部中断线为下降沿触发
    EXTI_Init(&EXTI_InitStructure);                          // 将结构体变量交给EXTI_Init,配置EXTI外设

    /*NVIC中断分组*/
    // 注意:整个工程只需要配置一次
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  // 配置NVIC为分组2
                                                     // 即抢占优先级范围:0~3,响应优先级范围:0~3
                                                     // 此分组配置在整个工程中仅需调用一次
                                                     // 若有多个中断,可以把此代码放在main函数内,while循环之前
                                                     // 若调用多次配置分组的代码,则后执行的配置会覆盖先执行的配置

    /*4 NVIC配置*/
    NVIC_InitTypeDef NVIC_InitStructure;                       // 定义结构体变量
    NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;       // 选择配置NVIC的EXTI15_10线
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;            // 指定NVIC线路使能
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;  // 指定NVIC线路的抢占优先级为1
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;         // 指定NVIC线路的响应优先级为1
    NVIC_Init(&NVIC_InitStructure);                            // 将结构体变量交给NVIC_Init,配置NVIC外设
}
相关推荐
HRTOS44 分钟前
HRTOS:一个名字背后的目标——不断逼近硬实时
经验分享·单片机·系统架构·51单片机
UrSpecial3 小时前
GPIO 是什么?
单片机·嵌入式硬件
修船大队长5 小时前
配置接受报文每个报文对应一个mailbox配置流程记录
网络·单片机·mcu
搁浅小泽7 小时前
二极管选型技术规范
单片机·嵌入式硬件·汽车
搁浅小泽7 小时前
电感选型技术规范
单片机·嵌入式硬件·汽车
..Dauntless..7 小时前
【stm32】串口——在MCU内部的工作过程
stm32·单片机·嵌入式硬件
lzqrzpt8 小时前
临沂LED驱动电源工程选型标准与工艺对比解析
python·单片机·嵌入式硬件·物联网
小黄蚁8 小时前
使用LVGL模拟示波器创建正弦函数波形
单片机·学习
Code_Solitude11 小时前
开发板点灯实验源码
stm32·单片机·嵌入式硬件
Zw-awa21 小时前
编码器读到的到底是什么:从脉冲到速度
stm32