|
一个项目需要与上位机串口通讯交换数据:,8 d: q7 d2 Z" k" I2 T 芯片型号:STM32F407VG,6 q; F! x( i0 X& K6 J' r! ? 系统时钟:外部晶振8MHZ,倍频到168MHZ;) m9 c$ }, j2 q/ M0 j% t3 s 固件库:STM32F4xx_DSP_StdPeriph_Lib_V1.8.0\Project\STM32F4xx_StdPeriph_Examples、USART\USART_Printf;9 O2 N' k" J, |/ V 编译、执行,结果发现串口发送和接收数据都是乱码;" ~2 J# k. F. y7 Y$ P 故障分析: 查阅固件库中system.stm32f4xx.c关于时钟配置: /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N */$ |: A2 a" J9 ]3 ~8 Z #define PLL_M 25 可知STM32F40xxx/41xxx在固件库的默认配置: HSE Frequency(Hz) : 使用外部25MHZ晶振; v9 S: A, v" K8 W6 m System Clock source: PLL (HSE),+ L# \7 H" ?( [6 ^+ C! q+ w" G2 ~ SYSCLK : 168MHZ.9 U6 L0 E! p+ d# v9 X0 K PLL_M :25 PLL_N :336 PLL_P :23 ]5 Q6 |3 M6 C; o$ j PLL_Q :7+ n. q1 k' R# O# ~4 {8 f1 { 由于实际使用的晶振为8MHZ,按照默认的时钟配置当然无法得到正确的波特率,从而导致串口通讯失败。 借助STM32CubeMX,可以方便地配置系统时钟: I& |2 |2 x$ W& z. L) ~' r 根据上图配置系统时钟所需正确参数: M=4 PLL_M N=168 PLL_N P=2 PLL_P Q=4 PLL_Q 接下来修改固件库中相关文件: $ B6 o V$ h: W3 {9 g7 C9 @6 o* A; O 修改stm32f4xx.h 1 G) F# Q* a' e q7 b
9 U' K; s9 P5 b; b0 O; ~, | 串口代码请参考ST官方的,就不贴出来了。经过以上修改,编译运行,已经能够正常进行串口通讯了。 总结:在使用ST传统固件库开发产品过程中,当目标板使用与ST固件库默认值不同的外部晶振时,不能一味拿来就用。应该认真阅读ST官方关于固件库的说明,及时修改相关参数,才能避免多走弯路。2 O& {4 J. W6 |& m( |( K) `/ V% T' N |
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固件库分享,超全系列整理
微信公众号
手机版