1、准备材料

开发板(STM32F407G-DISC1

ST-LINK/V2驱动

STM32CubeMX软件(Version 6.10.0

keil µVision5 IDE(MDK-Arm

2、实验目标

使用STM32CubeMX软件配置STM32F407开发板通过用户按键产生外部中断,然后在中断中翻转绿色LED灯的状态

3、中断系统概述

3.1、中断向量表

STM32F4系列有10个系统中断和82个可屏蔽的外部中断(注释1),除系统Reset中断外每个中断均有对应的中断服务函数

3.2、中断优先级

嵌套向量中断控制器(NVIC)采用4位二进制数表示中断优先级,这4位二进制数表示的中断优先级又分为了抢占优先级和次优先级,其中根据抢占优先级所使用的二进制位数分成了5个组,分为NVIC_PRIORITYGROUP_0 ~ NVIC_PRIORITYGROUP_4,分别表示抢占优先级使用0~4位二进制数表示,具体规则如下几点所述:

① 高抢占优先级的中断可以打断低抢占优先级的中断

② 抢占优先级和次优先级均相同的两个中断谁先发生谁就先执行

③ 抢占优先级相同但次优先级不同的两个中断,后触发的中断需要等待先触发的中断执行完毕才可以执行

4、实验流程

4.0、前提知识

STM32F407一共有23个外部中断,其中包含16个外部中断(EXTI0~EXTI15)和7个对应不同的事件的中断,如下表所示

每一组GPIO的0号引脚均可以作为EXTI0的输入,同理,每一组GPIO的15号引脚均可以作为EXTI15的输入,具体映射如下图所示(注释2)

4.1、CubeMX相关配置

请先阅读“STM32CubeMX 工程建立”实验3.4.1小节配置RCC和SYS

4.1.1、时钟树配置

系统时钟树设置为STM32F407各个总线能达到的最高时钟频率,具体如下图所示

4.1.2、外设参数配置

在Pinout & Configuration页面右边单片机引脚预览Pinout view中,寻找需要设置的具体GPIO,这里我们仍然选择用户按键的PA0引脚,但是右键单击将其配置为GPIO_EXTI0

在页面的中间GPIO Mode and Configuration栏中选中PA0引脚,然后在下方对其引脚进行配置,外部中断主要配置GPIO模式和GPIO Pull-up/Pull-down,GPIO模式有外部中断上升沿、下降沿、上/下降沿触发、外部事件上升沿、下降沿和上/下降沿触发共计6中模式,这里我们使用的是外部中断,并且在按键按下松开时既会产生上升沿也会产生下降沿,因此笔者这里选择下降沿触发的外部中断模式,具体配置如下图所示

4.1.3、外设中断配置

将引脚配置为中断模式后,还需要在NVIC中启动其具体的中断,单击页面左侧的NVIC配置,选择合适的中断优先级组,然后启动对应的中断,这里即用户按键引脚PA0的中断EXTline0 interrupt,具体配置如下图所示

4.2、生成代码

请先阅读“STM32CubeMX 工程建立”实验3.4.3小节配置Project Manager

单击上图页面右上角GENERATE CODE重新生成工程

当仅仅配置了引脚为外部中断模式,而不启动对应的外部中断时,在生成的代码引脚初始化函数MX_GPIO_Init中只会增加如下图框中所示的代码,此时由于未使能中断,因此中断不能正常响应

当配置了引脚为外部中断模式,且使能了引脚对应的中断,首先会在HAL_Init(void)函数中设置中断优先级组(系统默认开启了一些中断,因此即使我们不使能外部中断该函数也会被其他开启的中断调用从而设置中断优先级组)

另外除了上述的引脚模式设置代码外,还会在引脚初始化函数MX_GPIO_Init中新增加中断优先级设置及对应中断使能的函数

然后在stm32f4xx_it.c文件中会出现对应的中断服务子函数void EXTI0_IRQHandler(void)(注释3),中断服务子函数中调用了HAL_GPIO_EXTI_IRQHandler(GPIO_Pin)函数,跳转过去在函数内部执行了 ① 检测该中断线是否有挂起的外部中断 ② 如果有则清除挂起的外部中断线 ③ 然后调用外部中断回调函数HAL_GPIO_EXTI_Callback(GPIO_Pin)(此函数为虚函数,可由用户自定义),具体流程如下图所示

此时用户只需要重新实现HAL_GPIO_EXTI_Callback(GPIO_Pin)函数即可,在该函数体内可以实现中断触发后想要实现的功能代码,笔者将该函数重新实现在了gpio.c中,值得注意的是在外部中断回调函数中使用到了HAL库延时函数来对按键消抖,此处可能会存在严重的问题(注释4),具体代码如下图所示

源代码如下

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin == USER_KEY_Pin)
{
HAL_Delay(10);
HAL_GPIO_TogglePin(GREEN_LED_GPIO_Port, GREEN_LED_Pin);
}
}

5、常用函数

/*所有外部中断触发回调服务子函数,通过GPIO_Pin判断是哪个中断线,然后在函数体内做相应动作*/
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)

