[STM32U5] STM32U5的LPTIM3在STOP2模式下无法唤醒问题解析

[复制链接]
1857|7
 楼主| szt1993 发表于 2024-8-31 20:59 | 显示全部楼层 |阅读模式
01背景
最近在 STM32U575 的研发过程中发现了一个奇怪的问题:无法通过 LPTIM3 将 MCU 从 STOP2 模式唤醒。

02问题分析



2.1. 查找芯片的资料

2.1.1. 查找芯片参考手册
找到芯片的参考手册 RM0456,查看 LPTIM3 是否可以将 MCU 从 STOP2 唤醒。如下图所示:
1.png

▲ 图1. STM32U575/585 LPTIM 特性
从图中可以看到除了 LPTIM2 不能将 MCU 从 STOP2 唤醒,其余 LPTIM1/3/4 均可将 MCU 从 STOP2 唤醒。由此看来,客户提到的问题有可能是客户的设计问题。
2.1.2. 硬件检查
对照 AN5373 ( Getting started with STM32U5 MCU hardware development ) 检查客户的原理图和 PCB 设计并未发现问题。
2.1.3. 软件检查
在与客户交流中了解到,他们的代码是从其他项目中移植过来的,在之前的项目中已经批量生产了几年了。客户怀疑是芯片的 BUG。
查找芯片的勘误手册 ES0499 ( STM32U575xx and STM32U585xx device errata ), 并未找到相关的信息。

 楼主| szt1993 发表于 2024-8-31 21:00 | 显示全部楼层
03复现问题



3.1. 软件配置如下图

3.1.1. LPTIM3 配置如下:
  1. static void MX_LPTIM3_Init(void)
  2. {
  3. /* USER CODE BEGIN LPTIM3_Init 0 */
  4. /* USER CODE END LPTIM3_Init 0 */
  5. /* USER CODE BEGIN LPTIM3_Init 1 */
  6. /* USER CODE END LPTIM3_Init 1 */
  7. hlptim3.Instance = LPTIM3;
  8. hlptim3.Init.Clock.Source = LPTIM_CLOCKSOURCE_APBCLOCK_LPOSC;
  9. hlptim3.Init.Clock.Prescaler = LPTIM_PRESCALER_DIV1;
  10. hlptim3.Init.Trigger.Source = LPTIM_TRIGSOURCE_SOFTWARE;
  11. hlptim3.Init.Period = 99;
  12. hlptim3.Init.UpdateMode = LPTIM_UPDATE_IMMEDIATE;
  13. hlptim3.Init.CounterSource = LPTIM_COUNTERSOURCE_INTERNAL;
  14. hlptim3.Init.Input1Source = LPTIM_INPUT1SOURCE_GPIO;
  15. hlptim3.Init.Input2Source = LPTIM_INPUT2SOURCE_GPIO;
  16. hlptim3.Init.RepetitionCounter = 0;
  17. if (HAL_LPTIM_Init(&hlptim3) != HAL_OK)
  18. {
  19. Error_Handler();
  20. }
  21. /* USER CODE BEGIN LPTIM3_Init 2 */
  22. /* USER CODE END LPTIM3_Init 2 */
  23. }
  24. 启动 LPTIM3 :

  25. if (HAL_LPTIM_TimeOut_Start_IT(&hlptim3, TIMEOUT) != HAL_OK)
  26. {
  27. Error_Handler();
  28. }
  29. 在主循环中重复进入 STOP2 模式,由 LPTIM3 周期唤醒,这里需要注意一点的是在进入之前需 要先把滴答定时器关掉,否则有可能无法进入 STOP2 模式。
  30. /* Suspend Tick */
  31. HAL_SuspendTick();

  32. /* Enter in Stop mode */
  33. HAL_PWREx_EnterSTOP2Mode(PWR_STOPENTRY_WFI);
  34. 3.1.2. 配置电源模式输出引脚

  35. 为了方便低功耗调试,STM32U5 提供了电源模式输出 pin 脚用于指示 MCU 所处的低功耗模式,具体引脚分别是 PA5/PA6/PA7。
  36. /*Configure GPIO pin : PA5 */
  37. GPIO_InitStruct.Pin = GPIO_PIN_5;
  38. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  39. GPIO_InitStruct.Pull = GPIO_NOPULL;
  40. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  41. GPIO_InitStruct.Alternate = GPIO_AF0_CSLEEP;
  42. HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  43. /*Configure GPIO pin : PA6 */
  44. GPIO_InitStruct.Pin = GPIO_PIN_6;
  45. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  46. GPIO_InitStruct.Pull = GPIO_NOPULL;
  47. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  48. GPIO_InitStruct.Alternate = GPIO_AF0_CSTOP;
  49. HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  50. /*Configure GPIO pin : PA7 */
  51. GPIO_InitStruct.Pin = GPIO_PIN_7;
  52. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  53. GPIO_InitStruct.Pull = GPIO_NOPULL;
  54. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  55. GPIO_InitStruct.Alternate = GPIO_AF0_SRDSTOP;
  56. HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

