15.3.2
软件设计
15.3.2.1
新建工程
对于e2studio开发环境
拷贝一份我们之前的e2s工程“11_GPIO_LED”,然后将工程文件夹重命名为“16_ICU_External_IRQ”,最后再将它导入到我们的e2studio工作空间中。
对于Keil开发环境
拷贝一份我们之前的Keil工程“11_GPIO_LED”,然后将工程文件夹重命名为“16_ICU_External_IRQ”,并进入该文件夹里面双击Keil工程文件,打开该工程。
工程新建好之后,在工程根目录的“src”文件夹下面新建“key”文件夹,再进入“key”文件夹里面新建源文件和头文件:“bsp_key_irq.c”和“bsp_key_irq.h”。工程文件结构如下。
列表1:文件结构
左右滑动查看完整内容
16_ICU_External_IRQ ├─ ...... └─src ├─ led │ ├─ bsp_led.c │ └─ bsp_led.h ├─ key │ ├─ bsp_key_irq.c │ └─ bsp_key_irq.h └─ hal_entry.c
15.3.2.2
FSP配置
首先打开“16_ICU_External_IRQ”项目的FSP配置界面,接下来我们要在这个界面里配置芯片的引脚及其相应的功能。
以野火启明6M5开发板为例,首先配置引脚连接到ICU的中断通道。

点击可查看大图
然后,依次点击“Stacks”->“NewStack”->“Input”->“ExternalIRQ”来加入外部中断模块,如下图所示。由于使用两个按键,需要两个外部中断,所以这里需要加入2个外部中断模块。

点击可查看大图
第一个外部中断模块设置的是按键1的外部中断配置,按如下图所示进行设置:

点击可查看大图
第二个外部中断模块设置的是按键2的外部中断配置,按如下图所示进行设置:

点击可查看大图
外部中断模块(r_icu)的属性介绍如下表所示。
表4 External IRQ属性介绍:
开发板按键引脚分配和中断号

点击可查看大图
配置完成之后可以按下快捷键“Ctrl+S”保存,最后点右上角的“GenerateProjectContent”按钮,让软件自动生成配置代码即可。
15.3.2.3
按键外部中断初始化函数
列表2 代码清单16_1:
外部中断初始化函数:文件结构
左右滑动查看完整内容
/* KEY 外部中断初始化函数 */
voidKey_IRQ_Init(void)
{
fsp_err_t err =FSP_SUCCESS;
/* Open ICU module */
err =R_ICU_ExternalIrqOpen(&g_external_irq9_ctrl, &g_external_irq9_cfg);
err =R_ICU_ExternalIrqOpen(&g_external_irq10_ctrl, &g_external_irq10_
→cfg);
/* 允许中断 */
err =R_ICU_ExternalIrqEnable(&g_external_irq9_ctrl);
err =R_ICU_ExternalIrqEnable(&g_external_irq10_ctrl);
}
R_ICU_ExternalIrqOpen()用于打开一个外部中断模块实例。
2.R_ICU_ExternalIrqEnable()用于使能外部中断,使能后即可触发产生外部中断。
15.3.2.4
使能FPU
因为之前的FSP配置里面Callback属性配置的都是同一个中断回调函数,因此,我们仅需实现一个中断回调函数即可。当然,中断回调函数也可设置为不同的两个函数,由用户定义。
两个按键共用key_external_irq_callback中断回调函数,并通过p_args->channel参数来判断是哪个中断通道产生了中断从而判断是哪个按键按下,该函数如下:
列表3 代码清单16_2:按键中断回调函数
左右滑动查看完整内容
/* 按键按下标志 */
volatilebool key1_sw2_press =false;
volatileboolkey2_sw3_press =false;
/*按键中断回调函数*/
voidkey_external_irq_callback(external_irq_callback_args_t *p_args)
{
/*判断中断通道*/
if(9== p_args->channel)
{
key1_sw2_press=true;//按键KEY1_SW2按下
}
elseif(10== p_args->channel)
{
key2_sw3_press=true;//按键KEY2_SW3按下
}
}
15.3.2.5
hal_entry入口函数
hal_entry入口函数如下所示:
列表4 代码清单16_3:hal_entry入口函数
自由滑动查看完整内容
/*用户头文件包含*/
#include"led/bsp_led.h"
#include"key/bsp_key_irq.h"
externvolatileboolkey1_sw2_press;
externvolatileboolkey2_sw3_press;
voidhal_entry(void)
{
/*TODO:add your own code here */
LED_Init();// LED 初始化
Key_IRQ_Init();// KEY 外部中断初始化
while(1)
{
/* 判断按键 KEY1_SW2 是否被按下 */
if(key1_sw2_press)
{
key1_sw2_press =false;//标志位清零
LED2_TOGGLE;
}
//LED2 翻转
/* 判断按键 KEY2_SW3 是否被按下 */
if(key2_sw3_press)
{
key2_sw3_press =false;//标志位清零
LED3_TOGGLE;
}
//LED3 翻转
// LED1 闪烁指示程序正在运行
LED1_TOGGLE;
R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_SECONDS);//延时 1 秒
// 按键被按下触发中断后,在主循环中 LED2 或 LED3 最长会被推迟 1 秒翻转
}
#ifBSP_TZ_SECURE_BUILD
/* Enter non-secure code */
R_BSP_NonSecureEnter();
#endif
}
15.3.3
下载验证
把编译好的程序下载到开发板并复位,按下用户按键1和按键2即可分别控制LED2和LED3灯的亮灭。同时LED1灯在每秒钟翻转一次状态。
-
led
+关注
关注
244文章
24715浏览量
692428 -
软件设计
+关注
关注
3文章
65浏览量
18323 -
开发环境
+关注
关注
1文章
275浏览量
17673 -
外部中断
+关注
关注
1文章
135浏览量
16691
原文标题:实验:按键外部中断的软件设计——瑞萨RA系列FSP库开发实战指南(40)
文章出处:【微信号:瑞萨嵌入式小百科,微信公众号:瑞萨嵌入式小百科】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
按键触发外部中断
介绍几种按键硬件、软件设计方面的技巧
STM32按键扫描/按键中断/外部中断资料下载
STM32f10x 外部中断及中断分组
STM32F407学习记录---外部中断实验
GD32外部中断(按键问题实现)
STM32基本GPIO操作:按键输入(扫描+外部中断)
STM32 HAL库 CubeMX教程(四)按键外部中断
按键外部中断的软件设计
评论