【WCH蓝牙系列芯片】-基于CH585开发板—IO口(GPIO)外部中断唤醒蓝牙睡眠模式

-------------------------------------------------------------------------------------------------------------------------------------

  在蓝牙从机可以通过宏定义处输入HAL_SLEPP=1,这样就可以开启蓝牙从机低功耗模式。

  可以新建一个文件,用来配置GPIO的外部中断初始化状态。

image

  添加上外部中断服务函数

#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_1, GPIO_ModeIN_PU );   //部分GPIO中断引脚初始化
    GPIOB_ITModeCfg( GPIO_Pin_1, GPIO_ITMode_FallEdge ); // 下降沿中断

    GPIOB_ModeCfg( GPIO_Pin_10, GPIO_ModeIN_PU );   //部分GPIO中断引脚初始化
    GPIOB_ITModeCfg( GPIO_Pin_10, GPIO_ITMode_FallEdge ); // 下降沿中断

    GPIOB_ModeCfg( GPIO_Pin_9, GPIO_ModeIN_PU);   //部分GPIO中断引脚初始化
    GPIOB_ITModeCfg( GPIO_Pin_9, GPIO_ITMode_FallEdge ); // 下降沿中断

    PFIC_EnableIRQ( GPIO_B_IRQn );//开启GPIOB中断
    PWR_PeriphWakeUpCfg(ENABLE, RB_SLP_GPIO_WAKE, Long_Delay); //表示启用外设唤醒, GPIO 外设唤醒标识,Long_Delay:表示要配置长延迟模式
}


__INTERRUPT
__HIGH_CODE
void GPIOB_IRQHandler(void)
{
    uint16_t value = R16_PB_INT_IF & R16_PB_INT_EN;  //用寄存器方式读取中断标志位
    PRINT("-->  Triggered_Flag: 0x%04X \n", value);//检查是否是 PB9 产生的中断
   if(R16_PB_INT_IF & R16_PB_INT_EN & GPIO_Pin_9)
   {
       uint16_t value = R16_PB_INT_IF & R16_PB_INT_EN;
       PRINT("--> PB9 Triggered! Flag: 0x%04X \n", value);
       // 清除 PB9 的中断标志位,为下一次触发做准备
       printf("\r\n  ********************\r\n");
       flag_wakeup = 1;
       R16_PB_INT_IF = GPIO_Pin_9;  //清除标志位
   }

   if(R16_PB_INT_IF & R16_PB_INT_EN & GPIO_Pin_1)
   {
       PRINT("--> PB1 Triggered! Flag: 0x%04X \n", GPIO_Pin_1);
       // 清除 PB9 的中断标志位,为下一次触发做准备
       GPIOB_ClearITFlagBit(GPIO_Pin_1);
       printf("\r\n  ********************\r\n");
       flag_wakeup = 1;
   }

   if(R16_PB_INT_IF & R16_PB_INT_EN & GPIO_Pin_10)
   {
       PRINT("--> PB10 Triggered! Flag: 0x%04X \n", GPIO_Pin_10);
       // 清除 PB9 的中断标志位,为下一次触发做准备
       GPIOB_ClearITFlagBit(GPIO_Pin_10);
       printf("\r\n  ********************\r\n");
       flag_wakeup = 1;
   }
   GPIOB_ClearITFlagBit(0XFFFF);  //清除所有中断标志位
}

 

  在中断函数中,先检测是否有PB4的中断标志状态,配置为下降沿中断触发,在中断服务函数中,通过设置标志位flag_wakeup置1,这样就代表触发PB4的IO中断触发

  此时,IO的配置已经完程序,可以在蓝牙从机中的SLEEP.c文件中,进行IO中断后,进行唤醒的处理,在进入睡眠函数之前,进行中断标志位的判断,如果中断标志位置位后,检查到flag_wakeup == 1,此时就直接return 0;退出睡眠。 

image

  然后在初始化peripheral_main.c文件中,在添加中断函数的初始化,这样在低功耗模式下将GPIO外部中断函数初始化,配置GPIO中断唤醒源为PB4.

image

 

  在定义一个清除睡眠标志位操作的事件任务,在GPIO_WAKE_BLE_EVT中进行一秒一次的循环操作,判断当前flag_wakeup是否为1,如果为1,就清0,清标志位,这样在睡眠函数中,就不会直接return 0;退出睡眠。而是会一直保持低功耗模式。

image

  这样,整个gpio操作唤醒蓝牙低功耗模式流程就以完成。

 

image

 这个蓝牙睡眠唤醒的工程,是要在蓝牙主机与从机成功连接之后,才会进行检测退出唤醒,继续休眠。

 

 

 

 

posted on 2025-09-28 11:10  凡仕  阅读(222)  评论(0)    收藏  举报