|
一个项目需要与上位机串口通讯交换数据:, 芯片型号:STM32F407VG,& Z. Q; C, x4 u; ^" }; K' H' K+ F$ o 系统时钟:外部晶振8MHZ,倍频到168MHZ;5 v9 V# i! O# [6 k 固件库:STM32F4xx_DSP_StdPeriph_Lib_V1.8.0\Project\STM32F4xx_StdPeriph_Examples、USART\USART_Printf;* g5 N- E$ T6 k7 j3 d7 y* o 编译、执行,结果发现串口发送和接收数据都是乱码;* O6 R1 I% t' _0 X9 C7 P4 H" w 故障分析: 查阅固件库中system.stm32f4xx.c关于时钟配置: /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N */ #define PLL_M 25 * K$ D$ V: }% J8 p8 d8 s7 ]7 [) Z 可知STM32F40xxx/41xxx在固件库的默认配置:" W2 u I( R# L% [# N3 e HSE Frequency(Hz) : 使用外部25MHZ晶振; System Clock source: PLL (HSE),6 _: A# ]- N8 j6 P SYSCLK : 168MHZ.- Q- [5 l W( b8 j! z PLL_M :25, V5 H" N D: \ PLL_N :336 PLL_P :2 PLL_Q :7 由于实际使用的晶振为8MHZ,按照默认的时钟配置当然无法得到正确的波特率,从而导致串口通讯失败。 借助STM32CubeMX,可以方便地配置系统时钟:/ E0 [' g! n) A. S; m 根据上图配置系统时钟所需正确参数: M=4 PLL_M. X# P# {3 q, C N=168 PLL_N P=2 PLL_P3 @( n. I( k! Z3 d- B Q=4 PLL_Q " F. b7 O$ N# w# G, @2 _8 K( R7 B6 ?8 J 接下来修改固件库中相关文件:8 X9 y, \) Q, I8 ` 修改stm32f4xx.h& N. P9 Y4 |) S7 W/ ~% t* {- q3 I 2 I8 L6 E8 r) H+ h: Y
- n2 a0 C, }" z2 `3 W) y 串口代码请参考ST官方的,就不贴出来了。经过以上修改,编译运行,已经能够正常进行串口通讯了。$ Y0 T% i# X& i" {9 @( S1 y 总结:在使用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固件库分享,超全系列整理
微信公众号
手机版