4.1 原理图分析
查看EK-RA6M4的原理图,如下图所示,该开发板上有2个用户按键。
根据原理图可知,这2个按键的控制逻辑为:
按键 | S1 | S2 |
---|---|---|
引脚 | P005 | P006 |
电平 | 按键按下低电平、按键释放高电平 | 按键按下低电平、按键释放高电平 |
4.2 中断配置
首先,在FSP配置中将按键所用的两个GPIO口配置成中断模式。
- 在这里,我们可以查找到 P005 、P006的中断号分别为 IRQ10 和 IRQ11;
接着选择 Stacks , 点击 "New Stack" -> "Input" -> "External IRQ(r_icu)" 添加外部中断协议栈。
接下来配置相关的按键中断,并重新生成代码。
- 通过 Name 字段可以修改按键中断的名称为 g_key1_irq,它将在IDE自动生成的文件 ra_gen/common_data.c/h 中定义按键操作相关的变量;
- 通过 Channel 字段可以修改按键的中断号,这里设置为10,下面的 Pins 将自动选择 P005 这个引脚;
- 通过 Trigger 字段可以修改中断的触发方式为下降沿触发;
- 通过 Callback 字段设置按键的中断回调函数,它将配置在 g_key1_irq_cfg 变量中,该函数需要我们自己实现;
- 另外,我们也可以在这里修改按键中断的优先级;
4.3 源码修改
创建按键操作相关的头文件 src/bsp_key.h 如下:
#ifndef BSP_KEY_H_
#define BSP_KEY_H_
#define USER_KEY1_IRQ_NUMBER 10
#define USER_KEY2_IRQ_NUMBER 11
extern int key_init(void);
extern void icu_deinit(void);
#endif /* BSP_KEY_H_ */
创建按键操作相关的c文件 src/bsp_key.c 如下:
#include h>
#include "bsp_led.h"
#include "bsp_key.h"
#include "bsp_api.h"
#include "common_data.h"
int key_init(void)
{
int err = FSP_SUCCESS;
/* Open and enable key1 interrupt */
err = R_ICU_ExternalIrqOpen(&g_key1_irq_ctrl, &g_key1_irq_cfg);
if (FSP_SUCCESS != err)
{
printf ("
**R_ICU_ExternalIrqOpen API FAILED**
");
return err;
}
err = R_ICU_ExternalIrqEnable(&g_key1_irq_ctrl);
if (FSP_SUCCESS != err)
{
printf ("
**R_ICU_ExternalIrqOpen API FAILED**
");
return err;
}
/* Open and enable key1 interrupt */
err = R_ICU_ExternalIrqOpen(&g_key2_irq_ctrl, &g_key2_irq_cfg);
if (FSP_SUCCESS != err)
{
printf ("
**R_ICU_ExternalIrqOpen API FAILED**
");
return err;
}
err = R_ICU_ExternalIrqEnable(&g_key2_irq_ctrl);
if (FSP_SUCCESS != err)
{
printf ("
**R_ICU_ExternalIrqOpen API FAILED**
");
return err;
}
return err;
}
void icu_deinit(void)
{
R_ICU_ExternalIrqClose(&g_key1_irq_ctrl);
R_ICU_ExternalIrqClose(&g_key2_irq_ctrl);
}
void key_callback(external_irq_callback_args_t *p_args)
{
static bsp_led_status_t status[2] = { BSP_LEDON, BSP_LEDON};
if(USER_KEY1_IRQ_NUMBER == p_args->channel)
{
turn_led(BSP_LEDRED, status[0]);
status[0] ^= 1;
}
else if(USER_KEY2_IRQ_NUMBER == p_args->channel)
{
turn_led(BSP_LEDGREEN, status[1]); status[1] ^= 1;
}
}
- 按键回调函数 key_callback() 将分别通过两个按键控制 红绿两个灯的亮灭。
修改 src/hal_entry.c 源文件,在里面添加按键初始化代码并修改蓝色Led灯为系统运行的心跳灯状态。
... ...
#include "bsp_key.h"
... ...
void hal_entry(void)
{
... ...
key_init();
while (1)
{
turn_led(BSP_LEDBLUE, BSP_LEDON);
delay_ms(200);
turn_led(BSP_LEDBLUE, BSP_LEDOFF);
delay_ms(200);
turn_led(BSP_LEDBLUE, BSP_LEDON);
delay_ms(200);
turn_led(BSP_LEDBLUE, BSP_LEDOFF);
delay_ms(200);
turn_led(BSP_LEDBLUE, BSP_LEDON);
delay_ms(500);
turn_led(BSP_LEDBLUE, BSP_LEDOFF);
delay_ms(1000);
}
}
4.4 编译运行
代码修改完成后,在开发板上编译运行,蓝色Led将作为系统状态心跳灯,而按下S1、S2将点亮红色和绿色Led,再次按下则将灭掉Led。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
原理图
+关注
关注
1267文章
6180浏览量
225561 -
单片机
+关注
关注
5999文章
43966浏览量
620734 -
GPIO
+关注
关注
16文章
1132浏览量
50560 -
按键中断
+关注
关注
0文章
14浏览量
6412
发布评论请先 登录
相关推荐
利用单片机的中断系统完成程序设计
实验目的和任务目的:利用“模块化单片机教学实验平台”,加深对单片机的中断系统的理解。任务:利用单片机的中断系统完成程序设计。 实验内容使用A
发表于 07-21 07:22
51单片机的按键输入
按键可以说是51单片机项目开发的一个重要组件了,它是作为51单片机IO口输入的一种重要方式。我们可以通过按键控制单片机执行相应的程序,得到我们想要得效果。51
发表于 11-18 07:39
单片机--中断系统实验
实验目的和任务目的:利用“模块化单片机教学实验平台”,加深对单片机的中断系统的理解。任务:利用单片机的中断系统完成程序设计。 实验内容使用A
发表于 11-05 13:20
•11次下载
评论