e2studio开发RA4M2.6--GPIO外部中断(IRQ)配置
- 概述
- 视频教学
- 样品申请
- 硬件准备
- 参考程序
- 源码下载
- 新建工程
- 工程模板
- 保存工程路径
- 芯片配置
- 工程模板选择
- 时钟设置
- SWD调试口设置
- GPIO口配置
- 按键中断配置
- 中断回调函数
- 主程序
概述
GPIO(通用输入/输出)引脚作为嵌入式系统的基本接口,可以用于信号输入、输出以及事件检测。GPIO外部中断(IRQ)是一种常见的硬件中断配置,通过在特定引脚上检测信号的变化(例如上升沿或下降沿)来触发中断响应。这种机制在按钮按压、传感器信号输入等场景中尤为常用,可实现低延迟的事件捕获与处理。
最近在瑞萨RA的课程,需要样片的可以加qun申请:925643491。
视频教学
https://www.bilibili.com/video/BV1dANAeKEjm/
e2studio开发RA4M2(6)----GPIO外部中断(IRQ)配置
样品申请
https://www.wjx.top/vm/rCrkUrz.aspx
硬件准备
首先需要准备一个开发板,这里我准备的是自己绘制的开发板,需要的可以进行申请。
主控为R7FA4M2AD3CFL#AA0
参考程序
https://github.com/CoreMaker-lab/RA2E1
https://gitee.com/CoreMaker/RA2E1
源码下载
新建工程
工程模板
保存工程路径
芯片配置
本文中使用R7FA4M2AD3CFL#AA0来进行演示。
工程模板选择
时钟设置
开发板上的外部高速晶振为12M.
需要修改XTAL为12M。
SWD调试口设置
GPIO口配置
由下图我们可以得知,板子上有3个LED灯,同时需要给高电平才可以点亮,故以P002、P103、P104管脚为例,配置方式如下所示。
在e2studio中可以直接设置P103、P104为输出口。
按键中断配置
由下图我们可以得知,按键在P111、P112、P013管脚,并且有一个上拉,这里配置P111按键。
在“New Stack”下选择Input > External IRQ (r_icu)。
模块配置如下所示。
● Name:g_external_irq4,这是该外部中断的名称。
● Channel:选择了4通道。
● Trigger:触发方式设置为Rising(上升沿触发),即信号上升时触发中断。
● Digital Filtering:未启用数字滤波(Not Supported)。
● Digital Filtering Sample Clock:由于数字滤波未启用,因此该项也未支持。
● Callback:指定了回调函数external_irq4_callback。当中断触发时,将调用此函数处理具体逻辑。
● Pin Interrupt Priority:设置为Priority 2,表示该中断的优先级为2。
● IRQ06:映射到引脚P000,即该中断信号通过引脚P111触发。
中断回调函数
● external_irq4_callback函数是外部中断的回调函数,当中断触发时,icu_irq_isr中断服务程序会调用此函数。
● g_external_irq4_complete变量在每次中断时切换状态(如果是0则变1,如果是1则变0)。
bool g_external_irq_complete =0;
/* Called from icu_irq_isr */
void external_irq4_callback (external_irq_callback_args_t * p_args)
{(void) p_args;g_external_irq_complete = !g_external_irq_complete;
}
主程序
● 调用R_ICU_ExternalIrqOpen函数初始化外部中断模块g_external_irq4。g_external_irq4_ctrl和g_external_irq4_cfg是配置外部中断的控制结构体和配置结构体。
● 如果初始化成功,err会返回FSP_SUCCESS,否则程序会停止(通过assert进行错误检测)。
fsp_err_t err = R_ICU_ExternalIrqOpen(&g_external_irq4_ctrl, &g_external_irq4_cfg);assert(FSP_SUCCESS == err);
● 启用外部中断,使其可以响应触发事件。
● assert用于确认操作成功,否则程序会停止。
err = R_ICU_ExternalIrqEnable(&g_external_irq4_ctrl);assert(FSP_SUCCESS == err);
主循环中根据g_external_irq_complete的状态来控制GPIO引脚的高低电平。
while(1){if(g_external_irq_complete){R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_03, BSP_IO_LEVEL_HIGH);R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_04, BSP_IO_LEVEL_LOW);}else{R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_03, BSP_IO_LEVEL_LOW);R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_04, BSP_IO_LEVEL_HIGH);}}