基于STM32CubeMX与keil采用按键外部中断方式控制LED与蜂鸣器

news2025/2/5 12:39:16

文章目录

  • 前言
  • 1. 电路原理图理解
    • 1.1 LED与KEY原理图理解
    • 1.2 BEEP蜂鸣器
  • 2. 外部中断配置阐述
  • 3. STM32CubeMX配置
  • 4. 代码编写
    • 4.1 代码编写思路
    • 4.2 重写回调函数
  • TIPS
  • 总结

前言

这篇文章详细记录外部中断方式控制LED的亮灭以及蜂鸣器的开关;本文从原理图开始到最后实现功能,内容详细。
本栏目的所有都是基于STM32F407ZET6芯片,博主采用的是普中的天马F407开发板。

实现功能:LED0与LED1默认点亮,蜂鸣器默认关闭。按下按键KEY0,控LED0亮灭;按下按键KEY1,控制LED1亮灭;
按下按键KEY2控制蜂鸣器开关。


1. 电路原理图理解

1.1 LED与KEY原理图理解

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

LED部分:
3.3V电压经过一个电阻R12连到DS0发光二极管,如果VCC和LED0对应的引脚之间存在压降,则DS0导通,发光。
3.3V电压经过一个电阻R14连到DS1发光二极管,如果VCC和LED1对应的引脚之间存在压降,则DS1导通,发光。

因此我们要先让LED发光的话,要让LED0和LED1标号对应的引脚输出低电平,才能确保LED0和LED1发光,但由于我们默认状态是LED亮的,所以这里都先要制为高电平。

KEY部分:
KEY0-2三个按键一端都接地,所以KEY0-2都需要先拉高。因为要通过电平的上升或下降沿触发中断,所以必须要有电平的变化。
那如果我们想用KEY_UP也可以,只不过要默认拉低。

1.2 BEEP蜂鸣器

在这里插入图片描述
在这里插入图片描述

要想蜂鸣器一开始不响,这里BEEP的引脚初始状态应该为0,理由如下:

  1. Q2是NPN型三极管,只有集电极到发射机这一段导通到地,蜂鸣器PG之间才有压降,蜂鸣器才会响。
  2. 要想蜂鸣器一开始不响,那就是NPN三极管不导通,基极应该没有电流,没有压降。
  3. 因为R38接地,所以R38上面这个点的电压为0,即三极管基极电压已经为0,如果BEEP这一端的电压为3.3V,通过电阻R37就会产生电流,就会导致三极管导通,蜂鸣器会响。

2. 外部中断配置阐述

用STM32CubeMX来配置外部中断的话就非常方便,只需要选择需要配置的引脚,将其设置为外部中断的模式,接着对它进行使能,后面一个CodeGenerate就自动配置好了,这比标准库自己配置要快很多。
这个外部中断和串口传输中断稍有些不一样,前者是一直都可以触发,后者我在使用的时候是使能一次触发一次。提及这个是因为和后面写回调函数这种稍有区别。

3. STM32CubeMX配置

这三个KEY引脚分别设置为外部中断,这里KEY2对应GPIO_EXIT2,KEY1对应GPIO_EXIT3,KEY0对应GPIO_EXIT4。
在这里插入图片描述

LED0,LED1,BEEP对应的引脚分别设置为GPIO_Output,
在这里插入图片描述

GPIO引脚配置

对于KEY配置

在这里插入图片描述

LED和BEEP配置
在这里插入图片描述

中断使能

在这里插入图片描述

配置外部晶振

在这里插入图片描述
Debug
调试的接口,看你自己的调试接口设备,一般都是SerialWire。

在这里插入图片描述

时钟树配置

这里把最终的时钟设为最大的,软件会自动选择时钟源以及分频器系数。

在这里插入图片描述
代码生成

这里因为是以keil为代码平台,所以这里选择MDK-ARM
在这里插入图片描述

下面的两个选项看个人喜好勾选,这里只是做一个介绍。

在这里插入图片描述
配置完成后点击右上角的在这里插入图片描述即可生成目标项目的代码。

下图是生成的目标代码,我们对中断的配置主要在紫色框的源文件内,代码的框架如红色框所示。

在这里插入图片描述


4. 代码编写

4.1 代码编写思路

