[应用相关] STM32L476RCT6单片机刚上电就进入停止模式

[复制链接]
 楼主| 两只袜子 发表于 2024-7-10 15:19 | 显示全部楼层 |阅读模式
系统初始化之后进入停止模式,使用rtc中断5分钟唤醒一次停止模式,断电前进入停止模式的话,上电后直接处于停止模式,没有执行初始化部分的代码。不是应该先进行初始化操作码?非常疑惑。
yiy 发表于 2024-7-13 22:44 | 显示全部楼层
可能是因为电源恢复后立即进入停止模式,并且没有正确配置唤醒流程。
yiy 发表于 2024-7-13 22:44 | 显示全部楼层
1. 电源恢复时的复位流程
当电源恢复时,STM32L476RCT6 应该首先进行复位,然后才会进入用户代码执行初始化。如果上电后立即进入停止模式,可能是因为复位没有正确触发或代码流程中有问题。

2. 检查复位原因
你可以通过检查复位原因寄存器(RCC_CSR)来确定单片机是因为哪种复位事件启动的。这样可以帮助你理解为什么初始化代码没有执行。
yiy 发表于 2024-7-13 22:45 | 显示全部楼层
  1. uint32_t reset_cause = RCC->CSR;
  2. if (reset_cause & RCC_CSR_SFTRSTF) {
  3.     // 软件复位
  4. } else if (reset_cause & RCC_CSR_WDGRSTF) {
  5.     // 看门狗复位
  6. } else if (reset_cause & RCC_CSR_LPWRRSTF) {
  7.     // 低功耗复位
  8. } else if (reset_cause & RCC_CSR_PORRSTF) {
  9.     // 电源复位
  10. } else if (reset_cause & RCC_CSR_PINRSTF) {
  11.     // 引脚复位
  12. }
  13. // 清除复位标志
  14. RCC->CSR |= RCC_CSR_RMVF;
yiy 发表于 2024-7-13 22:45 | 显示全部楼层
3. 检查初始化代码的位置
确保初始化代码在主函数的最开始部分执行,并且没有任何条件或中断会阻止其运行。尤其要确保进入低功耗模式的代码不是在初始化代码之前执行。
  1. int main(void) {
  2.     // 初始化代码
  3.     HAL_Init();
  4.     SystemClock_Config();
  5.     // 其他初始化代码

  6.     while (1) {
  7.         // 主循环
  8.     }
  9. }

4. 停止模式配置
检查停止模式的配置是否正确,确保进入停止模式前所有必要的初始化已经完成。可以在进入停止模式之前打印一些调试信息来确保初始化代码已经执行。

5. RTC 中断配置
检查 RTC 中断配置,确保 RTC 中断能够正确唤醒 MCU 并恢复正常运行。
  1. void RTC_Wakeup_Init(void) {
  2.     // 配置 RTC 唤醒中断
  3.     HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, 0x7FFF, RTC_WAKEUPCLOCK_CK_SPRE_16BITS);
  4. }

  5. void HAL_RTCEx_WakeUpTimerEventCallback(RTC_HandleTypeDef *hrtc) {
  6.     // RTC 唤醒中断回调函数
  7. }
yiy 发表于 2024-7-13 22:46 | 显示全部楼层
你先试试上述解决方式。
sj8zw8 发表于 2024-7-27 14:56 | 显示全部楼层
初始化代码没有被跳过或被错误配置为条件编译。
sj8zw8 发表于 2024-7-27 14:56 | 显示全部楼层
在停止模式下,RTC 可以保持运行并设置中断以唤醒 MCU。系统在从停止模式恢复后,通常会从复位向量开始执行初始化代码。
LOVEEVER 发表于 2024-7-28 13:37 | 显示全部楼层
是不是又相关的配置问题导致相关参数复位导致问题发生
漫天星yl 发表于 2024-8-28 12:25 | 显示全部楼层
当系统进入 STOP 模式时,除非系统复位如通过外部复位引脚或电源重启,否则大部分的系统状态和数据将被保留。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2122

主题

8118

帖子

11

粉丝
快速回复 在线客服 返回列表 返回顶部