完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
想法:先进入停止模式若干秒,唤醒后工作,然后再进入待机模式。主循环重复这个过程。但是实际情况是:只能进入一次待机状态,后续就只进停止模式,不进待机状态。请大家帮忙看看,代码如下(只贴出相关代码)。//--主循环-- 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_DeactivateWakeUpTimer(&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); } |
|
相关推荐
5个回答
|
|
复位以后这个也清除不掉,需要手动清除。我测试407是这样的。
该标志由软件写零清除。 软件必须在 WUTF 再次置 1 的 1.5 个 RTCCLK 周期之前将该标志清零。 |
|
|
|
楼主,我看了一下RTCwakeup以后,没有再次设置下次唤醒时间。加上这个再测试一下。
|
|
|
|
谢谢您! 直接原因是PWR_CSR寄存器中的WUF标志置位,且进入待机时未清除。 |
|
|
|
但是仍然有疑惑:WUF标志是怎么设置上的?待机唤醒后执行复位流程,在程序开始处会检查是否待机复位,如果是会清除WUF标志(代码如下);
if(__HAL_PWR_GET_FLAG(PWR_FLAG_SB)) { __HAL_PWR_CLEAR_FLAG(PWR_FLAG_SB); __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU); HAL_RTCEx_DeactivateWakeUpTimer(&hrtc); } 进入停止模式,被唤醒定时器唤醒后,中断处理回调函数中也会清除WUF标志(代码如下) void HAL_RTCEx_WakeUpTimerEventCallback(RTC_HandleTypeDef *hrtc) { __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU); HAL_RTCEx_DeactivateWakeUpTimer(hrtc); } |
|
|
|
楼主你好!能把你的源程序发我看一下吗?初学者对这方面很感兴趣,想多了解了解。谢谢了!
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
使用stm32l451片子,对ad7606进行3通道100k采样值跳动问题?
135 浏览 0 评论
STM32进行DMA数据转运,为什么只有A组最后一位数据被转运到B组去?
1337 浏览 2 评论
1650 浏览 3 评论
1258 浏览 0 评论
嵌入式开发 Win11安装ST-Link 提示 设备描述符请求失败 怎么处理?
1391 浏览 0 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-8-20 02:41 , Processed in 0.469223 second(s), Total 47, Slave 41 queries .
Powered by 电子发烧友网
© 2015 www.ws-dc.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号