关于stop模式下RTC唤醒不进入main的问题

发布时间:2026/10/30 11:32:50
关于stop模式下RTC唤醒不进入main的问题 项目场景STM32L073VZT6在Stop模式下RTC唤醒执行完回调函数后不进入mian循环。项目场景stop低功耗裸机设计RTC秒唤醒执行完被置起的任务后进入stop模式。其中有个任务是使用LPUART的DMA发送接收用IDLE中断。确定的是发送数据的时间段是在RUN下接收有一部分已经在stop下强调一下IDLE中断无法在Stop下产生因为项目没有实时性所以在下一秒唤醒后产生IDLE中断进行数据解析因此数据会延迟一秒。特别地在进入睡眠前使能了SLEEPONEXIT位RTC唤醒执行回调函数时清除该标志位以进入main循环其他中断均不清除。问题描述RTC唤醒后执行完回调函数偶尔不进入main循环下一秒恢复正常。项目中使用了SLEEPONEXIT位但RTC唤醒在退出中断回调函数前也确定被清除功耗曲线持续在约120μA有点像sleep模式但整个项目没有sleep设计也没有相关代码块。睡眠函数部分重要代码如下/*LPUART配置在睡眠模式下工作时钟选择LSE即可若其他串口也需要在睡眠模式下可以接受数据则在进入stop前需要使能uartstop模式*/voidEnterStop(void){SCB-SCR|SCB_SCR_SLEEPONEXIT_Msk;//产生中断执行完回调后继续睡眠,库函数为HAL_PWR_EnableSleepOnExitHAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ONPWR_STOPENTRY_WFI);/*若系统时钟使用的是不是MSI从stop醒来后需要重新配置系统时钟 SysCofig() 或者在进入stop前使用__HAL_RCC_WAKEUPSTOP_CLK_CONFIG宏通过RCC-CFGR 寄存器中的 STOPWUCK 位来选择唤醒后的时钟源*/}若产生中断后除了执行完中断回调需要进入run模式执行复杂任务则需要在中断函数中清除SCB-SCR的SCB_SCR_SLEEPONEXIT_Msk位如RTC中断。SCB-SCRSCB_SCR_SLEEPONEXIT_Msk/*或调用库函数HAL_PWR_DisableSleepOnExit()清除*/原因分析Sop模式下若有使用DMA进行串口收发在进入Stop前一定要关闭DMA。这里的关闭不一定要去Deinit或者stop DMA可以关闭串口CR3寄存器中的DMAT/DMAR状态位。这里在实际项目中发现一个小问题HAL库的HAL_UART_Transmit_DMA函数中会监测各状态位的使能情况若DMAT为失能状态也会使能。但是实际项目中若在使用DMA发送之前不提前使能DMAT发送会出现异常欢迎大佬指点。解决方案在进入stop前调用Hal库函数HAL_UART_DMAPause()暂停DMAT或DMAR然后在调用HAL_UART_Transmit_DMA函数前用库函数HAL_UART_DMAResume()恢复传输。暂停DMA收发和恢复DMA收发的库函数源码会检测DMAR和DMAT分别进行失能和使能。但是如果直接调用这个库函数进行暂停和恢复也还是会偶尔出现高功耗的情况。最终解决是不使用库函数因为没有使用DMA的接收直接对LPUART的CR3寄存器的DMAT位进行寄存器级别的使能与失能。在HAL_PWR_EnterSTOPMode()函数前增加如下代码LPUART1-CR3~LPUART_CR3_DMAT

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询