单片机/MCUwilliam hill官网
直播中

地方

12年用户 651经验值
私信 关注
[文章]

调试记录:USART1 不能设定 600BPS 的波特率

问题:
想要通过STM32F103VDT6的 USART1 以600BPS的波特率与另一颗器件进行通信。通过编写程序测试发现,该通信接口未能工作在 600BPS 的波特率上,而是工作在一个较高的波特率上,大约在 1600BPS。更改波特率设定,将波特率设定改为1200BPS 时,该接口能够工作在设定的波特率上。

解决:
经过研究。修改程序,使其通过 USART1 连续向外发送 0x55,然后用示波器检测 UASRT1 的Tx 管脚上的波形,测出每个比特的宽度为 636uS,换算成波特率为 1572BPS。检查软件中对USART1 的初始化代码,未见错误。检查 HSE 外接晶体,其标称频率为 16MHz。检查软件工程中的系统配置文件“stm32f10x_conf.h” ,其中的HSE_Value 设定为16000000,与外接晶体的频率一致。检查软件中对 PLL 的设定,发现其设定为 1 分频,4 倍频,由此可知系统时钟为 64MHz。检查软件对外设总线 APB2 的时钟设定,发现其分频数为 1,可知 USART1 的工作时钟为 64MHz。通过公式: 波特率= 工作时钟 /(16*分频频数) 计算,当波特率等于 600BPS 时,分频数应为 6666.6667,超过了硬件允许的最大分频数 4095.9375。

对 USART1 所在的 APB2 外设总线时钟做 2 分频设置,使其频率为系统时钟的一半,即32MHz。由于USART1 的时钟来自 APB2,所以 USART1 的工作时钟也是 32MHz。根据公式计算,当分频数设为3333.3334 波特率为 600BPS,该值在硬件允许的范围内。修改程序进行测试,发现按以上处理,USART1 可以工作在 600BPS 的波特率上。

更多回帖

发帖
×
20
完善资料,
赚取积分