6、烧录验证

6.1、具体步骤

“初始化LED引脚为输出 -> 初始化用户按键为外部中断模式 -> 启动对应外部中断 -> 重新实现HAL_GPIO_EXTI_Callback(GPIO_Pin)函数 -> 在函数中实现翻转绿色LED灯状态”,具体代码参看上述4.2

6.2、实验现象

烧录程序,然后可以观察到当开发板上电后,四个颜色LED全部点亮,然后每按下一次用户按键,绿色LED灯状态均会发生翻转

7、注释解析

注释1:具体的中断向量表可以在keil工程目录启动文件startup_stm32f407xx.s中查看,这里的中断数量笔者是根据启动文件中的数量计算的,其中Reserved的中断向量未计数

注释2:图片来自STM32F4xx中文参考手册.pdf

注释3:以后对于每一个外设中断,启用后都会在stm32f4xx_it.c文件中找到对应的中断服务函数

注释4:HAL库延时函数HAL_Delay使用的是系统滴答定时器作为时间基准,而系统滴答定时器同为中断,在外部中断中触发系统滴答定时器中断会涉及中断优先级的问题,此时需保证滴答定时器的抢占优先级高于我们所使用的外部中断,否则会出现卡死的现象发生

更多内容请浏览 OSnotes的CSDN博客

