【WCH蓝牙系列芯片】-基于CH585开发板—IO口(GPIO)外部中断唤醒蓝牙睡眠模式
-------------------------------------------------------------------------------------------------------------------------------------
可以新建一个文件,用来配置GPIO的外部中断初始化状态。
添加上外部中断服务函数
#include "CONFIG.h" #include "HAL.h"volatile uint8_t flag_wakeup = 0; uint8_t i = 0;//GPIo的外部中断初始化 void EXTI0_pwr_INIT(void) {GPIOB_ModeCfg( GPIO_Pin_4, GPIO_ModeIN_PU ); //部分GPIO中断引脚初始化GPIOB_ITModeCfg( GPIO_Pin_4, GPIO_ITMode_FallEdge ); // 下降沿中断PFIC_EnableIRQ( GPIO_B_IRQn );//开启GPIOB中断PWR_PeriphWakeUpCfg(ENABLE, RB_SLP_GPIO_WAKE, Long_Delay); //表示启用外设唤醒, GPIO 外设唤醒标识,Long_Delay:表示要配置长延迟模式 }//中断函数 __HIGH_CODE __attribute__((interrupt("WCH-Interrupt-fast"))) void GPIOB_IRQHandler( void ) { // PRINT("%x \n",GPIOB_ReadITFlagPort()); //读GPIOA口中断状态 // PRINT("%x \n",GPIOB_ReadITFlagBit(GPIO_Pin_4)); //读GPIO4口中断状态 // PRINT("%x \n",GPIOB_ReadITFlagBit(GPIO_Pin_7)); //读GPIO7口中断状态flag_wakeup = 1;GPIOB_ClearITFlagBit( GPIO_Pin_4);//清中断 }
在中断函数中,先检测是否有PB4的中断标志状态,配置为下降沿中断触发,在中断服务函数中,通过设置标志位flag_wakeup置1,这样就代表触发PB4的IO中断触发
此时,IO的配置已经完程序,可以在蓝牙从机中的SLEEP.c文件中,进行IO中断后,进行唤醒的处理,在进入睡眠函数之前,进行中断标志位的判断,如果中断标志位置位后,检查到flag_wakeup == 1,此时就直接return 0;退出睡眠。
然后在SLEEP.c文件中,在添加中断函数的初始化,这样在低功耗模式下将GPIO外部中断函数初始化,配置GPIO中断唤醒源为PB4.
在定义一个清除睡眠标志位操作的事件任务,在GPIO_WAKE_BLE_EVT中进行一秒一次的循环操作,判断当前flag_wakeup是否为1,如果为1,就清0,清标志位,这样在睡眠函数中,就不会直接return 0;退出睡眠。而是会一直保持低功耗模式。