1 介绍
本文介绍EFR32MG24中断的用法,这里用一个按键触发中断作为例子。
2 错误纠正
在之前的文章中有一处介绍错误,这里纠正一下。
之前介绍说需要在app_init函数中进行初始化,例如下面的LED灯和串口的初始化操作。
void app_init(void)
{
sl_simple_led_init_instances();
sl_uartdrv_init_instances();
}
其实是不用的,在使用***.slcp生成的工程代码中,main函数中会调用sl_system_init();函数,
void sl_system_init(void)
{
sl_platform_init();
sl_driver_init();
sl_service_init();
sl_stack_init();
sl_internal_app_init();
}
其中的sl_driver_init();函数就已经把需要的外设驱动初始化了,
void sl_driver_init(void)
{
GPIOINT_Init();
sl_simple_led_init_instances();
sl_uartdrv_init_instances();
}
这样就不需要再次初始化一遍外设的驱动。
3 中断配置
这里还使用之前的btn0对应的PB02接口作为中断源。
![image.png](//file1.elecfans.com/web2/M00/04/5C/wKgaombD0_2AWxu7AAAR9Nzr0zI887.png)
在之前的sl_driver_init(void)函数中可以看到有一个GPIOINT_Init();
这里已经对GPIO的中断做了一定的配置。
![image.png](//file1.elecfans.com/web2/M00/03/6F/wKgZombD1HCABqKTAABBcKNFV1Q760.png)
在gpiointerrupt.c中可以看到有两个和中断相关的函数
![image.png](//file1.elecfans.com/web2/M00/03/6F/wKgZombD1NOAYWX0AABguGiNs2Q304.png)
和![image.png](//file1.elecfans.com/web2/M00/04/5C/wKgaombD1OGAfwcUAACARBL5aXo755.png)
通过函数的说明也可以看出这是中断的绑定接口函数
4 具体操作
调用sl_simple_button_init(&sl_button_btn0);对BTN0中断进行初始化
这个函数中已经对中断的相关触发和处理函数进行了关联
![image.png](//file1.elecfans.com/web2/M00/03/6F/wKgZombD1eqAXvjAAAD2hoJNRCU816.png)
其中
interrupt = GPIOINT_EM4WUCallbackRegisterExt(simple_button->port,
simple_button->pin,
(GPIOINT_IrqCallbackPtrExt_t)sli_simple_button_on_change,
button);
sli_simple_button_on_change()就是对应的中断回调函数。
编译下载运行,在sli_simple_button_on_change()函数中打断点运行。每次按下按键都能正常进入中断处理函数执行。
|