下面说明 中断设置的SDK版本:sdk_bt892xa2_v01x_s4041
中断是指系统在执行的过程中系统内发生任何非寻常或者非预期的急需处理处理事件,使得CPU暂时中断当前执行的程序去处理相应需要处理的程序,待处理完毕后又返回原来被中断处继续执行或调度新的进程执行的过程。
中断的使用在外设的使用中是非常常见的。下面说下中断的初始化:
/* 下面的中断初始化使用
中断脚 PE6
触发方式 下降沿
*/
void test_int_init(void) //sys_set_tmr_enable(1, 1); 前调用
{
//porting TODO: host platform peripheral dirver
GPIOEDE |= BIT(6);//数字IO使能: 0为模拟IO, 1 为数字IO
GPIOEDIR |= BIT(6); //控制IO的方�? 0为输�? 1为输�?
GPIOEFEN &= ~BIT(6);//0:当作通用GPIO使用 //1:当作其它功能性IO,如串�?SPI..
GPIOEPU |= BIT(6);//10K上拉使能
sys_irq_init(IRQ_PORT_VECTOR, 0, test_int_handler);
PORTINTEN |= BIT(19);
PORTINTEDG |= BIT(19);
WKUPEDG |= BIT(6); //falling edge
//WKUPEDG &= ~BIT(5); //raising edge
WKUPCON = BIT(6) | BIT(16); //falling edge wake iput //wakeup int en
//WDT_CLR();
}
通过上面的代码可以看出,首先对IO口进行了设置 -> 设置中断处理函数 -> 中断使能 -> 设置触发方式
IO 口的设置这里就不说了,我之前的博客中有单独说明。说下中断初始化函数:
/* 函数声明在 api_sys.h 文件中*/
/* 函数说明
vector:设置中断类型
pr:中断优先级 一般情况下 为0
isr:中断处理函数
return:成功返回 true 失败返回 false*/
bool sys_irq_init(int vector, int pr, isr_t isr); //初始化一个中断, pr为优先级
中断的类型在 api_sys.h 文件中(如下图),根据自己的需求去设置。(外设的中断类型一般都是IRQ_PORT_VECTOR吧。哈哈哈,我也不是很确定。)
中断函数需要按照蓝汛内部的规则来设置,否则不会产生中断。如下:
/* 中断处理函数设置和规则说明
1、中断函数中可以打印log,但是必须把log打印信息放在 .com_text 分区中。
(直接打印信息会导致系统崩溃)
2、中断中需要手动进行清中断(有些平台是不需要手动清中断,是内部已经做好
了清中断的动作)
3、中断函数需要放在 .com_text.timer 分区中
*/
AT(.com_text)
const char test_str2[] = "test_int_handler enter\n";
AT(.com_text.timer)
void test_int_handler()
{
msg_enqueue(EVT_TEST_INT); // 发送消息出来进行处理真正的中断处理函数
if ((WKUPEDG & (BIT(6) << 16))) {
WKUPCPND = (BIT(6) << 16); //CLEAR PENDING
printf(test_str2);
}
}
中断中可以做一点小处理。真正的处理函数还是需要发送出来处理的,可以通过 msg_enqueue 将消息发送出来进行处理。msg_enqueue 发送出去的消息是在 void func_message(u16 msg) 函数中进行处理的。在switch 中添加相应的 case 进行处理函数的处理。
中断函数的放置也是很重要的,test_int_init 必须放在 sys_set_tmr_enable(1, 1); 函数的前面。也不是所有的这个函数前面,刚开机 在 void bsp_sys_init(void) 函数(bsp_sys.c文件中)中 sys_set_tmr_enable(1, 1); 的前面就可以了。
在中科蓝讯平台中,不是中断函数初始化一次就可以一直存活到你关机。在进入休眠之前会把所有的中断销毁,待唤醒还不会自动生成。所以在进入休眠之后唤醒还需要再进行一次中断函数的初始化。
static void sfunc_sleep(void) 函数是对蓝牙的休眠和唤醒的管理。在该函数中的唤醒部分找到 sys_set_tmr_enable(1, 1); 的位置,将中断初始化函数放在该位置的前面就可以了。
如上图可以看到有很多情况下可以唤醒蓝牙设备的判断。你也可以加上你需要的条件进行判断唤醒设备。
讲到这里就已经结束了,还有不足或者需要注意的点后续在添加。