HAL+M4学习记录_4

一、按键

记录学习使用HAL库读取板载按键输入键值

板载三颗按键,引脚配置如下
按键配置
其中K_UP按键按下为高电平,那么PA0引脚要配置为下拉模式;K0和K1按下为低电平,那么PE4和PE3引脚要配置为上拉模式。

二、通过按键控制LED

这里实现的功能是,按键K_UP按下同时点亮两个LED,再次按下熄灭两个LED;按键K0和K1分别按下,分别点亮LED1和LED2,再次分别按下,分别熄灭LED1和LED2。

代码如下

  • bsp_keys.c文件
/*
*********************************************************************************************************
*	                                   Module Description
*
*	独立按键驱动模块,板载三个按键K_UP、K0和K1,所接引脚分别是PA0、PE4和PE3
*	按键K_UP(WK_UP可作为待机唤醒选项)按下为高电平,设置为下拉输入模式
*	按键K0和按键K1按下为低电平,设置为上拉输入模式
*********************************************************************************************************
*/#include "bsp.h"/*
**********************************************************************************
*   @brief    按键硬件初始化,配置按键对应的GPIO
*   @param	  None
*   @return	  None
*   @note	  	
**********************************************************************************
*/
static void bsp_InitKeyHard()
{GPIO_InitTypeDef GPIO_InitStructure;/* 打开GPIO时钟 */GPIO_CLK_ENABLE_K_UP();GPIO_CLK_ENABLE_K0();GPIO_CLK_ENABLE_K1();/* 配置K_UP为下拉输入,K0和K1为上拉输入 */GPIO_InitStructure.Mode 	= GPIO_MODE_INPUT;				// 输入模式GPIO_InitStructure.Speed 	= GPIO_SPEED_FREQ_VERY_HIGH;	// GPIO速度GPIO_InitStructure.Pin 		= GPIO_PIN_K_UP;				// K_UP引脚GPIO_InitStructure.Pull 	= GPIO_PULLDOWN;				// 下拉模式HAL_GPIO_Init(GPIO_PORT_K_UP, &GPIO_InitStructure);GPIO_InitStructure.Pin 		= GPIO_PIN_K0 | GPIO_PIN_K1;	// K0和K1引脚GPIO_InitStructure.Pull		= GPIO_PULLUP;					// 上拉模式HAL_GPIO_Init(GPIOE, &GPIO_InitStructure);
}/*
**********************************************************************************
*   @brief    初始化按键驱动
*   @param	  None
*   @return	  None
*   @note	  	
**********************************************************************************
*/
void bsp_InitKey()
{bsp_InitKeyHard();
}/*
**********************************************************************************
*   @brief    阻塞式按键扫描函数
*   @param	  None
*   @return	  键值,如下
*				K_UP按下返回3
*				K0按下返回1
*				K1按下返回2
*   @note	  
**********************************************************************************
*/
uint8_t bsp_ScanKey()
{uint8_t key_value 			= 0;			// 键值// K_UP按键检测if(K_UP_NOW == 1){bsp_DelayMs(20);while(K_UP_NOW == 1);bsp_DelayMs(20);key_value = 3;}// K0按键检测if(K0_NOW == 0){bsp_DelayMs(20);while(K0_NOW == 0);bsp_DelayMs(20);key_value = 1;}// K1按键检测if(K1_NOW == 0){bsp_DelayMs(20);while(K1_NOW == 0);bsp_DelayMs(20);key_value = 2;}return key_value;
}
  • bsp_keys.h文件
