在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; } } }
浙公网安备 33010602011771号