1. 问题描述
客户调试 STM32WLE5JB 样机的时候遇到这样一个问题:在调试 LPUART,不打开外部时钟的时候,能够正常打印,若开启外部的 HSE 和 LSE 后就没有打印。
2. 问题确认
发现上述问题时,客户使用 STM32CubeMX 生成的工程,所以首先建议客户检查LPUART 的时钟配置有没问题,并且让客户尝试使用 STM32Cube_FW_WL_V1.2.0\Projects\NUCLEOWL55JC\Examples\UART\LPUART_WakeUpFromStop 例程对比验证。
后来客户发现是开启外部时钟 HSE 和 LSE 后,程序直接卡死在HAL_RCC_OscConfig ,测量不到 HSE 的 32MHZ 信号。而客户的程序移植到 ST 官方的STM32WL NUCLEO 板上可以正常运行。通过前面的验证很容易怀疑是不是客户样机外部HSE 32MHZ 的晶振没有起振。拿到客户的样机后,尝试更换 32MHZ 晶振,调整晶振负载电容和使用 TCXO,发现都没办法测量到 32MHZ 信号,客户程序依旧卡死在HAL_RCC_OscConfig.
3. 问题分析
由于前面都是用客户的电脑和程序调试,客户的电脑上的 Keil 版本不能单步调试。针对客户的问题,基于 STM32WL AT slave 例程,运行在客户样机上发现现象一致,也是卡死在 HAL_RCC_OscConfig 。但使用单步调试进入 HAL_RCC_OscCongig 里面发现,卡死具体的原因不是 HSE,而是 LSE 初始化出了问题,一直在等待 LES ready 的信号。具体代码如下:
/* Wait till LSE is ready */
while (LL_RCC_LSE_IsReady() == 0U)
{
if ((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE)
{
return HAL_TIMEOUT;
}
}
针对上面的分析,把 RTC 时钟源更改为 HSE_RTC,如下图一,图二, AT slave 例程可以正常运行,32MHZ 晶振可以起振,使用 AT 指令可以测量出 RF 有正常发射出信号。
图一
图二
同时,对于客户需要使用 LPUART,可以按照图三的时钟配置验证
图三
客户用他们手上样机同步验证,发现结果一致。确实不使用 LSE 后,样机可以正常工作,32MHZ 晶振也可以正常起振。 下一步就要分析导致 LSE 无法正常工作的原因。客户有按建议尝试更换 32.768KHZ 的晶振以及负载。并且调整 LSEDRIVE 为 high 即__HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_HIGH),发现依然无法正常使用LSE。
4. 问题解决
针对 LSE 无法起振问题,尝试了上面针对硬件和软件多种方法后依然没有解决。后来仔细检查客户原理图发现,客户在 32.768KHZ 晶振上添加了 1M 的反馈电阻,如图四R34
图四
而在 STM32WL 规格书 DS13105 Multiprotocol LPWAN 32-bit Arm Cortex-M4 MCUs, LoRa, (G)FSK, (G)MSK, BPSK, up to 256KB Flash, 64KB SRAM (version 8)中明确表示禁止在 32.768KHz 晶振的 OSC32_IN 和 OSC32_OUT 引脚中间添加反馈电阻。如下图五:
图五
后面按规格书要求,去掉客户样机上的 R34 1M 电阻,32.768KHz 晶振就可以正常起振,程序不会再卡死在 LSE 初始化。问题得到解决。
另外,根据 AN2867 关于 STM32MCU 晶振的参考设计要求,从客户晶振规格书查到下面参数:
ESR=90K 欧姆
CL = 12.5pF
C0 = 1.3pF
计算得到跨导:gmcrit=2.9032uA/V
可以看到跨导大于 STM32WLE5JBI6 规格书中 LSE 最大驱动能力 2.7uA/V,
如图六示:显然增益裕量不符合起振条件即 Gainmargin>5
图六
所以最后也建议客户后续更换符合 STM32WL 规格书要求的 32.768KHZ 晶振。具体晶振选型可以参考 AN2867。
5. 小结
本篇笔记分析了客户使用外部时钟调试 STM32WL LPUART 无法正常工作的问题。最后分析出问题是由 LSE 的 32.768KHZ 晶振没有正常起振引起。而 32.768KHZ 晶振无法正常起振则是因为客户在 32.768KHZ 晶振上添加了 1M 的反馈电阻。
虽然在 AN2867 里有对 STM32 晶振使用反馈电阻的建议,但需要注意的是针对 STM32WL 这颗芯片,其规格书中有明确要求禁止在 32.768KHz 晶振的 OSC32_IN 和 OSC32_OUT 引脚中间添加反馈电阻。
后面将客户样机上的 1M 的反馈电阻去掉后,样机的 32.768KHz 晶振可以正常起振,程序运行正常。虽然最后客户样机使用晶振可以正常起振,但根据 AN2867,客户晶振的增益裕量是不符合起振条件的。
所以为了避免后续产品量产时出现低速晶振无法起振问题,建议客户参考 AN2867 选择合适的 32.768KHz 晶振。
参考文献
文档中所用到的工具及版本
IAR 8.50.9
本文档参考ST官方的《【应用笔记】LAT1252+关于STM32WL+LSE添加反馈电阻后无法起振问题》文档。
参考下载地址:https://download.csdn.net/download/u014319604/89085988