• (十四)STM32——外部中断(EXTI)


    目录

    学习目标

    内容

    介绍

    配置

    代码

    运行结果

    总结 


    学习目标

            本节内容我们将介绍一下外部中断,STM32F4 的每个 IO 都可以作为外部 中断的中断输入口,这点也是 STM32F4 的强大之处。本节我们将使用 STM32F4 的 IO 口作为外部中断输入,实现独立按键的外部中断功能。和独立按键类似,只不过是用中断完成的。

    内容

    介绍

            STM32F407 的中断控制器支持 22 个外部中断/事件请求。每个中断设有状态位,每个中断/事件都有独立的触发和屏蔽设置。STM32F407 的 22 个外部中断为:

    1. EXTI 线 0~15:对应外部 IO 口的输入中断。
    2. EXTI 线 16:连接到 PVD 输出。
    3. EXTI 线 17:连接到 RTC 闹钟事件。
    4. EXTI 线 18:连接到 USB OTG FS 唤醒事件。
    5. EXTI 线 19:连接到以太网唤醒事件。
    6. EXTI 线 20:连接到 USB OTG HS(在 FS 中配置)唤醒事件。
    7. EXTI 线 21:连接到 RTC 入侵和时间戳事件。
    8. EXTI 线 22:连接到 RTC 唤醒事件。

            我们知道,STM32F4有112个IO口,但是只有对应的16根中断线,那么这个问题是怎么解决的呢?我们来看一下开发指南。其实解决办法就是每根中断线对应一些IO口,,GPIO 的管教 GPIOx.0~GPIOx.15(x=A,B,C,D,E,F,G,H,I)分别对应中断线 0~15。这样就解决了我们的问题。

    配置

            接下来就来到了配置的环节,我们将来一步一步配置好我们的外部中断函数,就让我们开始吧!(具体就不一一介绍怎么编写的了,其实就是复制粘贴,找到相应的参数就好了) 

    1. 使能 IO 口时钟,初始化 IO 口为输入
    2. 开启 SYSCFG 时钟,设置 IO 口与中断线的映射关系。
    3. 初始化线上中断,设置触发条件等。
    4. 配置中断分组(NVIC),并使能中断。
    5. 编写中断服务函数。
    1. EXTI_InitTypeDef EXTI_InitStructure;
    2. NVIC_InitTypeDef NVIC_InitStructure;
    3. RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//使能SYSCFG时钟
    4. KEY_Init(); //按键对应的IO口初始化
    5. SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE,EXTI_PinSource4);
    6. EXTI_InitStructure.EXTI_Line = EXTI_Line4;
    7. EXTI_InitStructure.EXTI_LineCmd = ENABLE ;
    8. EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    9. EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
    10. EXTI_Init(&EXTI_InitStructure);
    11. NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;
    12. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE ;
    13. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    14. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    15. NVIC_Init(&NVIC_InitStructure);//配置

            然后是中断函数的配置。

    1. // 外部中断4服务程序
    2. void EXTI4_IRQHandler(void)
    3. {
    4. delay_ms(10); //消抖
    5. if(KEY0==0) // 下降沿触发
    6. {
    7. LED0=!LED0;
    8. LED1=!LED1;
    9. }
    10. EXTI_ClearITPendingBit(EXTI_Line4);//清除LINE4上的中断标志位
    11. }

    代码

            这是主函数的代码,将中断完成之后,就能实现之前独立按键的功能了。 

    1. #include "sys.h"
    2. #include "delay.h"
    3. #include "usart.h"
    4. #include "led.h"
    5. #include "beep.h"
    6. #include "key.h"
    7. #include "exti.h"
    8. int main(void)
    9. {
    10. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
    11. delay_init(168); //初始化延时函数
    12. uart_init(115200); //串口初始化
    13. LED_Init(); //初始化LED端口
    14. BEEP_Init(); //初始化蜂鸣器端口
    15. EXTIX_Init(); //初始化外部中断输入
    16. LED0=0; //先点亮红灯
    17. while(1)
    18. {
    19. printf("OK\r\n"); //打印OK提示程序运行
    20. delay_ms(1000); //每隔1s打印一次
    21. }
    22. }

    运行结果

    独立按键

    总结 

            本节外部中断,其实我觉得挺没意思的,更多是之前知识的是实践,学到的新东西较少,不过还是希望能够帮助到大家,谢谢各位的观看!

  • 相关阅读:
    2.2 PE结构:文件头详细解析
    一种基于波状扩散特征分析的光斑检测方法
    kubernetes && kuboard 端口
    一文讲清楚redis的线程池jedis
    Node.js-初识Node.js与内置模块
    CSS定位
    32-k8s项目实战-01-集群节点扩缩容
    【C语言航路】第六站:指针初阶
    QT打包(windows linux)封包 完整图文版
    LLM 05-大模型法律
  • 原文地址:https://blog.csdn.net/weixin_66578482/article/details/126294595