【STM32F4】HAL库 CubeMX(四)--------外部中断实验_stm32f4 外部中断 hal-程序员宅基地

技术标签: stm32  单片机  


# 前言 我们前面学习了通过IO的输入模式达到按键控制效果,这里我们将介绍 STM32F4 外部 IO 口的中断功能,通过中断的功能,达到同样的效果,即: 通过板载的 4 个按键,控制板载的两个 LED 的亮灭以及蜂鸣器的发声。

一、外部中断是什么?

STM32F4 的每个 IO 都可以作为外部中断的中断输入口,这点也是 STM32F4 的强大之处。STM32F407 的中断控制器支持 22个外部中断/事件请求。每个中断设有状态位,每个中断/事件都有独立的触发和屏蔽设置。
STM32F407 的 22 个外部中断为:
EXTI 线 0~15:对应外部 IO 口的输入中断。
EXTI 线 16:连接到 PVD 输出。
EXTI 线 17:连接到 RTC 闹钟事件。
EXTI 线 18:连接到 USB OTG FS 唤醒事件。
EXTI 线 19:连接到以太网唤醒事件。
EXTI 线 20:连接到 USB OTG HS(在 FS 中配置)唤醒事件。
EXTI 线 21:连接到 RTC 入侵和时间戳事件。
EXTI 线 22:连接到 RTC 唤醒事件

二、外部中断实验

1.引脚配置

1、根据原子实验,外部中断是以按键触发,所以LED、BEEP的配置跟按键实验相同。
在这里插入图片描述
2、对于四个按键,在图示区分别点击中断配置GPIO_EXTIX
在这里插入图片描述
3、在参数配置区配置
在这里插入图片描述
4、在GPIO的NVIC选项中,使能四根中断线
在这里插入图片描述

2.时钟配置

3.生成代码

1、为了可读性更高,同样采用Define定义的方式
在这里插入图片描述

#define LED0_Reversal()	HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_9)//LED0
#define LED1_Reversal()	HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_10)//LED1
#define BEEP__Reversal() HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_8)//BEEP

#define KEY0 HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_4)//PE4
#define KEY1 HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_3)//PE3
#define KEY2 HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_2)//PE2
#define WK_UP HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)//PA0

2、在main.c中添加中断服务函数
在这里插入图片描述

/*
KEY0 GPIO_PIN_4->PE4
KEY1 GPIO_PIN_3->PE3
KEY2 GPIO_PIN_2->PE2
WK_UP GPIO_PIN_0->PA0
*/
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    
	if(GPIO_Pin == GPIO_PIN_0) //WK_UP被按下
	{
    
		HAL_Delay(10);
		if(WK_UP == 1)	BEEP__Reversal();
	}
	else if(GPIO_Pin == GPIO_PIN_2)//KEY被按下
	{
    
		HAL_Delay(10);
		if(KEY2 == 0)	LED0_Reversal();
	}
	else if(GPIO_Pin == GPIO_PIN_3)//KEY1被按下
	{
    
		HAL_Delay(10);
		if(KEY1 == 0)	LED1_Reversal();
	}
	else if(GPIO_Pin == GPIO_PIN_4)//KEY0被按下
	{
    
		HAL_Delay(10);
		if(KEY0 == 0)	
		{
    
			LED0_Reversal();
			LED1_Reversal();
		}
	}
}

3、至此,本次实验即可完成实验要求,在主函数内不需要添加任何代码,均在中断内进行。

4.关于中断-------我有话要说

问:处理中断的函数在哪?
答:在这里插入图片描述
在里面的底端有函数名,对于CubeMX生成HAL库还有一个特点是,在触发中断后会先进入一个中断函数,然后它会清除标志位以及判断等完备性的操作,最后会调用一个中断回调函数,这个函数才是我们需要写的函数,我们只需要在里面写想要的操作,不需要清除标志位,是不是很方便呢!!!
问:自动清除标志位有没有什么弊端呢?
答:有的,有时在同一个地方产生不同类型的中断,所以,一定要认清不同的中断回调函数,当然也可以看中断函数的源代码,推导需要的是哪个中断回调函数!!!
问:GPIO的操作函数在哪?
答:找到gpio.h,底端有函数供您选择。


总结

关于本次实验可能会显得比较鸡肋,但是外部中断其实也是比较重要的。再学习了其他功能,相互结合,才可以体现它的价值!!!

