系列文章目录
1.连续打卡第一天:提前对CPK_RA2E1是瑞萨RA系列开发板的初体验,了解一下
2.开发环境的选择和调试(从零开始,加油)
3.欲速则不达,今天是对RA2E1 基础知识的补充学习。
4.e2 studio 使用教程
5.Keil配置使用(使用 RASC 生成 Keil 工程)
6.Keil配置使用(使用 RASC 生成 Keil 工程)
7.(电脑重装系统)学习RA产品家族选型手册
8.问题解决、学习RA寄存器、用寄存器的方式点亮第一个LED灯。
9.继续学习RA寄存器
10.FSP固件库开发及FSP配置详解。
11.FSP固件库开发点亮第一个灯。
文章目录
前言
按键检测输入,控制LED灯闪灭。实操是检验理论的真理,用实操来夯实我们的理论基础。
一、硬件电路
由硬件电路可见 按键 引脚在 P004 上。
瑞萨设计的微处理器(MCU)拥有硬件数字滤波的功能用来实现去除按键带来的纹波影响, 不过前提是按键用在外部中断作为按键信号输入的情况下使用, 通过使用数字滤波的方式能够替代掉用电容式滤波的方法来消除纹波, 从而减少我们在硬件上的开发成本。
只要我们检测引脚的输入电平,即可判断按键是否被按下。
二、使用步骤
1.新建工程
对于 e2 studio 开发环境:
拷贝一份我们之前的 e2s 工程 “GPIO_LED”, 然后将工程文件夹重命名为 “GPIO_Key”,最后再将它导入到我们的 e2 studio 工作空间中。
对于 Keil 开发环境:
拷贝一份我们之前的 Keil 工程 “GPIO_LED”, 然后将工程文件夹重命名为 “GPIO_Key”,并进入该文件夹里面双击 Keil 工程文件,打开该工程。
工程新建好之后,在工程根目录的 “src” 文件夹下面新建 “key” 文件夹, 再进入 “key” 文件夹里面新建 Key 驱动的源文件和头文件:“bsp_key.c” 和 “bsp_key.h”。 工程文件结构如下。
GPIO_Key ├─ ...... └─ Renesas RA Smart Configurator:Common Sources ├─ 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 的用户则不需要如此。
2.配置FSP
配置完成之后按下快捷键“Ctrl + S”保存,最后点右上角的 “Generate Project Content” 图标, 让软件根据我们的设置自动生成配置代码即可。
对于 Keil 这边 RASC 的 FSP 配置也是一样的,需要先通过 RASC 软件打开 Keil 工程相关的 FSP 配置界面。
3.编写代码
按键程序设计思路可以非常简单:想要知道某个按键是否被按下, 只需检测连接到改按键的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 枚举类型的变量 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;
代码如下:
#include "hal_data.h"
#include "key.h"
FSP_CPP_HEADER
void R_BSP_WarmStart(bsp_warm_start_event_t event);
FSP_CPP_FOOTER
/*******************************************************************************************************************//**
* main() is generated by the RA Configuration editor and is used to generate threads if an RTOS is used. This function
* is called by main() when no RTOS is used.
**********************************************************************************************************************/
void hal_entry(void) //相当于主函数 函数最终执行的地方
{
int a = 0;
while(1){
if( Key_Scan(KEY1_SW2_PIN) == KEY_ON ) //扫描按键1
{
a += 1;
}
if(a == 1){
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_05_PIN_02, BSP_IO_LEVEL_LOW); //LED2亮
}
if(a == 2){
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_05_PIN_02, BSP_IO_LEVEL_HIGH); //LED2亮
a = 0;
}
}
/* TODO: add your own code here */
#if BSP_TZ_SECURE_BUILD
/* Enter non-secure code */
R_BSP_NonSecureEnter();
#endif
}
#include "key.h"
/* LED初始化函数 */
void LED_Init(void)
{
/* 初始化配置引脚(这里重复初始化了,可以注释掉) */
R_IOPORT_Open (&g_ioport_ctrl, g_ioport.p_cfg);
}
/* 按键扫描函数(阻塞式)
* 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; //按键被按下了
}
#ifndef KEY_H
#define KEY_H
#include "stdint.h"
#include "hal_data.h"
/* RA2E1开发板,按键引脚定义 */
#define KEY1_SW2_PIN BSP_IO_PORT_00_PIN_04
#define KEY_ON 1
#define KEY_OFF 0
uint32_t Key_Scan(bsp_io_port_pin_t key);
#endif
视频效果:
瑞萨RA2E1 按键控制led闪烁
总结
熟练使用了按键控制,复习了以前学习的按键扫描,RA2E1板子爆赞!