按键外部中断的软件设计

描述

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灯在每秒钟翻转一次状态。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分