#ifndef __BSP_KEYS_H
#define __BSP_KEYS_H/* private define */
#define HARD_KEY_NUM			3											// 实体按键个数
// 按键引脚定义
#define GPIO_CLK_ENABLE_K_UP()	do{__HAL_RCC_GPIOA_CLK_ENABLE();}while(0)
#define GPIO_PORT_K_UP			GPIOA
#define GPIO_PIN_K_UP			GPIO_PIN_0#define GPIO_CLK_ENABLE_K0()	do{__HAL_RCC_GPIOE_CLK_ENABLE();}while(0)
#define GPIO_PORT_K0			GPIOE
#define GPIO_PIN_K0				GPIO_PIN_4#define GPIO_CLK_ENABLE_K1()	do{__HAL_RCC_GPIOE_CLK_ENABLE();}while(0)
#define GPIO_PORT_K1			GPIOE
#define GPIO_PIN_K1				GPIO_PIN_3
// 按键引脚当前电平
#define K_UP_NOW				HAL_GPIO_ReadPin(GPIO_PORT_K_UP, GPIO_PIN_K_UP)
#define K0_NOW					HAL_GPIO_ReadPin(GPIO_PORT_K0, GPIO_PIN_K0)
#define K1_NOW					HAL_GPIO_ReadPin(GPIO_PORT_K1, GPIO_PIN_K1)
// 键值定义
#define PRES_K_UP				3
#define PRES_K0					1
#define PRES_K1					2/* public statement */
void bsp_InitKey();
uint8_t bsp_ScanKey();
#endif
  • main.c文件
