一个关于STM32内部USART的波特率配置话题

发布者:SereneNature7最新更新时间:2022-05-07 关键字:STM32  波特率配置 手机看文章 扫描二维码
随时随地手机看文章

     某日,一工程师咨询在使用STM32F407 MCU开发产品时用到UART5和USART6做串行异步通信,将二者波特率配置为1200bps时,发现UART5正常,而USART6工作不正常。


咋听起来的确有点奇怪。怀疑其相关配置有问题,查看代码并无异常,而且当波特率调高时,二者都表现正常。这基本断定代码配置没有逻辑或流程上的错误。


 结合技术手册来看,UART5与USART6的差别主要体现在挂在不同的外设总线上,UART5挂在APB1上,USART6挂在APB2总线上。对于32f407而言,APB1最高时钟42M, APB2最高时钟可达84M。

                    

     经进一步了解,客户系统的APB1总线时钟工作在42M,APB2总线时钟工作在84M。客户工程师使用ST官方参考固件库进行开发。如果利用库来开发的话,对于UART波特率的设定,只需要在相应变量位置填入你期望的波特率数值即可,至于具体的寄存器配置是通过库函数调用实现的。用固件库操作的话,工程师往往并没怎么在意这个实现过程。

   USART_InitStructure.USART_BaudRate = 115200;

  USART_InitStructure.USART_WordLength = USART_WordLength_8b;

  USART_InitStructure.USART_StopBits = USART_StopBits_1;

  USART_InitStructure.USART_Parity = USART_Parity_No;

  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

  USART_Init(USARTx, &USART_InitStructure);


这里有必要看看关于STM32F407 UART的波特率的设置及实现。UART的波特率具体是 通过USART_BRR寄存器来配置实现的,具体是用USARTDIV来设置。

                                  

 关于波特率、外设时钟、USART_BRR的配置参数有如下关系式:
                  
 

上图算式中OVER8取0或1,8 x( 2-OVER8) 分别代表过采样的外设时钟个数16或8。Fck表示UART所对应的外设时钟【APB1或APB2】,USARTDIV就是对应 某波特率和外设时钟及过采样情况下要填入USART_BRR寄存器中的数字。


结合上面的计算,这个USARTDIV很可能就不是整数,可能是带小数的数字,这正好满足USART_BRR内部寄存器内部的2部分设计,DIV_MANTISSA【11:0】和DIV_Fraction【3:0】。DIV_MANTISSA放USARTDIV的整数部分,DIV_Fraction放USARTDIV的小数部分。当然,放入DIV_Fraction的数字是将小数部分折算成多少个采样时钟个数后来存放的。具体细节请查看stm32f4系列参考手册相关部分,这里不细化了。


细心的人可能会发现,因为USART_BRR寄存器的整数部分DIV_MANTISSA【11:0】是12位,加上小数部分,USARTDIV最大只能为4096。显然,根据上面算式不难理解在外设频率一定、采样频率一定的情况下,那个波特率的设计值是有一定范围的,并不能随意地天马行空。不然,你所需要的USARTDIV根本没法在USART_BRR寄存器中实现。


讲到这里,大家或许明白了为什么会出现文章开头提出的疑问。我们可以核实下,此时UART5的APB1总线时钟42M,假如过采样为16、波特率为1200的话,可以算得此时的USARTDIV 为2187.5;而UART6此时的APB2总线时钟为84M,同样假如过采样为16,波特率1200的话,不难算得此时的USARTDIV为 4375,显然4375远超出USART_BRR寄存器中USARTDIV所能实现的数据范围了。如果通过调用库函数做黑匣子式地修改USART_BRR的话,就会导致实际配置的波特率跟期望值大相径庭而不不自知。


既然知道原因就好办了,可结合产品应用需求具体调整来解决该问题,比方调整UART口或者调整APB2的工作时钟等。

                                             


关键字:STM32  波特率配置 引用地址:一个关于STM32内部USART的波特率配置话题

上一篇:STM32 简单多任务调度
下一篇:stm32的超频实验

推荐阅读最新更新时间:2024-11-02 07:11

