查看EK-RA6M4的原理图,如下图所示,该开发板上有2个用户按键。
根据原理图可知,这2个按键的控制逻辑为:
按键 | S1 | S2 |
---|---|---|
引脚 | P005 | P006 |
电平 | 按键按下低电平、按键释放高电平 | 按键按下低电平、按键释放高电平 |
首先,在FSP配置中将按键所用的两个GPIO口配置成中断模式。
接着选择 Stacks , 点击 "New Stack" -> "Input" -> "External IRQ(r_icu)" 添加外部中断协议栈。
接下来配置相关的按键中断,并重新生成代码。
创建按键操作相关的头文件 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;
}
}
修改 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);
}
}
代码修改完成后,在开发板上编译运行,蓝色Led将作为系统状态心跳灯,而按下S1、S2将点亮红色和绿色Led,再次按下则将灭掉Led。
全部0条评论
快来发表一下你的评论吧 !