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 秒翻转
}
#if BSP_TZ_SECURE_BUILD
/* Enter non-secure code */
R_BSP_NonSecureEnter();
#endif
}
15.3.3
下载验证
把编译好的程序下载到开发板并复位,按下用户按键1和按键2即可分别控制LED2和LED3灯的亮灭。同时LED1灯在每秒钟翻转一次状态。
全部0条评论
快来发表一下你的评论吧 !