通过BUG来理解STM32的HSE时钟

在STM32F103RBT6开发过程中,遇到波特率设置为19200时通信乱码问题。通过排查,发现16M晶振导致波特率翻倍。解决方法包括修改system_stm32f10x.c文件,对HSE进行二分频,以及更新stm32f10x.h文件中HSE的值为16M。博客总结了HSE时钟源、范围及寄存器配置等知识。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  前言:最近在搞GPRS的时候,遇到了这么一个问题,所使用的单片机为STM32F103RBT6,刚开始先写了个串口打印的程序,波特率设置为19200,可是在上位机上输出的信息总是乱码,检查了好几遍的代码,硬件等等就是没找到问题。于是就在上位机上对波特率从115200往下一个一个的试,终于,当波特率设置为38400的时候,打印信息正确,额滴歌神啊,这是什么情况呢,我在程序中明明设置的波特率为19200,为什么上位机上波特率为19200的时候不对,而为38400的时候输出正确呢?于是,又回过头来检查电路原理图和代码,Oh,My god,原来问题在这里,因此这篇博客将以我遇到的问题为起点,对STM32的HSE时钟做一个总结。

一、问题

  通过检查电路原理图,发现问题的根源所在,电路中所使用的晶振为16M,而我们经常使用的晶振为8M的,所以导致波特率变为2倍。

二、解决方法

  因为使用的晶振为16M的,所以需要对程序中库函数要进行修改。那么,具体要修改哪呢?
  1)修改system_stm32f10x.c文件。

/*
*@system_stm32f10x.c中的源代码部分
*@这部分代码为外部晶振为8M时的情况
*/
/*PLL configuration:PLLCLK = HSE * 9 = 72MHz */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL));
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);
/*
*@对system_stm32
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值