0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

GPIO输入——按键检测

CHANBAEK 来源:doc.embedfire.com 作者:doc.embedfire.com 2023-02-15 15:45 3100次阅读

GPIO输入——按键检测

按键检测使用到GPIO外设的基本输入功能,本章中不再赘述GPIO外设的概念,如您忘记了可重新回到第八章节进行阅读。

12.1. 硬件设计

按键机械触点断开、闭合时,由于触点的弹性作用,按键开关不会马上稳定接通或一下子断开,使用按键时会产生 图12_1中的带波纹信号,需要用软件消抖处理滤波,不方便输入检测。

本实验用到的野火启明6M5开发板的按键带硬件消抖功能,它利用电容充放电的延时,消除了波纹,从而简化软件的处理,软件只需要直接检测引脚的电平即可。

瑞萨设计的微处理器MCU)拥有硬件数字滤波的功能用来实现去除按键带来的纹波影响, 不过前提是按键用在外部中断作为按键信号输入的情况下使用, 通过使用数字滤波的方式能够替代掉用电容式滤波的方法来消除纹波, 从而减少我们在硬件上的开发成本。

野火启明6M5开发板的按键电路图如 图12_2所示,图中RA6M5芯片的P004、P005引脚分别通过一个10KΩ的贴片电阻连接到电源的正极,所以按键在没有被按下的时候,GPIO引脚的输入状态为高电平状态, 分别又通过串联一个100Ω的贴片电阻和一个按键接地,所以按键在被按下的时候,GPIO引脚的输入状态为低电平状态。 只要我们检测引脚的输入电平,即可判断按键是否被按下。

图 12‑1 按键抖动说明图

图 12‑2 按键原理图

若您使用的实验板按键的连接方式或引脚不一样,只需根据我们的工程修改引脚即可,程序的控制原理相同。

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

代码清单 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
收藏 人收藏
    相关推荐
    热点推荐

    i.MX6ULL 驱动开发7—按键输入捕获与GPIO输入配置与高低电平读取

    本篇主要介绍了i.MX6ULL的按键检测的使用,主要的知识点是设备树的修改,以及GPIO输入配置与高低电平的读取。
    的头像 发表于 05-24 09:11 6709次阅读
    i.MX6ULL 驱动开发7—<b class='flag-5'>按键</b><b class='flag-5'>输入</b>捕获与<b class='flag-5'>GPIO</b><b class='flag-5'>输入</b>配置与高低电平读取

    通过MCU不断检测按键连接GPIO的状态变化来确认是否有按键输入

    1.简述对于按键,常见的是通过MCU不断检测按键连接 GPIO 的状态变化(高–>低或低—>高),来确认是否有按键
    发表于 08-13 06:00

    GPIO外部中断输入检测

    本篇主要讲述GPIO外部中断输入检测,实际物理输入方式是按键,但是实际上更适合外部设备信号的输入
    发表于 08-16 09:14

    讲讲关于GPIO按键输入的关键要点

    GPIO 端口时钟;2. 初始化 GPIO 目标引脚为输入模式(浮空输入);3. 编写按键检测
    发表于 12-09 06:33

    GPIO输入--按键

    程序简介 -工程名称:GPIO输入--按键 -实验平台: 秉火STM32 F429 开发板 -MDK版本:5.16 -ST固件库版本:1.5.1 【 !】功能简介: 使用两个按键控制彩
    发表于 12-12 19:08 3次下载

    一文解析GPIO外部中断输入检测

    本篇主要讲述GPIO外部中断输入检测,实际物理输入方式是按键,但是实际上更适合外部设备信号的输入
    的头像 发表于 08-31 11:46 4309次阅读
    一文解析<b class='flag-5'>GPIO</b>外部中断<b class='flag-5'>输入</b><b class='flag-5'>检测</b>

    STM32F103-入门基础实验-GPIO输入-按键(查询/中断)控制LED核心代码(固件库版)

    GPIO 端口时钟;2. 初始化 GPIO 目标引脚为输入模式(浮空输入);3. 编写按键检测
    发表于 11-26 13:21 0次下载
    STM32F103-入门基础实验-<b class='flag-5'>GPIO</b><b class='flag-5'>输入</b>-<b class='flag-5'>按键</b>(查询/中断)控制LED核心代码(固件库版)

    esp32学习之按键检测gpio中断

    esp32学习之gpio中断前言流程选定gpiogpio配置设置回调函数注册中断处理程序前言最近在做一个按键检测按键检测有两种方法,一种是
    发表于 12-04 16:21 14次下载
    esp32学习之<b class='flag-5'>按键</b><b class='flag-5'>检测</b><b class='flag-5'>gpio</b>中断

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

    STM8S自学笔记-006 按键输入GPIO输入【修订记录】1、20210812,第一版GPIO输入
    发表于 12-05 11:36 9次下载
    STM8S自学笔记-006 <b class='flag-5'>GPIO</b><b class='flag-5'>输入</b>:<b class='flag-5'>按键</b><b class='flag-5'>输入</b> 与 <b class='flag-5'>按键</b>滤波

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

    PA0、PC13同时还具有唤醒功能,上升沿电容作用:按键按下后会有20ms的抖动,待稳定后通过地线导出。驱动函数,初始化GPIO使用浮空输入STM32的四种输入方式1、上拉
    发表于 12-07 18:21 10次下载
    STM32F103 入门篇 13-<b class='flag-5'>GPIO</b><b class='flag-5'>输入</b>-<b class='flag-5'>按键</b><b class='flag-5'>检测</b>

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

    GPIO输入驱动实验-按键控制写在前面:和beep实验一样,在已有的工程框架上加功能就行了,冲!!!对了这次会对gpio的操作编写成一个函数集合,方便调用,大家留意。1、bsp下新建k
    发表于 12-20 19:14 1次下载
    <b class='flag-5'>GPIO</b><b class='flag-5'>输入</b>驱动实验-<b class='flag-5'>按键</b>控制

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

    STM32基本GPIO操作:按键输入(扫描+外部中断)本文章向大家介绍STM32基本GPIO操作:按键
    发表于 12-29 19:27 13次下载
    STM32基本<b class='flag-5'>GPIO</b>操作:<b class='flag-5'>按键</b><b class='flag-5'>输入</b>(扫描+外部中断)

    ADC口检测多个组合按键的方法

    一般情况下,一个GPIO口只能连接一个按键,通过检测外部输入的高、低电平判断按键的开闭状态。
    的头像 发表于 03-21 10:13 5873次阅读
    ADC口<b class='flag-5'>检测</b>多个组合<b class='flag-5'>按键</b>的方法

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

    掌握GPIO输入输出是必备技能,这篇推文继续来学习操作GPIO,这篇主要学习GPIO输入,通过使用
    的头像 发表于 04-06 10:37 1463次阅读

    【GD32F470紫藤派开发板使用手册】第二讲 GPIO-按键查询实验

    通过本实验主要学习以下内容: GPIO输入功能原理; 按键查询输入检测原理;
    的头像 发表于 04-30 11:39 1116次阅读
    【GD32F470紫藤派开发板使用手册】第二讲 <b class='flag-5'>GPIO</b>-<b class='flag-5'>按键</b>查询实验

    TwinCAT3 EtherCAT抓包 | 技术集结

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

    RT-Thread官方账号
    12小时前
    290

    EtherCAT科普系列(8):EtherCAT技术在机器视觉领域的应用

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

    码灵半导体
    13小时前
    174

    新品 | 26+6TOPS强悍算力!飞凌嵌入式FCU3501嵌入式控制单元发布

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

    飞凌嵌入式
    18小时前
    310

    接口核心板必选 | 视美泰AIoT-3568SC 、 AIoT-3576SC:小身材大能量,轻松应对多场景设备扩展需求!

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

    视美泰
    19小时前
    357

    3核A7+单核M0多核异构,米尔全新低功耗RK3506核心板发布

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

    米尔电子
    22小时前
    350

    搭建树莓派网络监控系统:顶级工具与技术终极指南!

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

    上海晶珩电子科技有限公司
    1天前
    372

    STM32驱动SD NAND(贴片式SD卡)全测试:GSR手环生物数据存储的擦写寿命与速度实测

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

    MK米客方德
    1天前
    407

    芯对话 | CBM16AD125Q这款ADC如何让我的性能翻倍?

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

    芯佰微电子
    1天前
    514

    史上最全面解析:开关电源各功能电路

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

    张飞实战电子官方
    2天前
    437

    有几种电平转换电路,适用于不同的场景

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

    张飞实战电子官方
    05-12 19:33
    359

    瑞萨RA8系列教程 | 基于 RASC 生成 Keil 工程

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

    RA生态工作室
    05-01 10:00
    631

    共赴之约 | 第二十七届中国北京国际科技产业博览会圆满落幕

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

    芯佰微电子
    05-12 13:36
    1.1k

    道生物联与巍泰技术联合发布 RTK 无线定位系统:TurMass™ 技术与厘米级高精度定位的深度融合

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

    道生物联
    05-12 13:40
    823

    智能家居中的清凉“智”选,310V无刷吊扇驱动方案--其利天下

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

    其利天下技术
    05-10 16:29
    1.6k

    电源入口处防反接电路-汽车电子硬件电路设计

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

    张飞实战电子官方
    05-09 19:34
    1.2k