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

这篇具有很好参考价值的文章主要介绍了基于STM32CubeMX与keil采用按键外部中断方式控制LED与蜂鸣器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

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

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


1. 电路原理图理解

1.1 LED与KEY原理图理解

基于STM32CubeMX与keil采用按键外部中断方式控制LED与蜂鸣器,# STM32相关学习,stm32,嵌入式硬件,单片机
基于STM32CubeMX与keil采用按键外部中断方式控制LED与蜂鸣器,# STM32相关学习,stm32,嵌入式硬件,单片机
基于STM32CubeMX与keil采用按键外部中断方式控制LED与蜂鸣器,# STM32相关学习,stm32,嵌入式硬件,单片机

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蜂鸣器

基于STM32CubeMX与keil采用按键外部中断方式控制LED与蜂鸣器,# STM32相关学习,stm32,嵌入式硬件,单片机
基于STM32CubeMX与keil采用按键外部中断方式控制LED与蜂鸣器,# STM32相关学习,stm32,嵌入式硬件,单片机

要想蜂鸣器一开始不响,这里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。
基于STM32CubeMX与keil采用按键外部中断方式控制LED与蜂鸣器,# STM32相关学习,stm32,嵌入式硬件,单片机

LED0,LED1,BEEP对应的引脚分别设置为GPIO_Output,
基于STM32CubeMX与keil采用按键外部中断方式控制LED与蜂鸣器,# STM32相关学习,stm32,嵌入式硬件,单片机

GPIO引脚配置

对于KEY配置

基于STM32CubeMX与keil采用按键外部中断方式控制LED与蜂鸣器,# STM32相关学习,stm32,嵌入式硬件,单片机

LED和BEEP配置
基于STM32CubeMX与keil采用按键外部中断方式控制LED与蜂鸣器,# STM32相关学习,stm32,嵌入式硬件,单片机

中断使能

基于STM32CubeMX与keil采用按键外部中断方式控制LED与蜂鸣器,# STM32相关学习,stm32,嵌入式硬件,单片机

配置外部晶振

基于STM32CubeMX与keil采用按键外部中断方式控制LED与蜂鸣器,# STM32相关学习,stm32,嵌入式硬件,单片机
Debug
调试的接口,看你自己的调试接口设备,一般都是SerialWire。

基于STM32CubeMX与keil采用按键外部中断方式控制LED与蜂鸣器,# STM32相关学习,stm32,嵌入式硬件,单片机

时钟树配置

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

基于STM32CubeMX与keil采用按键外部中断方式控制LED与蜂鸣器,# STM32相关学习,stm32,嵌入式硬件,单片机
代码生成

这里因为是以keil为代码平台,所以这里选择MDK-ARM
基于STM32CubeMX与keil采用按键外部中断方式控制LED与蜂鸣器,# STM32相关学习,stm32,嵌入式硬件,单片机

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

基于STM32CubeMX与keil采用按键外部中断方式控制LED与蜂鸣器,# STM32相关学习,stm32,嵌入式硬件,单片机
配置完成后点击右上角的基于STM32CubeMX与keil采用按键外部中断方式控制LED与蜂鸣器,# STM32相关学习,stm32,嵌入式硬件,单片机即可生成目标项目的代码。

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

基于STM32CubeMX与keil采用按键外部中断方式控制LED与蜂鸣器,# STM32相关学习,stm32,嵌入式硬件,单片机


4. 代码编写

4.1 代码编写思路

