一:GPIO介绍:
I/O 端口引脚的功能与通用 I/O 端口引脚、外设模块的 I/O 引脚、中断输入引脚、模拟 I/O、ELC 的端口组功能相同。
所有引脚在复位后立即作为输入引脚工作,其引脚功能通过寄存器设置进行切换。每个引脚的 I/O 端口和外设模块在相关寄存器中均有指定。图 16.1 展示了 I/O 端口寄存器的连接图。I/O 端口的配置会因封装而有所不同。表 16.1 列出了不同封装下的 I/O 端口规格,表 16.2 列出了端口功能。
二:板载的按键控制按键:
这里我们可以看到板载的两个按键, 分别为RST和S1(P200)按键操作,这里我是用板载的按键调试外部输入端,并且使用项目1中的LED作为指示;可以直观的看到按键按下的状态;
三:FSP库的配置如下所示:
Name:g_external_irq0,这是该外部中断的名称。
Channel:选择了0通道。
Trigger:触发方式设置为Rising(上升沿触发),即信号上升时触发中断。
Digital Filtering:未启用数字滤波(Not Supported)。
Digital Filtering Sample Clock:由于数字滤波未启用,因此该项也未支持。
Callback:指定了回调函数exit0_callback。当中断触发时,将调用此函数处理具体逻辑。
Pin Interrupt Priority:设置为Priority 2,表示该中断的优先级为2。
IRQ0:映射到引脚P200,即该中断信号通过引脚P200触发
中断回调函数:
exit0_callback函数是外部中断的回调函数,当中断触发时,icu_irq_isr中断服务程序会调用此函数。
g_external_irq_complete变量在每次中断时切换状态(如果是0则变1,如果是1则变0)
三:程序编写:
3.1 中断初始化:
void exit0_Init(void) { fsp_err_t err = R_ICU_ExternalIrqOpen(&g_external_irq0_ctrl, &g_external_irq0_cfg); assert(FSP_SUCCESS == err); err = R_ICU_ExternalIrqEnable(&g_external_irq0_ctrl); assert(FSP_SUCCESS == err); }
3.2 在中断回调函数中,添加对LED的电平翻转功能:
bool g_external_irq_complete =0; /* Called from icu_irq_isr */ void exit0_callback (external_irq_callback_args_t * p_args) { (void) p_args; g_external_irq_complete = !g_external_irq_complete; if(g_external_irq_complete ) { R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_03, BSP_IO_LEVEL_LOW); } else { R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_03, BSP_IO_LEVEL_HIGH); } }
四:实物验证如下所示:
外部中断的场景运用如下:
按键检测
场景描述:这是最经典的应用。比如设备的开关机键、功能设置键、紧急停止按钮等。
为何用中断:如果使用循环扫描(whi1e 循环)的方式去检测按键,程序效率低下,且容易漏掉短时间的按键。使用外部中断,只要按键被按下(下降沿或低电平触发),CPU会立即响应,确保每一次按键动作都被准确捕获。对于紧急停止按钮,必须使用中断,以确保无论CPU在执行什么任务都能被立即打断。
2.触摸传感器/电容触摸
场景描述:现代智能设备(如手机、触摸开关)的触摸感应。
为何用中断:原理类似按键,但通常由专用触摸芯片产生中断信号。主CPU无需持续检测触摸状态仅在触摸事件发生时(中断触发)才去读取触摸芯片的数据,大大降低了功耗和CPU占用。