STM32CubeMX教程4 EXTI 按键外部中断的更多相关文章

  1. STM32 EXTI(外部中断)

    一.EXTI 简介 EXTI(External interrupt/event controller)-外部中断/事件控制器,管理了控制器的 20个中断/事件线.每个中断/事件线都对应有一个边沿检测器 ...

  2. STM32本学习笔记EXTI(外部中断)

    参考资料:STM32数据表.网络信息 =========================================切割线===================================== ...

  3. STM32学习笔记之EXTI(外部中断)

    參考资料:STM32数据手冊.网络资料 =========================================切割线==================================== ...

  4. 第17章 EXTI—外部中断/事件控制器

    第17章     EXTI—外部中断/事件控制器 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.co ...

  5. 第17章 EXTI—外部中断/事件控制器—零死角玩转STM32-F429系列

    第17章     EXTI—外部中断/事件控制器 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.co ...

  6. STM32 外部中断

    1)STM32一般有19 个外部中断为: 线 0~15:对应外部 IO 口的输入中断.线 16:连接到 PVD 输出. 线 17:连接到 RTC 闹钟事件. 线 18:连接到 USB 唤醒事件. 2) ...

  7. STM32之EXTI——外部中断

    互联网的广大网友,大家早上中午晚上好.EXTI...故名思义..EX表外,出..I表示Intrrupt..所以合起来就是外部中断...说到这..我觉得我最近的六级水平(背单词)又进了一步,稍微自夸了下 ...

  8. EXTI—外部中断/事件控制器

    外部中断/事件控制器(EXTI)管理了控制器的 23 个中断/事件线.每个中断/事件线都对应有一个边沿检测器,可以实现输入信号的上升沿检测和下降沿的检测. EXTI 可以实现对每个中断/事件线进行单独 ...

  9. STM32基本GPIO操作:按键输入(扫描+外部中断)

    (涉及专有名词较多,难免解释不到位,若有错误还请指出,谢谢!) 硬件连接图如下: 一.扫描 思路是在main函数中通过死循环来扫描端口电平状态检测,以此判断按键是否按下.实现较为简单. 1.初始化(注 ...

  10. 【CC2530入门教程-03】CC2530的中断系统及外部中断应用

    第3课  CC2530的中断系统及外部中断应用 广东职业技术学院  欧浩源 一.中断相关的基础概念  内核与外设之间的主要交互方式有两种:轮询和中断. 轮询的方式貌似公平,但实际工作效率很低,且不能及 ...

随机推荐

  1. springBoot使用注解Aop实现日志模块

    我们在日常业务操作中需要记录很多日志,可以在我们需要的方法中对日志进行保存操作,但是对业务代码入侵性大.使用切面针对控制类进行处理灵活度不高,因此我们可以使用自定义注解来针对方法进行日志记录 1.注解 ...

  2. 聊聊基于Alink库的决策树模型算法实现

    示例代码及相关内容来源于<Alink权威指南(Java版)> 概述 决策树模型再现了人们做决策的过程,该过程由一系列的判断构成,后面的判断基于前面的判断结果,不断缩小范围,最终推出结果. ...

  3. 聊聊JDK19特性之虚拟线程

    1.前言 在读<深入理解JVM虚拟机>这本书前两章的时候整理了JDK从1.0到最新版本发展史,其中记录了JDK这么多年来演进过程中的一些趣闻及引人注目的一些特性,在调研JDK19新增特性的 ...

  4. maven error

    1 [INFO] Assembling webapp [crm9] in [/home/wukongcrm/72crm-java/target/ROOT] 2 [INFO] Processing wa ...

  5. 今天的第二道tarjan:受欢迎的牛

    原题来自:USACO 2003 Fall 题目描述 每头奶牛都梦想成为牛棚里的明星.被所有奶牛喜欢的奶牛就是一头明星奶牛.所有奶牛都是自恋狂,每头奶牛总是喜欢自己的.奶牛之间的"喜欢&quo ...

  6. 分享一个Redis自带的压测工具:redis-benchmark

    前言 今天给xdm分享一个Redis自带的压测工具:redis-benchmark. 介绍 redis-benchmark 是一个用于测试 Redis性能的基准测试工具,可以帮助开发人员评估和比较 R ...

  7. Util应用框架快速入门(4) - 集成测试开发入门

    本文演示Util应用框架开发的项目中如何编写集成测试. 准备 完成 Web Api 快速入门,本文将在之前生成的示例项目上讲解集成测试的开发. 测试概述 自动化测试对于Util应用框架的开发非常重要, ...

  8. 9.24 多校联测 Day4 总结

    没有罚坐,但好像什么也没做. 反向挂分,RP++. 开考推 T1 的 k=2.推推推,写写写,假了.又假了.还是假的. 此时已过去 1h,开 T2,没有看懂题,又看了一会依旧没有看懂. 开 T3.尝试 ...

  9. java值传递机制

    目录 1. 基本数据类型 2. 引用数据类型 3. 总结 1. 基本数据类型 public class ValueTransferTest { public static void main(Stri ...

  10. PTA乙级1039(C++)散列表解法

    题目 1039 到底买不买  小红想买些珠子做一串自己喜欢的珠串.卖珠子的摊主有很多串五颜六色的珠串,但是不肯把任何一串拆散了卖. 于是小红要你帮忙判断一下,某串珠子里是否包含了全部自己想要的珠子?如 ...