1.png

▲ 图2. 电源模式输出状态

 楼主| szt1993 发表于 2024-8-31 21:08 | 显示全部楼层
3.2. 测试

3.2.1. 波形图
1.png

▲ 图3. 测试波形图

从图中看出 CSLEEP,CDSTOP,SRDSTOP 一直为高也就是 1,1,1 参照图 2 状态信息,可以看出 MCU 一直处于 STOP2 模式,无法通过 LPTIM3 唤醒,也就复现了客户所描述的问题。
查看参考手册 RM0456 REV2 的 50.4.20 Autonomous mode 小节的内容。当 LPTIM 使用振荡器提供的时钟时(参见 RCC),LPTIM 可以在自主模式下运行,能够在 停止模式下保持完全功能,其中 APB 时钟已停止。
查看 RCC 章节 11.4.20 Peripherals clock gating and autonomous mode 找到了更多的信息 。
2.png

▲ 图4. Autonomous 外设

看到下面的注意事项,对于 Autonomous 外设,若不能通过 EXTI 且想在 Stop 模式具有产生中断的能力需要将 AMEN 设置为 1。这就找到了问题的所在。也就是说在开发中 如果不注意这一点,对于其它的 SRD 域的外设也有可能无法将 MCU 从 STOP2 唤醒。
3.png

▲ 图5. Autonomous 外设使用注意事项

发给她更好fh 发表于 2024-8-31 21:15 | 显示全部楼层
电源的不稳定可能会影响 LPTIM 的唤醒功能。
 楼主| szt1993 发表于 2024-8-31 21:47 | 显示全部楼层
继续追查,查找相应的寄存器。对于 LPTIM3 我们可以看到,其中 LPTIM3EN,LPTIM3SMEN,LPTIM3AMEN 均需要设置为 1:
1.png

▲ 图6. LPTIM3 外设寄存器描述
在启动 LPTIM3 之前使能 Autonomous mode,添加如下代码。
/* Enable LPTIM3 Sleep Clock */
__HAL_RCC_LPTIM3_CLK_SLEEP_ENABLE();

/* Enable LPTIM3 Autonomous Mode */
__HAL_RCC_LPTIM3_CLKAM_ENABLE();
再次测试,波形如下图所示:
2.png

▲ 图7. 添加代码后测试波形图
波形正确,正是我们的设置,循环进入 STOP2 模式。

04

小结



MCU 变得越来越复杂,外设功能丰富度不断提高,同一个外设在不同型号的 MCU 上可能大致相同,可能会有一些细节不是太一样。这就要求我们不断的刷新自己的认知,不能困在自己的固有思维中。


AdaMaYun 发表于 2024-9-30 11:04 | 显示全部楼层
不能通过 EXTI 且想在 Stop 模式具有产生中断的能力需要将 AMEN 设置为 1
answerInTheWind 发表于 2025-6-16 17:55 | 显示全部楼层
碰到了一样的问题,就是AMEN的问题,感谢楼主,好人一生平安
您需要登录后才可以回帖 登录 | 注册

本版积分规则

350

主题

3021

帖子

6

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