|
一个项目需要与上位机串口通讯交换数据:, 芯片型号:STM32F407VG,' l" c7 ^, U. w# J$ ]! f 系统时钟:外部晶振8MHZ,倍频到168MHZ;* @# s" G( R& ]9 W7 _ 固件库:STM32F4xx_DSP_StdPeriph_Lib_V1.8.0\Project\STM32F4xx_StdPeriph_Examples、USART\USART_Printf; 编译、执行,结果发现串口发送和接收数据都是乱码;, Q: b; d' z$ t; x7 z' o 故障分析:$ z: I) T9 x2 I- L% w3 N1 n$ f 查阅固件库中system.stm32f4xx.c关于时钟配置:6 _$ j B7 r. Z9 e% g) a2 O /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N */9 t$ ?1 J r, } #define PLL_M 25, q) }" |! A* y/ K$ R6 \" _ 可知STM32F40xxx/41xxx在固件库的默认配置:" Z/ Z! v+ j) G# O HSE Frequency(Hz) : 使用外部25MHZ晶振;! X# c+ E8 V* c; k System Clock source: PLL (HSE),0 N& k9 ^9 q' Q2 H* q SYSCLK : 168MHZ. PLL_M :25 PLL_N :336 PLL_P :2 PLL_Q :7- c+ O! R8 K, U 由于实际使用的晶振为8MHZ,按照默认的时钟配置当然无法得到正确的波特率,从而导致串口通讯失败。2 O _8 u( H0 k( L$ V 借助STM32CubeMX,可以方便地配置系统时钟: : |" l$ Z) O& b 根据上图配置系统时钟所需正确参数:9 H3 h9 E- z8 I! f: U4 T7 f M=4 PLL_M N=168 PLL_N P=2 PLL_P Q=4 PLL_Q 接下来修改固件库中相关文件:: h/ w' J3 M5 t }$ k 5 Z+ W2 l, \0 o 修改stm32f4xx.h ( a- C+ d# b7 t7 V6 q
# [% y, b7 M5 i3 m7 @/ E+ U 串口代码请参考ST官方的,就不贴出来了。经过以上修改,编译运行,已经能够正常进行串口通讯了。' e" F" d6 R, @ C 总结:在使用ST传统固件库开发产品过程中,当目标板使用与ST固件库默认值不同的外部晶振时,不能一味拿来就用。应该认真阅读ST官方关于固件库的说明,及时修改相关参数,才能避免多走弯路。 |
DMA 原理从 0 到 1:为什么它能解放 CPU?一文讲透 DMA 的工作流程
【福利三:雨露均沾·逢7狂欢】之五:STM32系统时钟PLL故障排除1例
【福利三:雨露均沾·逢7狂欢】之三:AI帮我查BUG
基于STM32F103的I2C主从机通信
OpenBLT移植到STM32F103战舰开发板上适用于所有STM32F103系列的Bootloader
TFT LCD 与 FSMC 的硬件连接大容量 STM32F10xxx FSMC 接口
单片机:初学者该了解的STM32F103基础知识
2025软件工具兔哥知道
STM32之继电器模块
STM32固件库分享,超全系列整理
微信公众号
手机版