GPIO输入——按键检测
按键检测使用到GPIO外设的基本输入功能,本章中不再赘述GPIO外设的概念,如您忘记了可重新回到第八章节进行阅读。
12.1. 硬件设计
按键机械触点断开、闭合时,由于触点的弹性作用,按键开关不会马上稳定接通或一下子断开,使用按键时会产生 图12_1中的带波纹信号,需要用软件消抖处理滤波,不方便输入检测。
本实验用到的野火启明6M5开发板的按键带硬件消抖功能,它利用电容充放电的延时,消除了波纹,从而简化软件的处理,软件只需要直接检测引脚的电平即可。
瑞萨设计的微处理器(MCU)拥有硬件数字滤波的功能用来实现去除按键带来的纹波影响, 不过前提是按键用在外部中断作为按键信号输入的情况下使用, 通过使用数字滤波的方式能够替代掉用电容式滤波的方法来消除纹波, 从而减少我们在硬件上的开发成本。
野火启明6M5开发板的按键电路图如 图12_2所示,图中RA6M5芯片的P004、P005引脚分别通过一个10KΩ的贴片电阻连接到电源的正极,所以按键在没有被按下的时候,GPIO引脚的输入状态为高电平状态, 分别又通过串联一个100Ω的贴片电阻和一个按键接地,所以按键在被按下的时候,GPIO引脚的输入状态为低电平状态。 只要我们检测引脚的输入电平,即可判断按键是否被按下。
若您使用的实验板按键的连接方式或引脚不一样,只需根据我们的工程修改引脚即可,程序的控制原理相同。
12.2. 按键程序设计
使用瑞萨官方提供的FPS库进行编程,瑞萨官方提供的FPS库具有方便、快捷、简洁的特性。 在下面会教大家如何使用FPS库进行编程。
12.2.1. 新建工程
对于 e2 studio 开发环境:拷贝一份我们之前的 e2s 工程模板 “11_GPIO_LED” , 然后将工程文件夹重命名为 “12_Key” ,最后再将它导入到我们的 e2 studio 工作空间中。
对于 Keil 开发环境:拷贝一份我们之前的 Keil 工程模板 “11_GPIO_LED” , 然后将工程文件夹重命名为 “12_Key” ,并进入该文件夹里面双击 Keil 工程文件,打开该工程。
工程新建好之后,在工程根目录的 “src” 文件夹下面新建 “key” 文件夹, 再进入 “key” 文件夹里面新建 key 驱动的源文件和头文件:“bsp_key.c” 和 “bsp_key.h”。 工程文件结构如下。
文件结构
12_Key
├─ ......
└─ src
├─ led
│ ├─ bsp_led.c
│ └─ bsp_led.h
├─ key
│ ├─ bsp_key.c
│ └─ bsp_key.h
└─ hal_entry.c
警告
注意:对于使用 Keil 开发环境的用户,将代码文件放到 “src” 文件夹下之后, Keil 软件并不会自动将它们加入到工程,这时候需要打开 RASC FSP 配置界面, 点击一次单击右上角的 “Generate Project Content” 按钮,从而 “src” 文件夹下的代码文件就会被自动加进工程中。 接着关闭 FSP 配置界面返回到 Keil,然后进行一次编译会弹出一个提示框提示工程结构发生了变化,点击确定即可。 对于使用 e2 studio 的用户则不需如此。
12.2.2. FSP配置
接下来我们要在fsp里配置芯片的引脚相关的属性。
在打开 “FSP” 配置界面后, 在 “FSP” 配置界面里面点开 “Pins” -> “Ports” -> “P0” -> “P004” , 然后将连接到按键的IO引脚的 “Mode” 属性配置为 “Input Mode” ,其他的属性默认即可,LED引脚的配置同上节一样配置。
Pin Configuration 页面的 IOPORT 属性介绍:
IOPORT 属性介绍
IOPORT 属性 | 描述 |
---|---|
---------------------------------------------------- |
模式 | IO引脚的工作模式,包括输入模式和输出模式。 |
---|---|
拔 | IO引脚是否上拉。 |
驱动器容量 | IO引脚的驱动能力设置。 |
输出类型 | IO引脚的输出类型。 可以选 CMOS 推挽输出或开漏输出。 |
配置完成之后的配置界面如图所示。
配置完成之后按下快捷键“Ctrl + S”保存,最后点右上角的 “Generate Project Content” 图标, 让软件根据我们的设置自动生成配置代码即可。
对于 Keil 这边 RASC 的 FSP 配置也是一样的,需要先通过 RASC 软件打开 Keil 工程相关的 FSP 配置界面。 具体的方法在前面的章节已经详述过了,这里不再重复说明。
12.3. 按键程序思路
使用瑞萨的FSP对软件设计的思路非常地简单:首先通过R_IOPORT_Open函数初始化配置 LED 引脚,之后使用R_IOPORT_PinRead 函数来获取当前引脚的电平的状态。
12.3.1. R_IOPORT_PinRead 函数
通过 R_IOPORT_Open 函数初始化相应的引脚之后,我们使用R_IOPORT_PinRead函数来获取引脚的电平的状态。 我们通过分析R_IOPORT_PinRead函数,最主要的是通过p_pin_value这个枚举类型来获取IO的状态。
fsp_err_t R_IOPORT_PinRead (ioport_ctrl_t * const p_ctrl, bsp_io_port_pin_t pin, bsp_io_level_t * p_pin_value)
注解
bsp_io_port_pin_t枚举来决定需要获取的引脚,通过bsp_io_level_t来获取当前GPIO的状态。
e_bsp_io_level枚举
/* IOPORT 实例控制块 */
typedef enum e_bsp_io_level
{
BSP_IO_LEVEL_LOW = 0, ///< Low
BSP_IO_LEVEL_HIGH ///< High
} bsp_io_level_t;
12.3.2. 主函数
在while(1)里不断调用R_IOPORT_PinRead函数,并判断其返回值,若返回值表示按键按下,则LED灯的点亮,否则LED灯灭掉。
完整代码如下:
代码清单 12-4:主函数
void hal_entry(void)
{
fsp_err_t err; //
err = R_IOPORT_Open(&g_ioport_ctrl, &g_bsp_pin_cfg); //初始化引脚
assert(FSP_SUCCESS == err); //判断是否初始化成功
bsp_io_level_t Pin_P004; //定义获取函数的结构体
while(1)
{
R_IOPORT_PinRead(&g_ioport_ctrl,BSP_IO_PORT_00_PIN_04, &Pin_P004); //运行函数并把获取的数据赋值结构体
if(Pin_P004 == BSP_IO_LEVEL_LOW){ //判断按键有没有按下
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_04, BSP_IO_LEVEL_HIGH);//点亮LED
}else if(Pin_P004 == BSP_IO_LEVEL_HIGH){ //判断按键有没有松开
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_04, BSP_IO_LEVEL_LOW); //关闭LED
}
}
#if BSP_TZ_SECURE_BUILD
/* Enter non-secure code */
R_BSP_NonSecureEnter();
#endif
}
注解
使用这种方式来获取IO口的状态相对会比较复杂,下面将介绍一种新的写法来简化这一个过程,可以使程序看起来更简单,让我们开发起来更加的顺畅。
12.4. 封装 Key 设备驱动程序
R_key_read函数
/*
* 按键读取函数 输入引脚 返回当前引脚的状态
* */
uint32_t R_key_read(bsp_io_port_pin_t key)
{
bsp_io_level_t state;
R_IOPORT_PinRead(&g_ioport_ctrl, key, &state);
return state;
}
我们这里对R_IOPORT_PinRead进行一次封装,为什么要加这一层封装呢,因为在对R_IOPORT_PinRead编程中多了一个指向型bsp_io_port_pin_t枚举类型数据, 每当程序中增加一个需要读取的IO口时我们就需要增加一个枚举类型数据,这样大大增加了我们程序的冗余程度。 我们封装的过程中通过输入当前的引脚,然后return返回当前的状态,这样简化了我们进行程序的编写。
Key_Scan函数
/*
* 按键扫描函数判断你的手是否松开
*/
uint32_t Key_Scan(bsp_io_port_pin_t key)
{
if(R_key_read(key) == BSP_IO_LEVEL_HIGH)
{
return KEY_OFF;
}
else
{
do //等待按键释放
{
R_key_read(key);
} while (BSP_IO_LEVEL_LOW == R_key_read(key));
}
return KEY_ON;
}
这是一个对R_IOPORT_PinRead函数的使用案例,当按下按键的时候单片机会检测手是否松开当手离开的时候返回KEY_ON数值,当按键没有被按下的时候Key_Scan函数则返回KEY_OFF的数值, 下面是一个Key_Scan函数的实践案列。
主函数hal_entry()
void hal_entry(void)
{
while(1)
{
if( Key_Scan(KEY_SW2_PIN) == KEY_ON ) //扫描判断按键
{
LED1_ON; //宏定义LED开
LED2_ON;
LED3_ON;
}
if( Key_Scan(KEY_SW3_PIN) == KEY_ON )
{
LED1_OFF; //宏定义LED关
LED2_OFF;
LED3_OFF;
}
}
#if BSP_TZ_SECURE_BUILD
/* Enter non-secure code */
R_BSP_NonSecureEnter();
#endif
}
在 “hal_entry.c” 文件中添加对头文件 “bsp_key.h” 的包含, 然后将 hal_entry 入口函数的内容改为如上所示。
12.5. 下载验证
把编译好的程序下载到开发板并复位,按下按键可以控制LED灯亮灭。
-
电路图
+关注
关注
10392文章
10732浏览量
539576 -
led灯
+关注
关注
22文章
1593浏览量
109274 -
开发板
+关注
关注
25文章
5448浏览量
101446 -
GPIO
+关注
关注
16文章
1249浏览量
53417 -
按键检测
+关注
关注
0文章
24浏览量
4906
发布评论请先 登录
通过MCU不断检测按键连接GPIO的状态变化来确认是否有按键输入
GPIO输入--按键
STM32F103-入门基础实验-GPIO输入-按键(查询/中断)控制LED核心代码(固件库版)