后期会更新实际模块的博客,也会涉及外部中断┗|`O′|┛ 嗷~~!!!
在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_47877230/article/details/108952989

智能推荐

【创新课题】荔枝种植户种植决策系统:基于python爬虫荔枝电商销售数据可视化分析-程序员宅基地

文章浏览阅读549次,点赞6次,收藏21次。Python崛起并且风靡,因为优点多、应用领域广、被大牛们认可。学习 Python 门槛很低,但它的晋级路线很多,通过它你能进入机器学习、数据挖掘、大数据,CS等更加高级的领域。Python可以做网络应用,可以做科学计算,数据分析,可以做网络爬虫,可以做机器学习、自然语言处理、可以写游戏、可以做桌面应用…Python可以做的很多,你需要学好基础,再选择明确的方向。这里给大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

面试Java后端-程序员宅基地

文章浏览阅读459次,点赞2次,收藏3次。自用面试题

SpringCloud 整合 Canal+RabbitMQ+Redis 实现数据监听_springcloudstream整合rabbitmq 死信队列如何监听?-程序员宅基地

文章浏览阅读3.2k次,点赞24次,收藏26次。Canal 指的是阿里巴巴开源的数据同步工具,用于数据库的实时增量数据订阅和消费。它可以针对 MySQL、MariaDB、Percona、阿里云RDS、Gtid模式下的异构数据同步等情况进行实时增量数据同步。当前的 canal 支持源端 MySQL 版本包括 5.1.x , 5.5.x , 5.6.x , 5.7.x , 8.0.xCanal是如何同步数据库数据的呢?Canal通过伪装成mysql从服务向主服务拉取数据,所以先来了解一下MySQL的主从复制吧。_springcloudstream整合rabbitmq 死信队列如何监听?

ospf实验_ospf的loopback-程序员宅基地

本文介绍了一个OSPF实验的要求,包括规划IP地址、创建loopback接口和配置路由器的接口IP地址等。其中,R1和R5分别创建多个接口,并设置相应的IP地址。另外,还给出了一些命令示例,如配置OSPF路由器ID和在R6上配置RIP。

在windows server 2012r2下安装MySQL(新手避雷指南)_windows server 2012安装mysql-程序员宅基地

文章浏览阅读1.7k次,点赞3次,收藏6次。在windows server 2012r2下部署数据库MySQL,一路碰到各种坑,特此将其记录下来,为小伙伴扫雷,安全下车。_windows server 2012安装mysql

go闭包递归-程序员宅基地

文章浏览阅读137次。因为a()执行完后,b()没有被返回给a()的外界,只是被a()所引用,而此时a()也只会被b()引 用,因此函数a()和b()互相引用但又不被外界打扰(被外界引用),函数a和b就会被GC回收。所以直接调用a();在上面的例子中,由于闭包的存在使得函数a()返回后,a中的i始终存在,这样每次执行c(),i都是自加1后的值。从上面可以看出闭包的作用就是在a()执行完并返回后,闭包使得Javascript的垃圾回收机制GC不会收回a()所占用的资源,因为a()的内部函数b()的执行需要依赖a()中的变量i。

随便推点

【Linux】统信服务器操作系统V20 1060a-AMD64 Vmware安装_uos server 20 1060a-程序员宅基地

文章浏览阅读3.5k次,点赞112次,收藏106次。产品主要面向于我国党政军、企事业单位、教育机构,以及普通的企业型用户,着重解决客户在信息化基础建设过程中,服务端基础设施的安装部署、运行维护、应用支撑等需求。以其极高的可靠性、持久的可用性、优良的可维护性,在用户实际运营和使用过程中深受好评,是一款体现当代主流Linux服务器操作系统发展水平的商业化软件产品。添加磁盘挂载点,创建/boot ,剩下的其余分配给根目录 OOK,点击完成。开始安装,需要等待 15分钟左右了,可以活杯茶 小憩一下下。选择本地标准磁盘,存储配置选择自定义后点击完成。_uos server 20 1060a

关于操作系统设计的基本原理和设计原则-程序员宅基地

文章浏览阅读6.3k次,点赞9次,收藏16次。操作系统设计的精妙之处就在于,在底层硬件之上创造了新的抽象, 对于系统初始化来说, 它呈现了执行流到线程转化这一概念,该概念远远比它的实现细节更加重要,处理器以“取指-执行”为周期开始串行执行指令,而初始化代码将自身转化为一个并发处理系统, 这里的关键之处在于,初始化代码并不是创建一个独立的并发系统,然后跳转到新的系统。_操作系统设计

bzoj2561: 最小生成树-程序员宅基地

文章浏览阅读44次。如果出现在最小生成树上,那么此时比该边权值小的边无法连通uv。据此跑最小割(最大流)即可。#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;#define rep(i,n) for(int i=...

24 个 Docker 常见问题处理技巧-程序员宅基地

文章浏览阅读1k次。更多专业文档请访问 www.itilzj.com1Docker 迁移存储目录默认情况系统会将 Docker 容器存放在 /var/lib/docker 目录下[问题起因]今天通过监控系统,发现公司其中一台服务器的磁盘快慢,随即上去看了下,发现/var/lib/docker这个目录特别大。由上述原因,我们都知道,在/var/lib/docker中存储的都是相关于容..._24 个常见的 docker 疑难杂症处理技巧

Python_操作列表_创建food_list语句 中文-程序员宅基地

文章浏览阅读154次。1.遍历整个列表# _*_ coding:utf8 _*_magicians = ['zhangqi','zhangqiang','zhanglu']# 读取列表获取到列表中第一个值 赋值给变量 magician 然后将变量magician打印出来。# for循环语句 后面的首行缩进代码行 都是在一次的循环中执行# Python 是根据缩进来判断代码行与第一行代码的关系for magi..._创建food_list语句 中文

pyqt5 实现多窗口跳转的方法,以及ui界面代码与逻辑代码分离_pyqt5 designer多页面切换-程序员宅基地

文章浏览阅读373次,点赞3次,收藏7次。【代码】pyqt5 实现多窗口跳转的方法,以及ui界面代码与逻辑代码分离。_pyqt5 designer多页面切换

推荐文章

热门文章

相关标签