|
一个项目需要与上位机串口通讯交换数据:, 芯片型号:STM32F407VG, 系统时钟:外部晶振8MHZ,倍频到168MHZ; 固件库:STM32F4xx_DSP_StdPeriph_Lib_V1.8.0\Project\STM32F4xx_StdPeriph_Examples、USART\USART_Printf;8 v$ ?% _* y7 r v# A 编译、执行,结果发现串口发送和接收数据都是乱码;, ?1 E! s0 b; m6 B 故障分析: 查阅固件库中system.stm32f4xx.c关于时钟配置:5 ]+ S4 B. m6 S/ Z3 J1 V& W /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N *// D$ r. [7 F/ o# f4 | #define PLL_M 25' \2 {+ R3 W$ j& J5 l' j7 T) N4 f: k 可知STM32F40xxx/41xxx在固件库的默认配置: HSE Frequency(Hz) : 使用外部25MHZ晶振; System Clock source: PLL (HSE),3 y* A6 o) T# ], j/ O1 }) q SYSCLK : 168MHZ.- L4 [' e! u4 l0 b I+ S& g PLL_M :255 L" I' l) u' a% w% S* m, }! e/ w: [3 c PLL_N :336: E# z7 T5 Q: j7 d* j6 z PLL_P :2 PLL_Q :7# G9 x: u, Y# z# F/ t - v/ V/ O+ \. ?# i* c7 I9 n! W 由于实际使用的晶振为8MHZ,按照默认的时钟配置当然无法得到正确的波特率,从而导致串口通讯失败。% M7 g+ H1 K! I% H 借助STM32CubeMX,可以方便地配置系统时钟:2 [4 ^& Y1 y! H- v * s9 F0 E! B7 ] 根据上图配置系统时钟所需正确参数: M=4 PLL_M2 D, [; p0 v3 C$ Y5 o N=168 PLL_N P=2 PLL_P Q=4 PLL_Q3 `& V6 A h* T: N% p# @+ R# ~ 接下来修改固件库中相关文件:+ v T' p7 q( i" a 修改stm32f4xx.h* Z1 n4 f. _- M& Q1 R* q8 p
* M) w! }% z' o * i# ?8 A4 z0 s. V 串口代码请参考ST官方的,就不贴出来了。经过以上修改,编译运行,已经能够正常进行串口通讯了。 总结:在使用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固件库分享,超全系列整理
微信公众号
手机版