esp32学习之按键检测gpio中断

STM8S自学笔记-006 GPIO输入:按键输入 与 按键滤波

STM32F103 入门篇 13-GPIO输入-按键检测

GPIO输入驱动实验-按键控制

STM32基本GPIO操作:按键输入(扫描+外部中断)

i.MX6ULL学习笔记:GPIO按键输入捕获

TwinCAT3 EtherCAT抓包 | 技术集结
在使用TwinCAT测试EtherCATEOE功能时,我们会发现正常是无法使用Wireshark去进行网络抓包抓取EtherCAT报文的,今天这篇文章就带大家来上手EtherCAT抓包方式。准备环境硬件环境:EtherKit开发板网线一根Type-CUSB线一根软件环境TwinCAT3RT-ThreadstudiowiresharkEtherCATEOE工程

EtherCAT科普系列(8):EtherCAT技术在机器视觉领域的应用
机器视觉是基于软件与硬件的组合,通过光学装置和非接触式的传感器自动地接受一个真实物体的图像,并利用软件算法处理图像以获得所需信息或用于控制机器人运动的装置。机器视觉可以赋予机器人及自动化设备获取外界信息并认知处理的能力。机器视觉系统内包含光学成像系统,可以作为自动化设备的视觉器官实现信息的输入,并借助视觉控制器代替人脑实现信息的处理与输出。从而实现赋予自动化