按键触发外部中断都是通过对应的中断服务程序进行的。
比如下图中的EXTI4_IRQHandle(void)函数,这个函数是在KEY0按下的时候调用的中断服务程序。
其他的EXTI2和3都是同理。
基于STM32CubeMX与keil采用按键外部中断方式控制LED与蜂鸣器,# STM32相关学习,stm32,嵌入式硬件,单片机
基于STM32CubeMX与keil采用按键外部中断方式控制LED与蜂鸣器,# STM32相关学习,stm32,嵌入式硬件,单片机
我们看到所有的中断服务程序最终都会去调用`HAL_GPIO_EXTI_IRQHandler(xxx)这个函数,那么找到这个函数的定义

基于STM32CubeMX与keil采用按键外部中断方式控制LED与蜂鸣器,# STM32相关学习,stm32,嵌入式硬件,单片机

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

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

再查找这个函数定义。
基于STM32CubeMX与keil采用按键外部中断方式控制LED与蜂鸣器,# STM32相关学习,stm32,嵌入式硬件,单片机
我们发现这是个弱函数,也就是可以拿来重写的接口。
所以我们对中断触发完之后的所有对应操作其实都可以写在这个回调函数里。表示我每触发一次中断,就要干嘛干嘛。


4.2 重写回调函数

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

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

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

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

基于STM32CubeMX与keil采用按键外部中断方式控制LED与蜂鸣器,# STM32相关学习,stm32,嵌入式硬件,单片机

回调函数源码:

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的,所以这个烧写器可能得按照自己对应的烧写器来改一下。

基于STM32CubeMX与keil采用按键外部中断方式控制LED与蜂鸣器,# STM32相关学习,stm32,嵌入式硬件,单片机

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

基于STM32CubeMX与keil采用按键外部中断方式控制LED与蜂鸣器,# STM32相关学习,stm32,嵌入式硬件,单片机

TIPS

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

如果你想Keil自动补全,像下面这样。
基于STM32CubeMX与keil采用按键外部中断方式控制LED与蜂鸣器,# STM32相关学习,stm32,嵌入式硬件,单片机

那就
基于STM32CubeMX与keil采用按键外部中断方式控制LED与蜂鸣器,# STM32相关学习,stm32,嵌入式硬件,单片机
基于STM32CubeMX与keil采用按键外部中断方式控制LED与蜂鸣器,# STM32相关学习,stm32,嵌入式硬件,单片机

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

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


总结

这篇博客很久以前就开了个头一直没有完善,虽然比较简单,但对中断的整个调用过程以及STM32CubeMX+Keil的配合使用流程做了详细阐述。总的来说写下来收获还是可以的。文章来源地址https://www.toymoban.com/news/detail-571751.html

到了这里,关于基于STM32CubeMX与keil采用按键外部中断方式控制LED与蜂鸣器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32 HAL库 STM32CubeMx -- 外部中断

    中断,是指处理机处理程序运行中出现的紧急事件的整个过程。程序运行过程中,系统外部、系统内部或者现行程序本身若出现紧急事件,处理机立即中止现行程序的运行,自动转入相应的处理程序(中断服务程序),待处理完后,再返回原来的程序运行,这整个过程称为程序

    2024年02月08日
    浏览(37)
  • 最详细STM32,cubeMX外部中断

    这篇文章将详细介绍 cubeMX外部中断的配置,实现过程。 实验开发板:STM32F103C8T6。 所需软件:keil5 , cubeMX 。 实验目的:外部中断的意义,cubeMX配置和实现 等 。 对于外部中断的基础知识,可以参考我之前的文章:STM32 EXTI外部中断 选择芯片。 配置仿真。(如果不配置,程序

    2024年02月19日
    浏览(29)
  • 【STM32】外部中断实现按键实验

    🐱作者:一只大喵咪1201 🐱专栏:《STM32学习》 🔥格言: 你只管努力,剩下的交给时间! 在前面的文章控制LED和蜂鸣器的按键实验中详细的讲解了怎样通过GPIO的输入模式来控制LED灯和蜂鸣器的状态。这篇文章同样是实现上诉的功能,但是方式是采用外部中断的方式实现的

    2024年02月05日
    浏览(40)
  • STM32开发(9)----CubeMX配置外部中断

    本章介绍使用STM32CubeMX对引脚的外部中断进行配置,介绍了中断架构体系,外部中断/事件控制器(EXTI),嵌套向量中断控制器(NIVC),并通过实验展示配置后的效果。 中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理

    2024年02月15日
    浏览(39)
  • STM32CubeMX学习三 之外部中断

    记录一下STM32CubeMX的学习笔记,同时分享给初学的小白,希望一起进步。 如何使用STM32CubeMX以及工程创建在之前的博客有提到,这里就直接从外部中断讲起。 编译环境:KEIL 代码生成:STM32CubeMX 库:HAL MCU:STM32F072 假设你的cubeMX工程已经建好,这里我们配置KEY1、KEY2、KEY3三个按

    2023年04月08日
    浏览(32)
  • HAL库(STM32CubeMX)之外部中断(STM32F103C8T6)

    HAL库(STM32CubeMX)——ADC学习总结(包含单次/连续模式下的轮询/中断/DMA)(蓝桥杯STM32G431RBT6) HAL库(STM32CubeMX)——DAC学习(STM32G431RBT6) HAL库(STM32CubeMX)——USART配置(中断接收/STM32G431RBT6) HAL库(STM32CubeMX)——基本定时器、PWM、输入捕获、输出比较、互补式PWM等综合学习(STM32

    2024年02月06日
    浏览(40)
  • STM32G030C8T6:使用按键控制LED亮灭(外部中断)

    本专栏记录STM32开发各个功能的详细过程,方便自己后续查看,当然也供正在入门STM32单片机的兄弟们参考; 本小节的目标是,系统主频64 MHZ,采用高速外部晶振,通过KEY1 按键的PA0 引脚配置成中断输入引脚,PB9引脚配置成输出,每次按键,PA0 引脚就会进入一次外部中断,每进

    2024年02月05日
    浏览(35)
  • 【STM32 CubeMX】I2C中断方式与DMA方式

    在STM32 CubeMX环境中,I2C(Inter-Integrated Circuit)通信协议的实现可以采用中断方式或DMA(Direct Memory Access)方式。中断方式通过触发中断来处理数据传输,而DMA方式则利用直接内存访问技术来实现数据传输,减轻了CPU的负担。在选择I2C通信方式时,开发者需要根据具体的应用需

    2024年02月20日
    浏览(33)
  • stm32串口通信(PC--stm32;中断接收方式;附proteus电路图;开发方式:cubeMX)

     单片机型号STM32F103R6: 最后实现的效果是,开机后PC内要求输入1或0,输入1则打开灯泡,输入0则关闭灯泡,输入其他内容则显示错误,值得注意的是这个模拟的东西只能输入英文 之所以用2个LED灯是因为LED电阻粗略一算就是100欧姆,所以懒得再去画其他的东西,真是天助我也

    2024年02月11日
    浏览(42)
  • STM32纯中断方式发送接收数据(串行通信;keil arm5;)

    除了main文件其他文件均无修改,正常运行--在keil arm5内

    2024年02月09日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包