想法:先进入停止模式若干秒,唤醒后工作,然后再进入待机模式。主循环重复这个过程。但是实际情况是:只能进入一次待机状态,后续就只进停止模式,不进待机状态。请大家帮忙看看,代码如下(只贴出相关代码)。//--主循环--
int main(void)
{
HAL_Init();
SystemPower_Config();
SystemClock_Config();
MX_RTC_Init();
if(__HAL_PWR_GET_FLAG(PWR_FLAG_SB))
{
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_SB);
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
HAL_RTCEx_Deac
tivateWakeUpTimer(&hrtc);
}
MX_GPIO_Init();
MX_LPUART1_UART_Init();
//MX_ADC_Init();
MX_USART1_UART_Init();
while(1)
{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_SET);
OutTime();
HAL_Delay(500);
CollectAI();
ProcessAI();
HAL_Delay(500);
//ReportData();
StandbySystem();
}
}
//--
电源配置--
void SystemPower_Config(void)
{
HAL_PWREx_EnableUltraLowPower();
HAL_PWREx_EnableFastWakeUp();
__HAL_RCC_WAKEUPSTOP_CLK_CONFIG(RCC_StopWakeUpClock_MSI);
}
//--待机等待--
void StandbySystem(void)
{
uint8_t u8Buf[2]={0x88,0x88};
if(HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, 20, RTC_WAKEUPCLOCK_CK_SPRE_16BITS)!=HAL_OK)
{
HAL_UART_Transmit(&hlpuart1,u8Buf,2,50);
}
else HAL_PWR_EnterSTANDBYMode();
}
//--停机等待(1~32秒)--
void StopSystem(uint16_t StopTime)
{
uint32_t u32Time;
if(StopTime==0) return;
if(StopTime>=32) u32Time=0xFFFF;
else u32Time=(StopTime<<11);
HAL_RTCEx_SetWakeUpTimer_IT(&hrtc,u32Time,RTC_WAKEUPCLOCK_RTCCLK_DIV16);
HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON,PWR_STOPENTRY_WFI);
}
//--RTC唤醒中断回调函数--
void HAL_RTCEx_WakeUpTimerEventCallback(RTC_HandleTypeDef *hrtc)
{
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
HAL_RTCEx_DeactivateWakeUpTimer(hrtc);
}
//--采集AI通道--
static void CollectAI(void)
{
HAL_GPIO_WritePin(En15V_Port,En15V_Pin,GPIO_PIN_SET);
HAL_GPIO_WritePin(EnBatTest_Port,EnBatTest_Pin,GPIO_PIN_SET);
//StopSystem(5);
//SystemClock_Config();
HAL_Delay(2000);
MX_ADC_Init();
u8CvtIndex=0;
HAL_ADC_Start_IT(&hadc);
while(u8CvtIndex<3)
{
HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON,PWR_SLEEPENTRY_WFI);
}
HAL_ADC_Stop_IT(&hadc);
HAL_GPIO_WritePin(En15V_Port,En15V_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(EnBatTest_Port,EnBatTest_Pin,GPIO_PIN_RESET);
}
谢谢您!
直接原因是PWR_CSR寄存器中的WUF标志置位,且进入待机时未清除。
一周热门 更多>