1. 什么是波特率
不管是什么单片机,在使用串口通信的时候,有一个非常重要的参数:波特率。什么是波特率:波特率就是每秒传送的字节数。双方在传输数据的过程中,波特率一致,这是通讯成功的基本保障。下面以STM32单片机为例,讲解一下串口波特率的计算方法。
2. STM32波特率相关的寄存器
STM32单片机设置波特率的寄存器只有一个:USART_BRR寄存器,如下图所示。
该寄存器的有效位数为16位,前4位用于存放小数部分,后12位用于存放整数部分。将波特率算出来后,数值填入这个波特率就可以了。下面介绍如何计算。
3. 波特率计算方法
STM32的数据手册给出了计算方法,有一个公式,如下图所示:
在这个公式上,共有三个变量,其中两个我们是知道的,Fck和Tx/Rx波特率 这两个是已知的,USARTDIV是未知的。通过该公式的描述可以看出如果使用USART1的话,那Fck就是PCLK2=72MHz,否则就是PCLK1=36MHz,Tx/Rx波特率这个参数是已知的。只需要计算出USARTDIV的值赋值给USART_BRR寄存器就可以了。以115200为例,将公式变形后得到:USARTDIV = 72×1000000/(16×115200) = 39.0625。即将39.0625写入USART_BRR即可。
前文说过,USART_BRR的前4位存放小数部分,后12位存放整数部分。
那小数部分DIV_Fraction = 0.0625×16 = 1 = 0x01;那整数部分DIV_Mantissa = 39 = 0x27;那USART_BRR = 0X271;
数据手册给我们提供了一张数据表:
在这张数据表上,已经算出了常用的波特率值,我们可以拿来直接用。但是如果我们想把波特率的计算做成一个传参函数的方式,如:USART_INIT(uint_t 16 Baud),在调用时只需要写USART_INIT(9600),USART_INIT(115200),那程序该怎么写呢?
4. 程序的实现
下面介绍的是寄存器版的程序。
程序第一步45行:先计算得到USART_DIV,这个就是前面公式的变形;程序第二步46行:获得USART_DIV的整数部分;程序第三步47行:获得USART_DIV的小数部分;程序第四步48行:将整数部分左移4位,即存入BRR寄存器的后12位;程序第五步49行:将整数和小数部分合在一起,即前4位和后12位重新组合;程序第六步50行:将计算出来的数值赋给BRR寄存器。
这样一个将波特率作为形参的函数就完成了。从以上来看的话,波特率的计算好像也不是很难啊。
关键字:STM32 单片机 串口 波特率
引用地址:
STM32单片机的串口波特率计算方法
推荐阅读最新更新时间:2024-11-09 10:22
基于C8051F020单片机实现多波段光谱辐射计采集系统的设计
引言 我国于2001年发射了自己的水色卫星,为适应水色遥感发展的需要,我们研制了我国近海海洋光学浮标。锚链式水下多光谱辐射计是计划装备在其中的一台主要观测设备。数据采集系统是该设备的工作控制中心。 总体设计思想及工作原理 鉴于锚链式水下多光谱辐射计的特定工作环境和工作周期,在设计过程中,对数据采集卡的设计必须遵循高精度、低功耗等原则。首先,由于浮标在海中采用自主供电方式连续工作三个月以上,必须合理利用供电电池的能量以确保电池有足够的电量供给仪器正常工作。为此,必须采取有效的措施提高电源的利用率。其次,海水深处的光信号都比较弱,对于微弱光信号的探测,一方面要采用高灵敏度自带前置放大的光电探测器(其内部前置放大器采用载波自稳零运算
[单片机]
搭载安谋科技“星辰” STAR-MC1处理器,灵动微MM32F5系列MCU量产
日前,上海灵动微电子股份有限公司(以下简称“灵动微电子”)宣布高端MCU产品 MM32F5系列 已正式量产。该系列产品搭载安谋科技“星辰”STAR-MC1处理器,在架构和外设设计上有多处创新,存储容量覆盖128 KB到2MB,主频覆盖120MHz到200MHz以上,广泛适用于工业控制、汽车、物联网等高端应用场景。 灵动微电子 是国内为数不多 的同时获得 Arm® Keil®、IAR、SEGGER 官方支持 的本土MCU公司,依托十多年的技术积累建立了独立、完整的通用MCU生态体系,可为客户提供从硬件芯片到软件算法、从参考方案到系统设计的全方位支持。 据灵动微电子介绍,搭载 Arm Cortex® - M 系列内核的MM32系列
[嵌入式]
基于AT89S51单片机设计的电子琴
1.实验任务 (1).由4X4组成16个按钮矩阵,设计成16个音。 (2).可随意弹奏想要表达的音乐。 2.电路原理图 3.系统板硬件连线 (1).把“单片机系统”区域中的P1.0端口用导线连接到“音频放大模块”区域中的SPK IN端口上; (2).把“单片机系统“区域中的P3.0-P3.7端口用8芯排线连接到“4X4行列式键盘”区域中的C1-C4R1-R4端口上; 4.相关程序内容 (1).4X4行列式键盘识别; (2).音乐产生的方法; 一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率非常方便,我们可以利用单片机的定
[单片机]
C51单片机独立按键的使用
前面我们简单的学习了C51的IO结构,现在我们来看看,准双向IO口如何使用按键输入 这是准双向IO的基本结构,单片机就靠内部输入线来读取IO的电平状态。 我们以这个电路分析准双向IO上的按键使用 在准双向口中,我们需要先给IO写高电平才能去读取IO的电平变化(高- 低) 在写高电平的情况下…… 三极管截止 没有按下按键,电流由正极经过上拉电阻流到内部输入线路,这时候内部读出高电平 这时候按下按键,按下按键,电流由VCC流经上拉电阻再流经按键最后流向GND。由于电流由正极流向负极。内部输入线路线路的电流流向负极,这时候读出的数值就是低电平的 如果我们写IO是低电平的话,三极管始终导通,内部输入的电流经过三极管接到负极
[单片机]
STM32中SD的初始化代码
STM32中SD的初始化代码: SD_Error SD_Init(void) { /*重置SD_Error状态*/ SD_Error errorstatus = SD_OK; /* SDIO 外设底层引脚初始化 */ GPIO_Configuration(); /*对SDIO的所有寄存器进行复位*/ SDIO_DeInit(); /*上电并进行卡识别流程,确认卡的操作电压*/ errorstatus = SD_PowerON(); /*如果上电,识别不成功,返回“响应超时”错误 */ if (errorstatus != SD_OK) {
[单片机]
stm32利用oled显示屏与按键进行PID参数调节实现人机交互
上一个学期在学校做四轮车利用PID实现直线走,在调试过程中,我之前是每改一个参数就下载程序进控制板进行调试,观察车是否偏移来确定pid参数,但是后来我发现这样的效率很慢,经别人提醒后,我自己做了一个小小的人机交互界面,来显示pid的参数以及对pid参数进行调整。 以下是显示效果: 接着我在附上主要代码: // 功能描述 : OLED 7针SPI接口演示例程(STM32F103系列) // 说明: // ---------------------------------------------------------------- // GND 电源地 // VCC 3.
[单片机]
STM32基础3--GPIO控制(LED&KEY)
在SMT2基础1,生成文件后。其实就可以调用HAL库中的 stm32f4xx_hal_gpio.h 的GPIO控制函数,对GPIO进行操控了。 HAL_GPIO_ReadPin 该函数,对引脚的电平的读取,也就是输入电平,返回值是电平的状态。GPIO_PIN_RESET 为低电平,GPIO_PIN_SET为高电平。 typedef enum { GPIO_PIN_RESET = 0, GPIO_PIN_SET }GPIO_PinState; 函数第1个形参是GPIO的分组,填入GPIO组的基地址即可 #define GPIOA ((GPIO_TypeDef *) GPIOA_BASE) #define
[单片机]
STM32串口操作相关事项
放了一段时间,对stm32似乎有点陌生,总结一下! (基于3.0固件库,芯片stm32f103rbt6) 1、配置串口的管脚和时钟 由于串口1、2是在GPIOA上: 所以要是能串口GPIOA、AFIO和1或者2的串口时钟,代码如下: RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO | RCC_APB2Periph_USART1 , ENABLE); 2、对串口的具体物理管脚进行相应的配置: /* A9 USART1_Tx */ GPIO_InitStructure.GPIO_Pin = GPIO_Pi
[单片机]