问题描述
客户调试 STM32WLE5JB 样机的时候遇到这样一个问题:在调试 LPUART,不打开外部时钟的时候,能够正常打印,若开启外部的 HSE 和 LSE 后就没有打印。
问题确认
发现上述问题时,客户使用 STM32CubeMX 生成的工程,所以首先建议客户检查LPUART 的时钟配置有没问题,并且让客户尝试使用 STM32Cube_FW_WL_V1.2.0ProjectsNUCLEOWL55JCExamplesUARTLPUART_WakeUpFromStop 例程对比验证。后来客户发现是开启外部时钟 HSE 和 LSE 后,程序直接卡死HAL_RCC_OscConfig ,测量不到 HSE 的 32MHZ 信号。而客户的程序移植到 ST 官方的STM32WL NUCLEO 板上可以正常运行。通过前面的验证很容易怀疑是不是客户样机外部HSE 32MHZ 的晶振没有起振。拿到客户的样机后,尝试更换 32MHZ 晶振,调整晶振负载电容和使用 TCXO,发现都没办法测量到 32MHZ 信号,客户程序依旧卡死在HAL_RCC_OscConfig.
问题分析
由于前面都是用客户的电脑和程序调试,客户的电脑上的 Keil 版本不能单步调试。针对客户的问题,基于 STM32WL AT slave 例程,运行在客户样机上发现现象一致,也是卡死在 HAL_RCC_OscConfig 。但使用单步调试进入 HAL_RCC_OscCongig 里面发现,卡死具体的原因不是 HSE,而是 LSE 初始化出了问题,一直在等待 LES ready 的信号。
问题解决
针对 LSE 无法起振问题,尝试了上面针对硬件和软件多种方法后依然没有解决。后来仔细检查客户原理图发现,客户在 32.768KHZ 晶振上添加了 1M 的反馈电阻。
小结
本篇笔记分析了客户使用外部时钟调试 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 晶振。