ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

STM32L4 MSI PLL模式初始化序列错误排查与修复

STM32L4 MSI PLL模式初始化序列错误排查与修复 最近在做一个低功耗表计项目板子上为了省电刻意不装8MHz高速晶振但又要求串口通讯稳定、定时器不能乱跳。选型的同事看了半天数据手册决定用STM32L4的MSI PLL模式让片内MSI振荡器锁定到32.768kHz晶振上既省掉高速晶振又能拿到接近晶振级的频率精度。方案听起来很合理结果CubeMX v5.1.0的代码一生成板子直接跑不起来或者跑起来串口全是乱码。折腾了两天才定位到问题根源——初始化序列的顺序完全错了。这篇把我从现象、排查到修复的完整过程整理出来给正在用STM32L4xx的MSI PLL mode、又碰巧在用老版本CubeMX的朋友做个参考。1. MSI PLL模式是什么为什么有人放着HSE不用1.1 原理把内部RC振荡器“锁”到外部低速晶振上STM32L4的MSI是一个多速内部RC振荡器频率可以从100kHz一直配置到48MHz不同型号略有差异。RC振荡器最大的优点是启动快、功耗低、不需要外部元件但缺点是精度一般典型误差在±1%到±3%之间而且随温度和电压漂移。MSI PLL模式做的事情就是给MSI接一个“锁相环闭环”外部接一颗32.768kHz晶振也就是RTC常用的LSE内部PLL以这颗晶振做参考基准不断校正MSI的输出频率让MSI最终锁定到32.768kHz的整数倍频率上。比如4.096MHz就是125倍频。这下等于鱼和熊掌兼得既不用上8MHz无源晶振又能拿到远高于普通RC振荡器的频率稳定性。功耗方面LSE晶振本身耗电极低比高速晶振整机少一个数量级。对电池供电、需要长期低功耗运行、又要求串口或定时器准的场景这个组合非常合适。1.2 典型应用场景我实际用下来MSI PLL模式比较典型的场景有这么几类低功耗物联网终端整机休眠时需要RTC走时唤醒后需要串口或Sub-1G通讯不想同时常开高速晶振。需要精确波特率但没有高速晶振的板子靠外部32.768kHz做参考MSI锁定后UART波特率误差可以做到非常小。低功耗下的精确延时/RTC补偿LSE直接给RTC做时钟源MSI锁定后给系统提供稳定主频。1.3 CubeMX里的配置入口在CubeMX的Clock Configuration页面系统时钟源选择MSI然后开启MSI PLL mode参考时钟选择LSE频率范围选个合适的档位。界面上看起来一切正常生成代码也“看起来”很合理——问题恰恰出在这里。2. 问题复现CubeMX v5.1.0生成的初始化序列错在哪2.1 复现环境和现象先说复现环境MCUSTM32L4R5ZINucleo-144板CubeMX版本5.1.0HAL库版本随CubeMX v5.1.0捆绑的1.9.0版本时钟配置MSI作为系统时钟MSI PLL mode使能参考时钟LSE32.768kHz外部晶振MSI频率档选4MHz外设UART2 115200、一个500ms周期的LED翻转现象有两种程序跑进Error_Handler()单步看是HAL_RCC_OscConfig返回了HAL_ERROR或HAL_TIMEO
返回列表