STM32按键外部中断控制LED流水灯-HAL库

2023-05-16

续上一篇《基于HAL库的32流水灯》http://t.csdn.cn/30QT4

一、硬件选用上,我们增加一个四角按键

二、原理图设计,上也增加一个开关

LED0-LED2 --------> PA0-PA2引脚

KEY1 ---------> PA3引脚

 

 三、CubeMX的设置

 在上一篇《基于HAL库的32流水灯》http://t.csdn.cn/30QT4  的基础上,在GPIO设置里增加一个按键的设置

1、我们选择上升沿触发外部中断、没有上下拉

2、在NVIC中开启EXTI3外部中断,并设置中断的响应优先级。并生成工程文件

四、代码调试

生成Keil5工程文件后,先编译一下

打开stm32f1xx_it.h,找到void EXTI3_IRQHandler(void);这就是外部中断Line3的中断处理函数

我们右键Go To Denifition Of void EXTI3_IRQHandler,可以在stm32f1xx_it.c中看到如下代码

然后再右键HAL_GPIO_EXTI_IRQHandler;和前面一样GO To一下,就会到stm32f1xx_hal_gpio.c

然后我们需要调用的就是这个一行代码,在这个函数声明前有一个__weak声明

这个声明表示这个函数一旦被重新声明,那这里的函数就自动失效,其他函数调用的时候就会找到你新定义的同名函数

然后我们就在main.c中来调用这行代码

/* USER CODE BEGIN 4 */
// 中断触发后,进入此函数,此函数称为回调函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)  // 回调函数
{
	if(GPIO_Pin == KEY1_Pin)//确定是否是KEY1键按下
	{
	   for(long i =1; i<72000;i++)//消抖
		{}
			n=!n;//逻辑非 0或者1
	}
}
/* USER CODE END 4 */

main.c

我们需要在开头给它定义一个全局变量

/* USER CODE BEGIN PM */
uint8_t n; //定义全局变量
/* USER CODE END PM */

在while循环中写入这串代码,最终我们就可以实现按键中断控制流水灯了~

  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
	
//		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);  // 灯1亮
//		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);  // 灯2灭
//		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET);  // 灯3灭
//		HAL_Delay(250); // 延时
//		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);  // 灯1亮
//		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);  // 灯2灭
//		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET);  // 灯3灭
//		HAL_Delay(250); // 延时
//		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);  // 灯1亮
//		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);  // 灯2灭
//		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET);  // 灯3灭
//		HAL_Delay(250); // 延时

	switch(n)
	{
    case 0:
	       {
                //从左到右亮
				HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,1);//写高电平,点亮第1个LED
				HAL_Delay(1000);//延时1000毫秒
			    HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,0);
						
				HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,1);
				HAL_Delay(1000);//延时1000毫秒
				HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,0);
						
				HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,1);
				HAL_Delay(1000);//延时1000毫秒
				HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,0);
			 break;
			}
		case 1:   
			 {
                 //从右到左亮
			 	 HAL_GPIO_WritePin(GPIOA,LED2_Pin,1);//写高电平,点亮第1个LED
			     HAL_Delay(1000);//延时1000毫秒
				 HAL_GPIO_WritePin(GPIOA,LED2_Pin,0);
						
			     HAL_GPIO_WritePin(GPIOA,LED1_Pin,1);
				 HAL_Delay(1000);//延时1000毫秒
				 HAL_GPIO_WritePin(GPIOA,LED1_Pin,0);
						
				 HAL_GPIO_WritePin(GPIOA,LED0_Pin,1);
				 HAL_Delay(1000);//延时1000毫秒
				 HAL_GPIO_WritePin(GPIOA,LED0_Pin,0);
			  break;
		      }
		default:
			{
				break;
			}
  }
}
  /* USER CODE END 3 */

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32按键外部中断控制LED流水灯-HAL库 的相关文章

