基于单片机的按键中断控制

4.1 原理图分析查看ek-ra6m4的原理图,如下图所示,该开发板上有2个用户按键。
根据原理图可知,这2个按键的控制逻辑为:
按键s1s2
引脚 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 11extern int key_init(void);extern void icu_deinit(void);#endif /* bsp_key_h_ */创建按键操作相关的c文件 src/bsp_key.c 如下:
#include #include bsp_led.h#include bsp_key.h#include bsp_api.h#include common_data.hint 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。

罗克韦尔柯林斯MA700涡轮螺旋桨飞机提供先进电子惶恐系统
伺服系统的惯量匹配原则
无人机培训机构可实现推动整个生态经济更好更快地发展
人工智能产业发展分析:美国与日本已经抢占先机领先于其他国家
关于VR发展方向,Valve和Oculus看法迥异
基于单片机的按键中断控制
火神山秒建5G基站,“云监工”背后的通信技术
深圳单警执法视音频记录仪的功能特点
又上新!北通新游戏手柄海报现身 背景英朗剪影耐人寻味
谁才是人工智能淘金热中真正能获得经济利益的人?
AI换脸技术背后竟存在个人隐私泄露风险?
特斯拉“核心动力”将被迁移至中国苏州?松下如此看重中国市场?
VAIO推出一款12.5英寸屏幕笔记本 售价约合13000元人民币
亚马逊智能家电新技术将开启语音控制时代
CCD传感器是什么_CCD传感器的应用
常见的无线蓝牙耳机推荐
苹果新款iPhone XI Max曝光搭载了三颗摄像头缩小了刘海以及边框
小鹏汽车:正在努力削减成本,将推动毛利率大幅提升
世界顶尖的芯片公司有哪些
华南理工大学实现了量子点可控生长