【WCH蓝牙系列芯片】-基于CH592开发板—BLE_USB程序中低功耗模式下,USB设备的拔插唤醒操作
-------------------------------------------------------------------------------------------------------------------------------------

最简单的方式就通过硬件检测,将USB的5V输入脚引出来,然后通过电阻分压的方式,把CH592拉出来一个GPIO脚接上,通过GPIO的外部中断来进行唤醒和睡眠操作,当USB设备接入到主机时该引脚上产生了从低电平变到高电平的状态,从而判断为USB设备接入,芯片唤醒,USB设备工作。当高电平转换到低电平的时候,此时判断USB设备拔出,芯片又重新进入低功耗模式。




在工程文件中,添加GPIO外部中断的函数,在外部中断初始化中,先将PB4配置为下拉输入,方式IO口漏电到芯片中。并将GPIOB引脚中断模式配置为上升沿触发。然后先清除一下标注位,然后再重新开启GPIOB的中断,然后启用GPIO唤醒功能。


在下降沿中断里,先将flag_wakeup标志位清除,退出唤醒状态。然后关闭GPIOB的中断功能,也关闭GPIO中断唤醒功能,并且重新初始一下app_usb_init();,为了将USB中断失能,不能让USB干扰蓝牙的低功耗睡眠状态。

//中断函数
__attribute__((interrupt("WCH-Interrupt-fast")))
__attribute__((section(".highcode")))
void GPIOB_IRQHandler( void )
{
i++;
printf("i = %d\r\n",i);
if(GPIOB_ReadITFlagBit(GPIO_Pin_4)) // 检查GPIO4的中断标志
{
if(flag_wakeup == 0) // 如果flag_wakeup为0,表示是上升沿触发的中断
{
flag_wakeup = 1; // 设置flag_wakeup标志位
GPIOB_ITModeCfg( GPIO_Pin_4, GPIO_ITMode_FallEdge ); //上升沿触发
GPIOB_ClearITFlagBit( GPIO_Pin_4);//清中断
PFIC_EnableIRQ( GPIO_B_IRQn );//开启GPIOB中断
app_usb_init(); //重新初始化USB
USB_DeviceInit();
PFIC_EnableIRQ( USB_IRQn ); //使能USB中断
}
else //表示是下降沿触发的中断
{
flag_wakeup = 0; // 清除flag_wakeup标志位
printf("/flag_wakeup/ = %x \n",flag_wakeup);
PFIC_DisableIRQ(GPIO_B_IRQn); //关闭GPIO中断唤醒功能
PWR_PeriphWakeUpCfg(DISABLE, RB_SLP_GPIO_WAKE, Long_Delay);
app_usb_init(); //将USB中断关闭
}
GPIOB_ClearITFlagBit(GPIO_Pin_4); // 清除中断标志
}
}
在低功耗睡眠函数中,通过判断flag_wakeup这个标志位,当这个上升沿触发后,flag_wakeup标志位为1,说明USB设备已经插入,这个时候就直接退出低功耗状态,不进行休眠。并将GPIO外部中断函数初始化,配置GPIO中断唤醒源为PB4.



当USB插入后,可以明显看到功耗上升,蓝牙唤醒。通过串口调试工具可以看到COM15口,COM15模拟出一个CH340设备,这样就可以与蓝牙进行透传数据。


当拔掉USB之后,观察功耗仪从唤醒状态,又重新进入低功耗休眠状态。这样也就完成USB插入唤醒和拔出睡眠的操作。

浙公网安备 33010602011771号