新品 | 26+6TOPS强悍算力!飞凌嵌入式FCU3501嵌入式控制单元发布
飞凌嵌入式FCU3501嵌入式控制单元基于瑞芯微RK3588处理器开发设计,4xCortex-A76+4xCortex-A55架构,A76主频高达2.4GHz,A55核主频高达1.8GHz,支持8K编解码,NPU算力6TOPS,支持算力卡拓展,可以插装Hailo-8 26TOPS M.2算力卡。

接口核心板必选 | 视美泰AIoT-3568SC 、 AIoT-3576SC:小身材大能量,轻松应对多场景设备扩展需求!
在智能硬件领域,「适配」是绕不开的关键词。无论是小屏设备的”寸土寸金”,还是模具开发的巨额成本,亦或是多产品线兼容的复杂需求,开发者总在寻找一款能「以不变应万变」的核心解决方案。视美泰旗下的AIoT-3568SC与AIoT-3576SC接口核心板系列,可以说是专为高灵活适配场景而生!无需为设备尺寸、模具限制或产品线差异妥协,一块核心板,即可释放无限可能。为什

3核A7+单核M0多核异构,米尔全新低功耗RK3506核心板发布
近日,米尔电子发布MYC-YR3506核心板和开发板,基于国产新一代入门级工业处理器瑞芯微RK3506,这款芯片采用三核Cortex-A7+单核Cortex-M0多核异构设计,不仅拥有丰富的工业接口、低功耗设计,还具备低延时和高实时性的特点。核心板提供RK3506B/RK3506J、商业级/工业级、512MB/256MBLPDDR3L、8GBeMMC/256

搭建树莓派网络监控系统:顶级工具与技术终极指南!
树莓派网络监控系统是一种经济高效且功能多样的解决方案,可用于监控网络性能、流量及整体运行状况。借助树莓派,我们可以搭建一个网络监控系统,实时洞察网络活动,从而帮助识别问题、优化性能并确保网络安全。安装树莓派网络监控系统有诸多益处。树莓派具备以太网接口,还内置了Wi-Fi功能,拥有足够的计算能力和内存,能够在Linux或Windows系统上运行。因此,那些为L