#include "bsp.h"/* public statement */
static void PrintInfo();/* public define */
uint32_t key_num = 0;int main()
{bsp_Init();//PrintInfo();			/* 打印开发板信息 */while(1){key_num = bsp_ScanKey();if(key_num == 1){bsp_LedToggle(1);}if(key_num == 2){bsp_LedToggle(2);}if(key_num == 3){bsp_LedToggle(1);bsp_LedToggle(2);}}
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

保姆教程篇:手把手教你从零开始本地部署Dify工作流

本教程将指导您在个人电脑上安装和配置 Dify。 为什么需要Dify 在开始具体的教程之前,先搞清楚为什么要选择 Dify。 6 月份,阿里巴巴全球数学竞赛中,首次接受AI参赛。结果令人大跌眼镜:AI选手们的表现完全无法与人类选手相提并…

STM32外设详解——ADC

来源:铁头山羊 基本概念 ①ADC是模数转换器的统称,stm32f103c8t6内部集成了2个12位主次逼近型ADC,外设名称为ADC1、ADC2。 ② 采样深度为12位意味着ADC可以将0~3.3V的模拟电压等比转换为0~4095的数字值(分割为2的12次方份&…

SOMEIP_ETS_178: Subscribe_using_wrong_SOMEIP_MessageID

测试目的: 验证DUT能够拒绝一个SOME/IP头部使用错误消息ID进行服务发现的SubscribeEventgroup消息,并以SubscribeEventgroupNAck作为响应。 描述 本测试用例旨在确保DUT遵循SOME/IP协议,当接收到一个使用错误消息ID的服务发现SubscribeEve…

YOLO--前置基础词-学习总结(上)

RFBNet是什么意思 RFBNet 是一种用于目标检测的深度学习网络,它的名字来源于 "Receptive Field Block Network"(感受野块网络)。简单来说,RFBNet 是一种可以让计算机更好地“看”图像中不同大小的物体的方法。 在图像处…

Python FFmpeg 安装使用教程

文章目录 什么是 FFmpeg?主要功能包括: Windows 下载安装下载解压安装配置环境变量 使用案例使用 ffmpeg-python 库转换视频格式视频剪辑添加字幕 使用 subprocess.run 执行视频格式转换 其它问题ffmpeg 不是内部或外部命令,也不是可运行的程序 个人简介…

虹软人脸 报错 Can‘t find dependent libraries

系列文章目录 文章目录 系列文章目录一、虹软人脸 报错 Can‘t find dependent libraries 一、虹软人脸 报错 Can‘t find dependent libraries 在项目中使用了 虹软 人脸识别SDK,环境一直出错。 错误: Can’t find dependent libraries 从错误信息来…

Arduino UNO R3自学笔记21 之 Arduino基础篇学习总结

注意:学习和写作过程中,部分资料搜集于互联网,如有侵权请联系删除。 前言:目前将Arduino的大多数基础内容学习了,做个总结。 1.编程语言 学习单片机,在面向单片机编程时,语言是最基础的&#…

Web前端入门

文章目录 前言1 Web前端概述1.1 网站和网页1.2 HTML语言1.3 网页的形成1.4 常用浏览器1.5 浏览器内核(渲染引擎)1.6 web标准 2 HTML标签2.1 开发工具2.2 HTML语法规则2.3 标签的关系2.4 HTML注释标签2.5 结构标签 3 常用标签3.1 标题标签3.2 段落标签3.3 换行标签3.…

HAL库常用的函数:

目录 HAL库: 1.GPIO常用函数: 1.HAL_GPIO_ReadPin( ) 2.HAL_GPIO_WritePin( ) 3.HAL_GPIO_TogglePin( ) 4.HAL_GPIO_EXTI_IRQHandler( ) 5.HAL_GPIO_EXTI_Callback( ) 2.UART常用函数: 1.HAL_U…

详细分析Spring Framework中 @ConditionalOnProperty的基本知识(附Demo)

目录 前言1. 基本知识2. Demo 前言 基本的Java知识推荐阅读: java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)【Java项目】实战CRUD的功能整理(持续更新) 从实战中学习启发 1. 基本知识 Conditiona…

2025考研今天开始预报名!攻略请查收

2025年全国硕士研究生招生考试 今天起开始预报名 有什么流程?需要准备哪些信息? 这份考研报名攻略速查收 ↓↓↓ 全国硕士研究生招生考试报名包括网上报名和网上确认两个阶段: 网上预报名时间为10月9日至10月12日(每日9&#xff1…

虚幻引擎GAS入门学习笔记(二)

虚幻引擎GAS入门(二) 学习位置UE5.3 GAS入门教程重置版 小明 MVC框架与技能初始化 让一开始创建的蓝图的基础GameplayAbility蓝图继承我们写好的BaseGameplayAbility类 创建一个库函数,写一些常用的函数在里面第一个得到玩家与玩家控制器 获取角色面对目标的方向…

【优选算法】(第三十二篇)

目录 ⼆进制求和(easy) 题目解析 讲解算法原理 编写代码 字符串相乘(medium) 题目解析 讲解算法原理 编写代码 ⼆进制求和(easy) 题目解析 1.题目链接:. - 力扣(LeetCode&a…

双十一好物必买榜:数码好物推荐!

​双十一该入手一些好物来准备度过下一年,选择几款数码好物和工作都用得到的实用好物陪伴冬天是能够让自己更积极的迎接生活,能够让自己更开心满足的方式。适当的购物也是能够缓解工作压力,心情不好的方法,但依然要选择买回家不会…

团员申请书怎么写?这里归纳了一些模板

团员申请书怎么写?随着社会的快速发展和时代的进步,越来越多的青年人意识到加入团组织的重要性。作为新时代的青年,我们应当积极响应国家的号召,参与到团组织的建设中来。而想要成为共青团员,首先需要撰写一份规范的团…

Umi中的微前端

umi/max 内置了 Qiankun 微前端插件,它可以一键启用 Qiankun 微前端开发模式,帮助您轻松地在 Umi 项目中集成 Qiankun 微应用,构建出一个生产可用的微前端架构系统。 什么是微前端 微前端是一种多个团队通过独立发布功能的方式来共同构建现代…

golang grpc初体验

grpc 是一个高性能、开源和通用的 RPC 框架,面向服务端和移动端,基于 HTTP/2 设计。目前支持c、java和go,分别是grpc、grpc-java、grpc-go,目前c版本支持c、c、node.js、ruby、python、objective-c、php和c#。grpc官网 grpc-go P…

【牛客刷题实战】BC120 争夺前五名

大家好,我是小卡皮巴拉 文章目录 目录 牛客题目: BC120 争夺前五名 题目描述 输入描述: 输出描述: 示例1 示例2 解题思路: 具体思路: 题目要点: 完整代码: 兄弟们共…

python爬虫 - 数据提取

🌈个人主页:https://blog.csdn.net/2401_86688088?typeblog 🔥 系列专栏:https://blog.csdn.net/2401_86688088/category_12797772.html 目录 前言 一、数据类型及其对应的提取策略 (一)文本数据 &…

【设计模式】软件设计原则——开闭原则里氏替换单一职责

开闭原则内容引出 开闭原则 定义:一个软件实体,类,函数,模块;对扩展开放,对修改关闭。用抽象构建框架,用实现扩展细节。可以提高软件的可复用性和可维护性。 开发新功能时,尽量不修…