用STM32_FLASH模拟实现EEPROM功能
一、 在工业应用中经常使用EEPROM来存储数据,为降低成本、节省PCB空间,外部EEPROM可以用片内Flash加上特定的软件算法代替。 因为片内Flash的擦写次数有限,所以要加上特定算法来增加使用寿命。此算法ST提供了历程,我们可以移植到我们的程序里直接使用,比较方便。 二、源码移植 移植很简单,一共两个文件“eeprom.c , eeprom.h ,移植前需要准备选择至少2块连续大小相同的flash扇区,示例程序中选用的是16K大小的2、3扇区。现在打开“eeprom.h”文件。移植时需要修改的内容: 好了移植完成,注意此源码是基于HAL库的,也可以自己修改flash读写程序,之前我将这个移植到GD的芯片,这个还是
[单片机]
用STM32_FLASH模拟实现EEPROM功能
stm32 怎样释放pa15,pb3,pb4作为gpio口使用
当STM32引脚不够用时,可以分配JTAG/SWD的引脚作为GPIO口使用。 查看数据手册的引脚定义可以看到,PA15引脚复位后的主要功能为JTDI,PB3为JTDO,PB4为JNTRST,如果把这些引脚作为普通引脚使用时,需要进行重映射。 通过设置复用重映射和调试I/O配置寄存器(AFIO_MAPR)的SWJ_CFG 位,配置为 启用SW-DP,关闭JTAG-DP 来释放PA15(JTDI), PB3(JTDO), PB4(NJTRST)引脚。详见中文参考手册V10.2版本p118 表35 调试端口映像。 库文件中几个相关的宏定义分别为: #define GPIO_Remap_SWJ_NoJTR
[单片机]
<font color='red'>stm32</font> 怎样释放pa15,pb3,pb4作为gpio口使用
Keil(MDK-ARM-STM32)系列教程(六)Configuration(Ⅱ)
Ⅰ、写在前面 本文接着上一篇文章“Configuration(Ⅰ)”进行讲述Configuration后面三项Shortcut Keys快捷键、Text Completion代码完形、Other其他的内容。 Shortcut Keys快捷键:Keil软件里面所有快捷键都可以在Configuration配置中查看的到,也可以自定义快捷键。 Text Completion代码完形:包含代码自动完成、代码模板、语法错误检测等。 Other其他:这个选项不常用,包含UVSOCK (TCP/IP)设置、打开软件设置等。 阅读本文之前建议先阅读上一篇文章: Keil(MDK-ARM-STM32)系列教程(五)_Configu
[单片机]
Keil(MDK-ARM-STM32)系列教程(六)Configuration(Ⅱ)
STM32的启动文件
C语言运行时有条件的,比如没有栈,C语言时运行不了的,所以单片机一开始跑的不是C语言代码,而是汇编,献给C语言建立好运行的环境,比如栈 堆的分配。这也是为什么启动文件是汇编文件,也就是s文件 而且每个STM32工程都必须有的,每个工程最开始执行的都是启动文件,一段汇编,因为一开始是执行不了C代码的。 野火的书也有介绍 我觉得把这种东西弄懂弄透彻可能比你单纯做个STM32项目更有意义。这样学STM32让我感觉更深入一个层面,变得更为专业。真正去把一个东西啃透。这才是一个业内人士玩STM32的表现。确实是要回归底层,把这些啃透。你会组装个无人机,这是低水平的技术,你会写STM32启动文件,这才叫技术人士业
[单片机]
<font color='red'>STM32</font>的启动文件
STM32的ADC DMA USART综合学习
学习STM32的ADC转换,在开发板上写程序调试。 四个任务: 1.AD以中断方式(单次)采集一路 2.AD以中断方式连续采集四路 3. AD 以DMA方式采集一路,DMA深度为一级 4. AD 以DMA方式采集四路,每路DMA深度为28级,并滤波,说明滤波原理。 总结: 第一个任务 :ADC以中断方式采集一路ADC,通过配置ADC_InitStructure结构体中的ADC_ScanConvMode,它规定模数转换工作在扫描模式(多通道)还是单次模式(单通道), ADC_InitStructure.ADC_ScanConvMode=DISABLE,为单通道单次模式。 ADC_ContinuousConvMode,
[单片机]
STM32系列第21篇--DMA
简介: DMA全称DirectMemory Access,即直接存储器访问。 比如串口发送用和不用DMA当然都可以发送。不用DMA发送是需要单片机实时参与,由单片机一个一个地发送数据并进行监控。但是如果用DMA,设置了起始地址,数据大小等参数后,就直接由专门的一个DMA模块进行数据发送,发送过程中单片机无需参与。发送完后会产生中断告知单片机。由此可知用DMA可以节省单片机资源,让单片可以在同一时间里干更多事。 STM32最多有2个DMA控制器(DMA2仅存在大容量产品中),DMA1有7个通道(通道1~通道7)。DMA2有5个通道(通道1~通道5)。每个通道专门用来管理来自于一个或多个外设对存储器访问的请求。还有一个仲裁起来协调各个
[单片机]
<font color='red'>STM32</font>系列第21篇--DMA
Stm32 从IAP跳转到app死机的问题
我的IAP和APP都是用STMCUBMX建的工程,而且在APP中用了freertos,但是在跳转之后出现了死机的问题,但是在APP中有log的输出,然后才死机的,说明跳转是没有问题的,下面跳转的程序,在跳转前关闭了打开的中断 然后猜想可能是中断向量表的问题,所以在APP中打印中断向量表的地址: 打印后发现地址还是0x08000000, 那就是中断向量表没有更新的问题,所以在APP main的开始处重新设置中断向量表的地址: 然后成功跳转运行了APP
[单片机]
<font color='red'>Stm32</font> 从IAP跳转到app死机的问题
STM32独立看门狗IWDG
独立看门狗Iwdg——有独立时钟(内部低速时钟LSI---40KHz),所以不受系统硬件影响的系统故障探测器。主要用于监视硬件错误。 窗口看门狗wwdg——时钟与系统相同。如果系统时钟不走了,这个狗也就失去作用了,主要用于监视软件错误。 一,独立看门狗 看门狗定时时限= IWDG_SetReload()的值 / 看门狗时钟频率 看门狗时钟频率=LSI(内部低速时钟)的频率(40KHz)/ 分频数 1.STM32 独立看门狗IWDG的时限定为280微秒。这个时限可能会随着LSI(内部低速时钟)的频率漂移而产生微小的变化。 /* IWDG timeout equal to 280 ms (the timeout may varies
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多精选电路图
换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved