【野火启明_瑞萨RA6M5】按键输入检测

news2024/11/17 19:37:40

文章目录

  • 一、GPIO输入——按键输入检测
  • 二、硬件设计
  • 三、软件设计
  • 下载验证


一、GPIO输入——按键输入检测

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

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

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

二、硬件设计

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

三、软件设计

1. 新建工程

对于 Keil 开发环境:
拷贝一份我们之前的 Keil 工程 “11_GPIO_LED”, 然后将工程文件夹重命名为 “12_GPIO_Key”,并进入该文件夹里面双击 Keil 工程文件,打开该工程。

工程新建好之后,在工程根目录的 “src” 文件夹下面新建 “key” 文件夹, 再进入 “key” 文件夹里面新建 Key 驱动的源文件和头文件:“bsp_key.c” 和 “bsp_key.h”。 工程文件结构如下。

12_GPIO_Key
├─ ......
└─ src
   ├─ led
   │  ├─ bsp_led.c
   │  └─ bsp_led.h
   ├─ key
   │  ├─ bsp_key.c
   │  └─ bsp_key.h
   └─ hal_entry.c

2. FSP配置
首先打开 “12_GPIO_Key” 项目的 FSP 配置界面,接下来我们要在这个界面里配置芯片的引脚。

在 FSP 配置界面里面点开 “Pins”-> “Ports”-> “P0”-> “P004”, 然后将连接到按键1的IO引脚的 “Mode” 属性配置为 “Input Mode”,其他的属性默认即可。 按键2的引脚 “P005” 也是按照这样进行配置。
在这里插入图片描述
配置完成之后的配置界面如下图所示。 “P004”和“P005”引脚的工作模式(Mode)都设置为输入模式,外部中断(IRQ)不启用。
在这里插入图片描述
配置完成之后按下快捷键“Ctrl + S”保存,最后点右上角的 “Generate Project Content” 图标, 让软件根据我们的设置自动生成配置代码即可。

对于 Keil 这边 RASC 的 FSP 配置也是一样的,需要先通过 RASC 软件打开 Keil 工程相关的 FSP 配置界面。

3. Key_Scan按键扫描函数
按键程序设计思路可以非常简单:想要知道某个按键是否被按下, 只需检测连接到改按键的IO引脚是高电平还是低电平,若是低电平,说明按键正处于被按下的状态。

通过使用 R_IOPORT_PinRead 函数,我们可以获取某个IO引脚的电平状态。 R_IOPORT_PinRead 函数原型如下:

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 枚举类型的变量 pin 传入要读取的 IO 引脚的端口号和引脚号;

  • 通过 bsp_io_level_t 枚举类型的指针 p_pin_value 来获取该 IO 引脚的电平状态。

bsp_io_level_t 枚举类型的定义如下:

 /* 可以为单个引脚设置电平和读取电平 */
 typedef enum e_bsp_io_level
 {
     BSP_IO_LEVEL_LOW = 0,              ///< Low
     BSP_IO_LEVEL_HIGH                  ///< High
 } bsp_io_level_t;

Key_Scan 按键扫描函数如下:

/* 定义宏 KEY_ON 表示按键按下
   定义宏 KEY_OFF 表示按键没有按下
*/
#define KEY_ON  1
#define KEY_OFF 0


/* 按键扫描函数(阻塞式)
* key: KEY1_SW2_PIN 用户按键1(丝印SW2)的引脚
*      KEY2_SW3_PIN 用户按键2(丝印SW3)的引脚
*/
uint32_t Key_Scan(bsp_io_port_pin_t key)
{
   bsp_io_level_t state;

   // 读取按键引脚电平
   R_IOPORT_PinRead(&g_ioport_ctrl, key, &state);
   if (BSP_IO_LEVEL_HIGH == state)
   {
      return KEY_OFF; //按键没有被按下
   }
   else
   {
      do  //等待按键释放
      {
            R_IOPORT_PinRead(&g_ioport_ctrl, key, &state);
      } while (BSP_IO_LEVEL_LOW == state);
   }

   return KEY_ON; //按键被按下了
}

这是一个简单的按键扫描函数,当调用该函数并且检测到按键被按下的时候,就会在 do-while 语句里重复检测按键是否被松开, 一直到当手松开按键的时候才能跳出循环,并返回 KEY_ON 数值表明按键被按下; 而当按键没有被按下的时候 Key_Scan 函数则返回 KEY_OFF 的数值。

值得注意的是,若程序在 do-while 循环里一直检测到手没有松开按键, 则程序会被一直阻塞在这里,因此这是一个阻塞式的扫描函数。

4. hal_entry入口函数
在 hal_entry 函数里,首先初始化了 LED 和按键, 接着进入了 while 主循环,在该循环下反复地调用 Key_Scan 函数对两个用户按键进行实时扫描。 若按键1按下,则翻转LED1的状态;若按键2按下,则翻转LED2的状态。

需要注意的是,KEY1_SW2_PIN 和 KEY2_SW3_PIN 宏定义了两个用户按键的引脚,不同的板子按键引脚是不一样的。

/* 启明6M5开发板,两个按键引脚定义 */
#define KEY1_SW2_PIN    BSP_IO_PORT_00_PIN_04
#define KEY2_SW3_PIN    BSP_IO_PORT_00_PIN_05

hal_entry 入口函数如下:

/* 用户头文件包含 */
#include "led/bsp_led.h"
#include "key/bsp_key.h"

void hal_entry(void)
{
   /* TODO: add your own code here */

   LED_Init(); // LED 初始化
   Key_Init(); // 按键初始化

   while(1)
   {
      if( Key_Scan(KEY1_SW2_PIN) == KEY_ON )   //扫描按键1
      {
            LED1_TOGGLE;    //翻转LED1状态
      }
      if( Key_Scan(KEY2_SW3_PIN) == KEY_ON )   //扫描按键2
      {
            LED2_TOGGLE;    //翻转LED2状态
      }
   }


#if BSP_TZ_SECURE_BUILD
   /* Enter non-secure code */
   R_BSP_NonSecureEnter();
#endif
}

下载验证

将程序编译并下载到开发板之后,按下复位按键来复位开发板。

然后按下用户按键1可以控制 LED1 灯的亮灭;按下用户按键2则可以控制 LED2 灯的亮灭。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

城市内涝的原因是什么?城市内涝监测预警系统有什么作用?

城市内涝是指在城市地区发生的、由于降雨或其他水源无法迅速排出而引起的洪水现象&#xff0c;城市内涝是城市发展过程中面临的重要挑战之一。本文着重为大家介绍城市内涝的原因&#xff0c;以及城市内涝监测预警系统的作用。 一、城市内涝的原因是什么? 1、排水系统不完善&am…

【基础6】存储过程的 创建与调用

目录 什么是存储过程 用户自定义存储过程 练习 什么是存储过程 什么是存储过程 类似于C语言中的函数。用来执行管理任务或应用复杂的业务规则存储过程可以带参数&#xff0c;也可以返回结果存储过程可以包含数据操纵等语句、变量、逻辑控制语句等。&#xff08;单个select语…

QT窗体绘图QPainter

QPainter INSCODE AI 创作助手&#xff1a; QPainter是Qt中的一个类&#xff0c;用于在窗口、图像或其他用户界面上绘制图形和文本。它提供了一些方便的方法来画线、矩形、圆、多边形和文本 QPainter绘图函数 INSCODE AI 创作助手&#xff1a; QPainter是Qt中一个用于绘图的类&…

MATLAB开发中的常见问题和解决方法:如何解决常见的性能和bug问题

章节一&#xff1a;引言 在MATLAB开发中&#xff0c;经常会遇到一些常见的性能和bug问题。这些问题可能导致程序运行缓慢、结果不准确或者甚至崩溃。本文将介绍一些常见问题&#xff0c;并提供解决方法和案例&#xff0c;帮助开发者更好地应对这些挑战。 章节二&#xff1a;性…

chatgpt赋能Python-python3多行输入

Python3多行输入教程&#xff1a;如何让你的输入更加高效 Python3是一种功能强大、易于学习的编程语言&#xff0c;被广泛应用于科学计算和数据分析领域。但是&#xff0c;对于初学者来说&#xff0c;输入数据可能是一个有些棘手的问题。在本文中&#xff0c;我们将介绍如何使…

chatgpt赋能Python-python3拷贝文件

Python3 拷贝文件方法及注意事项 拷贝文件在日常开发中是一项基本的操作。Python3作为一门既简洁又强大的编程语言&#xff0c;也提供了丰富的文件操作函数。在本篇文章中&#xff0c;我们将介绍如何使用Python3拷贝文件以及需要注意的细节。 为什么要拷贝文件&#xff1f; …

RHCE--openlab搭建网站

--作业要求-- 综合练习&#xff1a;请给openlab搭建web网站 ​ 网站需求&#xff1a; ​ 1.基于域名[www.openlab.com](http://www.openlab.com)可以访问网站内容为 welcome to openlab!!! ​ 2.给该公司创建三个子界面分别显示学生信息&#xff0c;教学资料和缴费网站&#x…

积水监测用什么传感器?道路积水监测设备

近年来&#xff0c;由于全球气候变化导致极端天气频发&#xff0c;在暴雨的侵袭下&#xff0c;许多城市都面临路面积水严重的问题&#xff0c;道路积水是道路交通安全和行车舒适度的一大威胁&#xff0c;给司机和行人带来了巨大的安全隐患。 如何解决道路积水问题? 1、强城市排…

ChatGPT又一重磅更新 - iOS官方App发布

写在前面&#xff1a;博主是一只经过实战开发历练后投身培训事业的“小山猪”&#xff0c;昵称取自动画片《狮子王》中的“彭彭”&#xff0c;总是以乐观、积极的心态对待周边的事物。本人的技术路线从Java全栈工程师一路奔向大数据开发、数据挖掘领域&#xff0c;如今终有小成…

余压传感器(探测器)最重要的两个功能是什么?

余压传感器&#xff08;探测器&#xff09;是什么&#xff1f; 余压传感器&#xff08;探测器&#xff09;主要用于测量两个位置之间的压差。 余压传感器&#xff08;探测器&#xff09;的作用&#xff1f; 流量测量&#xff1a;在管道中&#xff0c;通过测量两点之间的压差&…

头歌计算机组成原理实验—运算器设计(11)第11关:MIPS运算器设计

第11关&#xff1a;MIPS运算器设计 实验目的 学生理解算术逻辑运算单元&#xff08;ALU&#xff09;的基本构成&#xff0c;掌握 Logisim 中各种运算组件的使用方法&#xff0c;熟悉多路选择器的使用&#xff0c;能利用前述实验完成的32位加法器、 Logisim 中的运算组件构造指…

基于Freertos的ESP-IDF开发——5.使用按键[不带消抖、带消抖、长按短按识别]

基于Freertos的ESP-IDF开发——5.使用按键[不带消抖、带消抖、长按短按识别] 0. 前言1. 确定GPIO引脚2. 触发函数(不带消抖)3. 触发函数(带消抖)4. 长按和短按识别5.其他FreeRtos文章 0. 前言 这一节我们来学习使用按键操作。包括带消抖和不带消抖。 由于之前已经学习过FreeR…

chatgpt赋能Python-python3_run

Python3 Run&#xff1a;学习Python必须掌握的运行方式 如果你在学习Python编程&#xff0c;那么Python3 Run是你必须掌握的运行方式之一。Python3 Run可以让你在本地环境中运行Python代码并查看运行结果。在本文中&#xff0c;我们将介绍Python3 Run的基本概念、使用方法和注…

概论_第4章__协方差Cov(X)的定义和性质___相关系数的定义和性质

前面讨论的方差是 一维随机变量X, 对于二维随机变量&#xff0c; 怎样计算方差呢&#xff1f; 这就引出了 协方差&#xff1a; 讨论X与Y之间相互关系的数字特征。 一 协方差的定义 协方差通俗的理解&#xff1a; 两个随机变量X, Y协作产生的方差。 计算协方差的公式有…

SSM框架学习-Spring事务

1. 数据库中事务与Spring中的事务 数据库事务和Spring中的事务是两个不同的概念&#xff0c;但Spring中的事务是建立在数据库事务之上的。 数据库事务是指一组数据库操作&#xff0c;要么全部成功执行&#xff0c;要么全部回滚&#xff08;撤销&#xff09;。这么做是为了保证数…

【Markdown】笔记

设置-通用-开启调试模式 普通文本编辑器编写的轻量级标记语言 标题 # ~ ###### 文本 _斜体_ *斜体* **粗体** ***粗斜体*** 列表 无序 * - 有序 1. 2. 3. Tab控制层级 链接 [链接名](链接地址) <链接地址> 引用 > 嵌套 > >> >>&…

hadoop零碎知识点总结

系列文章目录 ubuntu虚拟机下搭建zookeeper集群&#xff0c;安装jdk压缩包&#xff0c;搭建Hadoop集群与spark集群的搭建 虚拟机VMware里面安装Windows sever 2003版本详细教程_vmware安装win2003 centos7配置静态网络常见问题归纳_centos7网络问题 文章目录 系列文章目录…

chatgpt赋能Python-python3_排序

Python3 排序指南&#xff1a;介绍、说明和实践 Python3是当今最受欢迎的编程语言之一&#xff0c;拥有许多可用于各种任务的库和框架。其中之一是它自带的排序函数&#xff0c;在数据分析和机器学习等领域中非常有用。 在本篇文章中&#xff0c;我们将简要介绍Python3的排序和…

Baumer工业相机堡盟工业相机IO介绍与配置(二)

Baumer工业相机堡盟工业相机IO介绍与配置&#xff08;二&#xff09; Baumer工业相机Baumer工业相机IO的功能Baumer工业相机IO的作用Baumer工业相机IO上点连线方法 Baumer工业相机 Baumer工业相机堡盟相机是一种高性能、高质量的工业相机&#xff0c;可用于各种应用场景&#…

Linux下基于TCP协议的Socket套接字编程(客户端服务端)入门详解

写在前面&#xff1a; 本篇博客探讨&实践环境如下&#xff1a; 1.操作系统&#xff1a; Linux 2.版本(可以通过命令 cat /etc/os-release 查看版本信息)&#xff1a;PRETTY_NAME“CentOS Linux 7 (Core)” 编程语言:C 一、socket 是什么&#xff1f; 常常说socket 、套接字…