STM32驱动SD NAND(贴片式SD卡)全测试:GSR手环生物数据存储的擦写寿命与速度实测
在智能皮电手环及数据存储技术不断迭代的当下,主控 MCU STM32H750 与存储 SD NAND MKDV4GIL-AST 的强强联合,正引领行业进入全新发展阶段。二者凭借低功耗、高速读写与卓越稳定性的深度融合,以及高容量低成本的突出优势,成为大规模生产场景下极具竞争力的数据存储解决方案。

芯对话 | CBM16AD125Q这款ADC如何让我的性能翻倍?
综述在当今数字化时代,模数转换器(ADC)作为连接模拟世界与数字系统的关键桥梁,其技术发展对众多行业有着深远影响。从通信领域追求更高的数据传输速率与质量,到医疗影像领域渴望更精准的疾病诊断,再到工业控制领域需要适应复杂恶劣环境的稳定信号处理,ADC的性能提升成为推动这些行业进步的重要因素。行业现状分析在通信行业,5G乃至未来6G的发展,对基站信号处理提出了极

史上最全面解析:开关电源各功能电路
01开关电源的电路组成开关电源的主要电路是由输入电磁干扰滤波器(EMI)、整流滤波电路、功率变换电路、PWM控制器电路、输出整流滤波电路组成。辅助电路有输入过欠压保护电路、输出过欠压保护电路、输出过流保护电路、输出短路保护电路等。开关电源的电路组成方框图如下:02输入电路的原理及常见电路1AC输入整流滤波电路原理①防雷电路:当有雷击,产生高压经电网导入电源时

有几种电平转换电路,适用于不同的场景
一.起因一般在消费电路的元器件之间,不同的器件IO的电压是不同的,常规的有5V,3.3V,1.8V等。当器件的IO电压一样的时候,比如都是5V,都是3.3V,那么其之间可以直接通讯,比如拉中断,I2Cdata/clk脚双方直接通讯等。当器件的IO电压不一样的时候,就需要进行电平转换,不然无法实现高低电平的变化。二.电平转换电路常见的有几种电平转换电路,适用于

瑞萨RA8系列教程 | 基于 RASC 生成 Keil 工程
对于不习惯用 e2 studio 进行开发的同学,可以借助 RASC 生成 Keil 工程,然后在 Keil 环境下愉快的完成开发任务。

共赴之约 | 第二十七届中国北京国际科技产业博览会圆满落幕
作为第二十七届北京科博会的参展方,芯佰微有幸与800余家全球科技同仁共赴「科技引领创享未来」之约!文章来源:北京贸促5月11日下午,第二十七届中国北京国际科技产业博览会圆满落幕。本届北京科博会主题为“科技引领创享未来”,由北京市人民政府主办,北京市贸促会,北京市科委、中关村管委会,北京市经济和信息化局,北京市知识产权局和北辰集团共同承办。5万平方米的展览云集

道生物联与巍泰技术联合发布 RTK 无线定位系统:TurMass™ 技术与厘米级高精度定位的深度融合
道生物联与巍泰技术联合推出全新一代 RTK 无线定位系统——WTS-100(V3.0 RTK)。该系统以巍泰技术自主研发的 RTK(实时动态载波相位差分)高精度定位技术为核心,深度融合道生物联国产新兴窄带高并发 TurMass™ 无线通信技术,为室外大规模定位场景提供厘米级高精度、广覆盖、高并发、低功耗、低成本的一站式解决方案,助力行业智能化升级。

智能家居中的清凉“智”选,310V无刷吊扇驱动方案--其利天下
炎炎夏日,如何营造出清凉、舒适且节能的室内环境成为了大众关注的焦点。吊扇作为一种经典的家用电器,以其大风量、长寿命、低能耗等优势,依然是众多家庭的首选。而随着智能控制技术与无刷电机技术的不断进步,吊扇正朝着智能化、高效化、低噪化的方向发展。那么接下来小编将结合目前市面上的指标,详细为大家讲解其利天下有限公司推出的无刷吊扇驱动方案。▲其利天下无刷吊扇驱动方案一

电源入口处防反接电路-汽车电子硬件电路设计
一、为什么要设计防反接电路电源入口处接线及线束制作一般人为操作,有正极和负极接反的可能性,可能会损坏电源和负载电路;汽车电子产品电性能测试标准ISO16750-2的4.7节包含了电压极性反接测试,汽车电子产品须通过该项测试。二、防反接电路设计1.基础版:二极管串联二极管是最简单的防反接电路,因为电源有电源路径(即正极)和返回路径(即负极,GND),那么用二极
评论