按键触发外部中断都是通过对应的中断服务程序进行的。
比如下图中的EXTI4_IRQHandle(void)函数,这个函数是在KEY0按下的时候调用的中断服务程序。
其他的EXTI2和3都是同理。
在这里插入图片描述
在这里插入图片描述
我们看到所有的中断服务程序最终都会去调用`HAL_GPIO_EXTI_IRQHandler(xxx)这个函数,那么找到这个函数的定义

在这里插入图片描述

我们会发现所有的对应的外部中断其实最终都是调用这个函数,只不过传的引脚参数不一样。引脚参数的不同,就对不同的引脚的外部中断使用不同的中断服务程序。

每一个中断服务程序不论是什么参数,都会调用HAL_GPIO_EXTI_Callback(GPIO_Pin)这个函数,也就是中断触发完了之后的回调函数。这个是什么意思呢?就是我按键按下以后,触发了外部中断,告知系统外部中断触发完了之后要做什么?

再查找这个函数定义。
在这里插入图片描述
我们发现这是个弱函数,也就是可以拿来重写的接口。
所以我们对中断触发完之后的所有对应操作其实都可以写在这个回调函数里。表示我每触发一次中断,就要干嘛干嘛。


4.2 重写回调函数

既然已经知道代码修改哪里了,那么无非就是重写回调函数。
我们需要实现的功能这里再列举一下:

LED0与LED1默认点亮,蜂鸣器默认关闭。按下按键KEY0,控LED0亮灭;按下按键KEY1,控制LED1亮灭;
按下按键KEY2控制蜂鸣器开关。

那我这里无非就是判断是哪个中断触发了,然后对应的状态调整一下即可。

我们KEY0按下,那就是把LED0从亮变成暗,即翻转一下电平。
其他同理。

在这里插入图片描述

回调函数源码:

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	switch(GPIO_Pin){
		case KEY0_Pin:
		{
			 HAL_GPIO_TogglePin(LED0_GPIO_Port,LED0_Pin);
				break;
		}
		case KEY1_Pin:
		{
				HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);
			break;
		}
		case KEY2_Pin:
		{
				HAL_GPIO_TogglePin(BEEP_GPIO_Port,BEEP_Pin);
			break;
		}
	}
}

剩下的就是编译烧录运行了,这里就不再阐述。
如果编译出现错误,可以参考我的博客:STM32 keil烧录出现program algorithm出错问题

因为买的是普中天马F407ZET6,送的调试烧录器是DAP的,所以这个烧写器可能得按照自己对应的烧写器来改一下。

在这里插入图片描述

如果你的是STlink的,那就根据自己的调试器进行修改吧

在这里插入图片描述

TIPS

keil5的自动补全确实不怎么滴,我同样的配置方法,在不同电脑上竟然会出现补全没作用的情况。
但我的台式机自动补全又没事,有点搞人。

如果你想Keil自动补全,像下面这样。
在这里插入图片描述

那就
在这里插入图片描述
在这里插入图片描述

如果左边的没有,那就重装一个keil,主要不要汉化版。汉化版的确实没有这个自动补全。

如果这样设置还是不行,那就再生成一个STM32CubeIDE的工程,代码什么的弄成一样,用STM32IDE编写,毕竟那个自动补全做的好,只不过调试器就被限定了,必须得是ST公司的全家桶。如果你想像我的一样使用DAP这种店家送的调试器,还是得用keil。


总结

这篇博客很久以前就开了个头一直没有完善,虽然比较简单,但对中断的整个调用过程以及STM32CubeMX+Keil的配合使用流程做了详细阐述。总的来说写下来收获还是可以的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/761581.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

工作日记20230714

1、报文id定义对,类库中和tracking中的报文长度定义一致,但是和一级那边的报文长度定义不一致,对方有可能会收到报文,但是发送方在发出数据后程序会自动中止。 2、结构体 如果定义结构体List的话,不用在()加初始值&a…

分享一下使用finalshell连接虚拟机失败的经历

今天在使用finalshell连接安装的Ubuntu的时候遇到了一点问题,通过root用户连接的时候一直连接失败。 然后照着网上的解决方式一个个试 一、安装oppenssh -server sudo apt-get install openssh-server 然后重启ssh sudo service ssh restart 二、设置密码 最后发…

【架构设计】谈谈防腐层的妙用

文章目录 前言一、一个简单的例子二、防腐层介绍总结 前言 最近在学习了解领域驱动模型DDD相关的内容,但是由于没有实际的项目支撑,所以大都是停留在一些理论层面。我发现这里面的一些设计思想还是非常有实用价值的,可以直接应用于你目前的项…

基于ssm+mybatis+mysql+jsp机票预定系统

基于ssmmybatismysqljsp机票预定系统 一、系统介绍二、功能展示1.主页2.个人中心3.用户管理(管理员)4.客机管理(管理员)5.航班管理(管理员)6.机票管理(管理员) 三、其它系统四、获取源码 一、系统介绍 系统…

nacos设置服务权重

nacos设置服务权重

飞行动力学 - 第8节-着陆性能 之 基础点摘要

飞行动力学 - 第8节-着陆性能 之 基础点摘要 1. 着陆性能1.1 空中直线段S11.2 拉平段S21.3 地面滑跑段S3 2. 着陆性能改善方法3. 起飞性能列举4. 参考资料 1. 着陆性能 总体距离S S1 S2 S3,越短性能越佳。 1.1 空中直线段S1 1.2 拉平段S2 1.3 地面滑跑段S3 2. 着…

三分钟了解Redis HyperLogLog 数据结构

文章目录 0. 前言1. 原理1.2 原理解析 2.实战案例3. Redis从入门到精通系列文章4. 常见问题4.1. 什么是Redis HyperLogLog?4.2. HyperLogLog算法的核心思想是什么?4.3. HyperLogLog算法的误差率如何控制?4.4. HyperLogLog算法的存储空间大小与…

超图数据集概念学习1

以前写过一些数据源数据集有关的博文;从头学习一下; 数据集是同种类型数据的集合,比如:点数据集、线数据集。根据数据类型的不同,分为矢量数据集、格网数据集和影像数据集,以及为了处理特定问题而设计的如路…

​CentOS防火墙操作命令 ​

CentOS防火墙操作命令 1、查看防火墙服务状态 systemctl status firewalld.service 或者查看防火墙的状态: 1 firewall-cmd --state 2、开启、重启防火墙 启动firewall: 1 systemctl start firewalld.service 设置开机自启或禁用: …

【Ceph】基于ceph-deploy部署Ceph集群详解

基于ceph-deploy部署Ceph集群详解 1. 存储基础1.1 单机存储设备1.1.1 单机存储的问题1.1.2 商业存储解决方案 1.2 分布式存储(软件定义的存储SDS)1.2.1 分布式存储的类型 2. Ceph简介2.1 Ceph优势2.2 Ceph架构2.2.1 高层应用接口 2.3 Ceph核心组件2.3.1 …

CTFShow-WEB入门篇文件上传详细Wp(151-170)

WEB入门篇--命令执行详细Wp 文件上传:Web151:Web152:Web153:Web154:Web155:Web156:Web157:Web158:Web159:Web160:Web161:Web162&#…

Java:基本数据类型 和 所占大小

目录 java基本程序结构命名注释数据类型 和 大小整数类型浮点char编码boolean 变量常量final 的作用 java基本程序结构 命名 小驼峰:第一个单词小写,后面的单词大写。 大驼峰:每个单词都大写。 变量,方法:小驼峰。 j…

046、TiDB特性_内存悲观锁(了解)

悲观锁 传统悲观锁有两个性能问题: 磁盘io 需要将lock 的信息持久化到 lock CF中,这个时候产生磁盘io网络io 因为每个Region都是多副本,需要将信息通过网络 发送到Follower的lock CF中。 内存悲观锁 为了解决上面两个问题。 就有个内存悲观…

RPC学习笔记

1、Remote Procedure Call RPC的主要目标是让构建分布式更容易,在提供强大的远程调用能力时不损失本地调用的语义简洁性。为实现该目标,RPC框架需要提供一种透明的调用机制,让使用者不必显示的区别本地调用和远程调用。RPC不是一个协议或者方…

CodeArts Check系统规则集还不够?带你体验如何创建、启用自定义规则集

代码检查(CodeArts Check)是基于云端实现的代码检查服务。建立在多年自动化源代码静态检查技术积累与企业级应用经验的沉淀之上,为用户提供代码风格、通用质量与网络安全风险等丰富的检查能力,提供全面质量报告、便捷闭环处理问题…

BTY生态系统DNS关于DeSoc的构想

2022年5月,以太坊创始人Vitalik Buterin与经济学家Glen Weyl和Flashbots研究员Puja Ohlhaver联合发布了《Decentralized Society: Finding Web3’s Soul》。这篇论文的核心是围绕“Web3灵魂”创造出去中心化社会的可能性。 论文中阐述,当下Web3 更多是表…

Java语言基础

目录 一.代码注释 二.变量与常量 1.标识符 2.关键字 3.变量 4.常量 三.基本数据类型 1.整数类型 2.浮点类型 3.字符类型 1.char型 2.转义字符 4.布尔类型 一.代码注释 在代码中添加注释能提高代码的可读性。注释中包含了程序的信息,可以帮助程序员更…

前端学习——JS进阶 (Day3)

编程思想 面向过程编程 面向对象编程 (oop) 构造函数 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport…

第一阶段-第十章 Python基础的综合案例(数据可视化-折线图可视化)

目录 一、本章的案例介绍  1.可视化案例&#xff08;本章&#xff09;的学习目标  2.需要实现的效果图  3.数据来源 二、json数据格式  1.学习目标  2.什么是json  3. json的作用  4.json的语法要求  5.Python数据和json数据的相互转化&#xff08;dumps转json…

卷积神经网络识别人脸项目—使用百度飞桨ai计算

卷积神经网络识别人脸项目的详细过程 整个项目需要的准备文件&#xff1a; 下载链接&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1WEndfi14EhVh-8Vvt62I_w 提取码&#xff1a;7777 链接&#xff1a;https://pan.baidu.com/s/10weqx3r_zbS5gNEq-xGrzg 提取码&#x…