在BLE例程中开启HAL_SLEEP低功耗后是通过RTC唤醒来实现的,那么需要加入GPIO唤醒需怎么添加呢,其实很简单:只要添加PM例程中的GPIO唤醒部分即可,睡眠部分也需要处理下。

GPIO只需要初始化和增加中断服务函数即可。

#include "gpio_wake.h"

volatile uint8_t wake_flag=0;

void GpioWakeInit()
{
GPIOA_ModeCfg(GPIO_Pin_5, GPIO_ModeIN_PU);
GPIOA_ITModeCfg(GPIO_Pin_5, GPIO_ITMode_FallEdge); // 下降沿唤醒
PFIC_EnableIRQ(GPIO_A_IRQn);
PWR_PeriphWakeUpCfg(ENABLE, RB_SLP_GPIO_WAKE, Long_Delay);
}


__INTERRUPT
__HIGH_CODE
void GPIOA_IRQHandler(void)
{
wake_flag=1;
GPIOA_ClearITFlagBit(GPIO_Pin_5);
}

睡眠函数处理:

uint32_t CH59x_LowPower(uint32_t time)
{
#if(defined(HAL_SLEEP)) && (HAL_SLEEP == TRUE)
    volatile uint32_t i;
    uint32_t time_sleep, time_curr;
    unsigned long irq_status;
    if(wake_flag){
       return 2;
    }
    // 提前唤醒
    if (time <= WAKE_UP_RTC_MAX_TIME) {
        time = time + (RTC_MAX_COUNT - WAKE_UP_RTC_MAX_TIME);
    } else {
        time = time - WAKE_UP_RTC_MAX_TIME;
    }

    SYS_DisableAllIrq(&irq_status);
    time_curr = RTC_GetCycle32k();
    // 检测睡眠时间
    if (time < time_curr) {
        time_sleep = time + (RTC_MAX_COUNT - time_curr);
    } else {
        time_sleep = time - time_curr;
    }
    
    // 若睡眠时间小于最小睡眠时间或大于最大睡眠时间,则不睡眠
    if ((time_sleep < SLEEP_RTC_MIN_TIME) || 
        (time_sleep > SLEEP_RTC_MAX_TIME)) {
        SYS_RecoverIrq(irq_status);
        return 2;
    }

    RTC_SetTignTime(time);
    SYS_RecoverIrq(irq_status);
  #if(DEBUG == Debug_UART1) // 使用其他串口输出打印信息需要修改这行代码
    while((R8_UART1_LSR & RB_LSR_TX_ALL_EMP) == 0)
    {
        __nop();
    }
  #endif
    // LOW POWER-sleep模式
    if(!RTCTigFlag)
    {
        LowPower_Sleep(RB_PWR_RAM2K | RB_PWR_RAM24K | RB_PWR_EXTEND | RB_XT_PRE_EN );
        if(wake_flag){
           DelayUs(200);
        }
        HSECFG_Current(HSE_RCur_100); // 降为额定电流(低功耗函数中提升了HSE偏置电流)
        i = RTC_GetCycle32k();
        while(i == RTC_GetCycle32k());
        return 0;
    }
#endif
    return 3;
}

主循环添加程序官网gpio唤醒:

__HIGH_CODE
__attribute__((noinline))
void Main_Circulation()
{
    while(1)
    {
        TMOS_SystemProcess();
        if(wake_flag){
            PRINT("pa5 wake\n");
            wake_flag=0;
        }
    }
}

 

posted on 2025-11-01 12:10  WCH蓝牙应用分享  阅读(0)  评论(0)    收藏  举报