波特率的计算
STM32 下的波特率和串口外设时钟息息相关,USART 1 的时钟来源于 APB2,USART 2-5 的时钟来源于 APB1。在 STM32 中,有个波特率寄存器 USART_BRR,如下:
STM32 串口波特率通过 USART_BRR 进行设置,STM32 的波特率寄存器支持分数设置,以提高精确度。USART_BRR 的前 4 位用于表示小数,后 12 位用于表示整数。但是它还不是我们想要设置的波特率,想要设置我们串口的波特率大小还需要进行计算。其实有关波特率的计算是下面这一条表达式:
从上面的表达式,我们引入了一个新量 USARTDIV,它表示对串口的时钟源 fck 进行分频。假设我们已知道了波特率和 fck 时钟频率的大小,那么通过上式便可以计算出 USARTDIV 的具体大小,然后再通过 USART 的值大小对波特率寄存器进行设置。
USARTDIV 通过上面的表达式得出,是一个带有小数的浮点数(如 27.75)。将小数部分和整数部分分开,分别得到一个整数值 n(如 27)和一个小数值 m(如 0.75)。有了这两个值我们便可以填写 USART_BRR 寄存器进而设置我们串口波特率大小了。
将整数部分 m(27 = 0x1B)直接写入 USART_BRR 的后 12 位部分;将小数部分 n 乘以 16 后得到的整数值(如 0.75 x 16 = 12 = 0xC)写入 USART_BRR 前 4 位部分,最后 USART_BRR 的值为 0x1BC。
注意:如果小数部分乘以 16 之后仍带有小数,则要四舍五入去除小数部分得到一个新的整数,再将其写入 USART_BRR 的前四位。
为什么在计算波特率的公式中要乘以 16
我们知道串口通信是通过 TXD 和 RXD 这两条线进行通信的,当接收器的 RXD 连接着发送器的 TXD,接收器的 TXD 连接着发送器的 RXD,接收器和发送器可以通过 RXD 和 TXD 互传数据。当接收器检测到 RXD 这条线的电平被拉为低电平,立即开始接收发送器发送过来的数据,刚刚那个低电平只是一个告知接收器可以接收数据的起始位而已。
在数据的传输中,信号可能受到一些干扰而产生一些抖动,如下图。如果接收端只对这些信号数据采样一次,那么它有可能采样到的是抖动的不准的数据,进而使数据传输不准确,所以接收端在采样数据线上的数据,通常都要采样多次,然后通过比较获得准确的数据。
前面已经说过,USARTDIV,它表示对串口的时钟源 fck 进行分频,而这 16 表示的正是 1bit 数据的采样次数。为什么呢?
将这个表达式的分子分母倒过来,可以得到下面这条表达式
每一位的传输时间只有 1/TX_baud,这个总时间除以 16,所以每采样一次的时间正好是 T1,即新分频后的周期。而初始的串口时钟信号来自于 APBx,APBx 时钟信号需要经过分频才会等于 T1,所以才需要分频 USARTDIV。
关键字:STM32 串口 波特率
引用地址:
STM32串口波特率大小计算
推荐阅读最新更新时间:2024-11-11 12:08
STM32Cube HAL库串口总结
定义了三种传输方式:阻塞传输,中断传输、DMA传输 HAL_UART_Transmit HAL_UART_Receive HAL_UART_Transmit_IT HAL_UART_Receive_IT HAL_UART_Transmit_DMA HAL_UART_Receive_DMA 此外还定义了两个中断回调函数,供中断和DMA使用,分别在数据传输一半和完成时使用 voidHAL_UART_TxCpltCallback(UART_HandleTypeDef *huart); void HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef*huar
[单片机]
STM32小白入门(第十天)-------看门狗watchdog
记得刚开始面试的时候,被面试官问了一个问题:stm32这个项目如果系统跑飞了,死机了,你是怎么处理的? 那时候没听懂他的意思,傻乎乎的回了一句,没遇到过这种情况。事后,才后悔莫及啊,他的意思不就是问我看门狗的作用吗? 然后就没有然后了,一个嵌入式工程师,如果看门狗都不知道人家是不敢用你的。 一、什么是看门狗? 看门狗是一个定时器,我们可以设置一个计数值,当看门狗启动后,计数值在一定的频率下不停的减1,当计数值减到0,看门狗会发出一个复位信号给CPU,这样会造成嵌入式系统复位。 软件系统在正常工作的过程中,需要在看门狗计数值减到0之前,给计数值重新赋值,这个看门狗就不会复位了,这个过程- “喂狗”。 当嵌入式
[单片机]
一种导致STM32重新上电后不工作的原因
【使用环境】 编译器:KEIL5.20 硬件:STM32F429 软件:FreeRTOS 【问题描述】 编译后烧录运行正常,重新上电无反应 【问题分析】 1. 在任务中使用了非系统延时 --非系统延时导致系统阻塞, 详看 2. 外设驱动初始化问题 --有些外设在重新上电后初始化失败,导致错误或是卡在此处 如MPU6050就需要在初始化前加入一定延时,不然再次初始化会失败 如GT811触摸芯片复位准备时长需要50ms 3. 配置为外部中断的GPIO悬空导致 --由于该引脚为悬空状态,且该引脚配置为中断模式,在上电时无法确定该引脚的电平状态,导致初始化瞬间产生一个边沿跳变,而进入中断,此时系统还未初始化完毕,导致中断服务程
[单片机]
具有串口通讯功能的在线系统可编程器制作
在学习单片机和进行单片机产品开发过程中,我们通常使用仿真器作为调试程序的有力工具。但仿真器价格昂贵,对于初学者和一般个人开发人员很难承受。为此,我们选用了带ISP 功能的AT89S51/52 系列单片机,不需要仿真器也能很轻易地完成系统调试和开发。所谓ISP,即In SystemProgrammerable 在线系统可编程。也就是说,单片机可在系统应用板上进行擦除和编程,然后立即运行。AT89S51/52 系列单片机的内部程序存储器采用Flash 存储器,可以反复擦写1000 次以上。 一、电路构成 具有ISP 下载与串口通讯功能的下载线的电路如图1 所示。该下载线成本低廉,元件易得,既可完成在线系统擦除与编程,又
[单片机]
STM32电容触摸按键原理
RC充放电电路原理 如图: 电阻R和电容C串联 当开关断开时,电阻R,电容0两端电压都是0,无电流 当开关闭合时(瞬间),电阻R两端V1(上端)和0(下端)有电压差,产生电流 此时电子通过电阻R积累在电容正极(上端),直到电容C电压为V1,充电完成 此时R两端电压均为V1,无压差,不再有电流经过 电容C的电压从0-V1,充电过程中,有充电时间t和电容C的电压Vt之间的关系(右图) 看以看出随充电时间越来越长,充电的效率(斜率)越来越低 分析: 当按键按下瞬间,电阻R两端电压V1和0,此时瞬间电流为I = V1 / R 当电容C充电一段时间后,假设电容C此时的电压为Vc,那么此时电阻C两端的电
[单片机]
STM32自学笔记EXTI(外部中断)寄存器
外部中断通用I/O映像 中断处理函数分配 EXTI寄存器一览 以下图片全部摘自STM32中文参考手册 中断屏蔽寄存器(EXTI_IMR) 往对应的位写1就是开启中断,写0就是关闭中断 例如开放来自线0上的中断请求 EXTI- IMR|=1 0;//开放来自线0上的中断请求 事件屏蔽寄存器(EXTI_EMR) 参考**中断屏蔽寄存器(EXTI_IMR)**的操作 上升沿触发选择寄存器(EXTI_RTSR) 设置对应的外部中断触发事件为上升沿 上升沿就是电平从0到1 例如允许输入线0上的上升沿触发 EXTI- RTSR|=1 0;//允许输入线0上的上升沿触发 下降沿触发选择寄存器(
[单片机]
STM32时钟系统概述
STM32时钟框图如下: 重要的时钟: 1、HSI:高速内部时钟信号 stm32单片机内带的时钟 (8M频率) 精度较差 2、HSE:高速外部时钟信号 精度高 来源(1)HSE外部晶体/陶瓷谐振器(晶振) (2)HSE用户外部时钟 3、LSE:低速外部晶体 32.768kHz 主要提供一个精确的时钟源 一般作为RTC时钟使用 在STM32中,有五个时钟源,为HSI、HSE、LSI、LSE、PLL。 ①、HSI是高速内部时钟,RC振荡器,频率为8MHz。 ②、HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。 ③、LSI是低速内部时钟,RC振荡
[单片机]
STM32笔记 ADC篇
一、总转换时间的问题: 总转换时间TCONV = 采样时间+ 转换时间(转换时间=12.5个周期) 其中,采样时间是指完成一次转换到开始下一次转换的时间间隔,不包括转换时间;转换时间是固定的12.5个周期。采样时间有几个固定值可以选择设定。 二、 ADON:开/关A/D转换器 该位由软件设置和清除。当该位为0时,写入1将把ADC从断电模式下唤醒。当该位为1时,写入1将启动转换。在转换器上电至转换开始有一个延迟时间tSTAB。 函数void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState);虽然描述说是使能失能ADC,其实就是对ADON的操作,也就
[单片机]