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外设
}
相关推荐
代码游侠6 小时前
学习笔记——设备树基础
linux·运维·开发语言·单片机·算法
xuxg20058 小时前
4G 模组 AT 命令解析框架课程正式发布
stm32·嵌入式·at命令解析框架
CODECOLLECT9 小时前
京元 I62D Windows PDA 技术拆解:Windows 10 IoT 兼容 + 硬解码模块,如何降低工业软件迁移成本?
stm32·单片机·嵌入式硬件
BackCatK Chen10 小时前
STM32+FreeRTOS:嵌入式开发的黄金搭档,未来十年就靠它了!
stm32·单片机·嵌入式硬件·freertos·低功耗·rtdbs·工业控制
全栈游侠12 小时前
STM32F103XX 02-电源与备份寄存器
stm32·单片机·嵌入式硬件
深圳市九鼎创展科技15 小时前
瑞芯微 RK3399 开发板 X3399 评测:高性能 ARM 平台的多面手
linux·arm开发·人工智能·单片机·嵌入式硬件·边缘计算
辰哥单片机设计15 小时前
STM32项目分享:车辆防盗报警系统
stm32·单片机·嵌入式硬件
風清掦16 小时前
【江科大STM32学习笔记-05】EXTI外部中断11
笔记·stm32·学习
小龙报16 小时前
【51单片机】从 0 到 1 玩转 51 蜂鸣器:分清有源无源,轻松驱动它奏响新年旋律
c语言·数据结构·c++·stm32·单片机·嵌入式硬件·51单片机
范纹杉想快点毕业16 小时前
嵌入式与单片机开发核心学习指南——从思维转变到第一性原理的深度实践
单片机·嵌入式硬件