随机推荐

  • 时序动作分割(temporal action segmentation)任务介绍

    时序动作分割任务 输入是一个未经裁剪的视频 xff0c 输出是视频中每一帧的动作类别 所以该任务可以理解为对每一帧视频进行打标签处理 xff08 类同于图片分割是给每个像素打标签 xff09 一 算法介绍 MS TCN MS TCN 43
  • 时空动作检测 (spatio-temporal action detection)

    时空动作检测 spatio temporal action detection xff1a 输入一段视频 xff0c 不仅需要识别视频中动作出现的区间和对应的类别 xff0c 还要在空间范围内用一个包围框 bounding box 标记出人
  • ActionVLAD算法详解

    文章地址 xff1a https rohitgirdhar github io ActionVLAD 代码地址 xff1a https github com rohitgirdhar ActionVLAD 该文章由CMU Adobe 法国国
  • COCO物体检测评测方法简介

    本文从ap计算到map计算 xff0c 最后到coco 0 5 0 95 0 05 map的计算 xff0c 一步一步拆解物体检测指标map的计算方式 一 ap计算方法 一个数据集有多个类别 xff0c 对于该数据库有5个gt xff0c
  • 《ContourNet: Taking a Further Step toward Accurate Arbitrary-shaped Scene Text Detection》论文详解

    论文地址 xff1a ContourNet Taking a Further Step toward Accurate Arbitrary shaped Scene Text Detection github地址 xff1a https g
  • Docker服务重启后让容器自动启动 | restart参数

    问题 xff1a 服务器断电之后 xff0c docker服务挂掉了 xff0c 需要重启docker xff0c 但是我们重启docker后 xff0c 容器也就停止了 xff0c 不会跟随docker启动而启动 那么如果想在docker
  • RepVGG: Making VGG-style ConvNets Great Again

    文章地址 xff1a RepVGG Making VGG style ConvNets Great Again 代码地址 xff1a https github com megvii model RepVGG 文章发表于CVPR2021 xf
  • 一个强大的iOS瀑布流布局LBWaterFallLayout

    文章目录 效果图实现思路实现原理核心计算逻辑实现代码协议文件 h 文件 m 文件 使用方法 效果图 实现思路 UICollectionView的精髓就是UICollectionViewLayout UICollectionViewLayou
  • vue3使用websocket简易封装,包含错误重连机制

    websocket实现的全双工通信 xff0c 真真太香了 xff0c 以下是笔者在使用时 xff0c 自己封装的一个简易js工具 若需要源码 xff0c 请移步这里 1 初始化连接 64 description 初始化websocket
  • CentOS7.2安装pyspider

    按照pyspider官方QuickStart xff0c 安装pyspider之前先安装pip xff0c 下面命令直接摘抄了 http blog csdn net myfancysky article details 48847971 w
  • Cannot find module ‘@/xxx‘ or its corresponding type declarations.Vetur(2307)

    问题 开发 vue3 43 ts 项目 xff0c 使用了 monorepo 多个项目在同一个仓储 xff0c 但是在 script 标签里引 ts 文件报错了 xff0c vetur 插件没有应用项目下 tsconfig 配置 xff0c
  • C++学习笔记(《C++新经典》基础部分)

    文章目录 第 9 章 指针9 2 变量的指针和指向变量的指针变量9 2 3 指针变量作为函数参数 第 10 章 结构体与共用体10 1 结构体类型定义 xff0c 结构体变量的定义 引用与初始化10 1 1 定义一个结构体类型10 1 2
  • 汇编中基本的数据类型

    1 字节 xff08 DB xff09 define byte 一个字节有8位二进制组成 xff0c 其最高位是第7位 xff0c 最低位是第0位 在表示有符号数时 xff0c 最高位就是符号位 00001001 xff1d 9 10001
  • 不改HOST,另类打开谷歌搜索的方法

    Google 国内外镜像地址 xff1a http www opengg cn http www gfsoso com http www xiexingwen com http www wow com http www 886404 com
  • x86汇编指令详解

    80x86指令系统 80x86指令系统 xff0c 指令按功能可分为以下七个部分 1 数据传送指令 2 算术运算指令 3 逻辑运算指令 4 串操作指令 5 控制转移指令 6 处理器控制指令 7 保护方式指令 3 3 1数据传送指令 数据传送
  • 汇编指令解释大全

    汇编语言指令详讲 2011 05 13 17 31 32 标签 xff1a it 分类 xff1a 汇编 C C java VB编程 AAA 未组合的十进制加法调整指令 AAA ASCII Adgust for Addition 格式 AA
  • 基于 SpringBoot + Vue 实现的可视化拖拽编辑的大屏项目

    一个基于 SpringBoot 43 Vue 实现的可视化拖拽编辑的大屏项目 AJ Report AJ Report由 安吉加加 开源的一个BI平台 xff0c 酷炫大屏展示 xff0c 能随时随地掌控业务动态 xff0c 让每个决策都有数
  • 汇编语言总结笔记

    汇编语言初识 xff08 一 xff09 开始学习汇编语言 xff0c 对相关的所学知识做个总结 xff0c 希望对自己可以有所提高 1 在计算机中数的表示方式 因为计算机中只能存储二进制数 xff0c 所以一般都是通过二进制直接进行存储
  • Ubuntu18.04重启后无法进入图形化界面

    如果你没有瞎卸载很多东西的话 xff0c 先在字符界面输入你的用户名和密码 xff0c 先尝试这个命令 xff1a sudo systemctl isolate graphical target 不行的话 xff0c 我的解决办法 xff1
  • STM32按键外部中断控制LED流水灯-HAL库

    续上一篇 基于HAL库的32流水灯 http t csdn cn 30QT4 一 硬件选用上 xff0c 我们增加一个四角按键 二 原理图设计 xff0c 上也增加一个开关 LED0 LED2 gt PA0 PA2引脚 KEY1 gt PA