历史上的今天
返回首页

历史上的今天

今天是:2025年08月06日(星期三)

正在发生

2021年08月06日 | STM32-串口通讯协议开发02

2021-08-06 来源:eefocus

STM32 USART 简介

STM32芯片具有多个USART外设用于串口通讯,USART(通用同步异步收发器)能够灵活地与外部设备进行全双工通讯。USART的全称“通用同步异步收发器”,也就是说他可以同步通信也可以异步通信。但是我们实现串口打印调试信息到电脑,其实只用到了他的异步通信的功能。


USART除了有串口功能,它满足外部设备对工业标准NRZ 异步串行数据格式的要求,并且使用了小数波特率发生器提供了多种波特率,使得它的应用更加广泛。它还支持同步单向通信和半双工单线通信;还支持 LIN(局域互连网络)、智能卡协议与 IrDA(红外线数据协会) SIR ENDEC 规范,以及调制解调器操作 (CTS/RTS)。而且,它还支持多处理器通信。所以说USART还是很强悍的,我们不可能一一讲解这些功能,其他功能还有待大家一起去研究。具体这些功能的详细介绍可查看《STM32F4xx中文参考手册》26章通用同步异步收发器(USART)。


USART框图分析

USART程序框图

此图我们可以分为四部分讲解分为引脚讲解、波特率发生器、USART控制单元、数据交换相关寄存器。


1.USART功能引脚

Tx:发送数据输出引脚

Rx:接收数据输入引脚

SW_Rx:数据接收引脚,只用于单线和智能卡模式,属于内部引脚,没有具体外部引脚。

nRST:请求以发送(Request To Send), n 表示低电平有效。如果使能 RTS 流控制,当USART 接收器准备好接收新数据时就会将 nRTS 变成低电平;当接收寄存器已满时,nRTS 将被设置为高电平。该引脚只适用于硬件流控制。


nCTS:清除以发送(Clear To Send), n 表示低电平有效。如果使能 CTS 流控制,发送器在发送下一帧数据之前会检测 nCTS 引脚,如果为低电平,表示可以发送数据,如果为高电平则在发送完当前数据帧之后停止发送。该引脚只适用于硬件流控制。


SCLK:发送器时钟输出引脚。这个引脚仅适用于同步模式。

STM32F411CCU6一共有3个USART,USART1和USART6时钟来源与APB2总线时钟,其最大频率为100MHz, USART2来源于APB1总线时钟,其最大频率为50MHz。也就意味着他们的最大通讯速率也是不同的。


2.USART波特率发生器

看USART内部框图2部分,USART的发送器速率控制与接收器速率控制共用一个波特率寄存器(USART_BRR),波特率寄存器里存放的是时钟分频值它一共16位,分为整数部分DIV_Mantissa[16:5]和小数部分DIV_Fraction[4:0]两部分。 USART通信所需波特率是对相应总线时钟分频然后一系列计算所得到的。USART波特率计算公式如下:

波特率计算公式波特率计算公式

fck:系统总线时钟。USART1和USART6在APB2总线下,USART2在APB1总线下

0VER8:是由USART_CR1的第15位设置。O:16倍过采样;1:8倍过采样

USARTDIV:波特率分频系数,USART_BRR配置得到。USARTDIV的计算公式

USARTDIV = DIV_Mantissa + (DIV_Fraction/8 * (2-OVER8))

 

以下例题:

1.知USARTDIV(10进制)算出USART_BRR(16进制)的值

例如:如果OVER8=0, USARTDIV=25.62,求USART_BRR?

DIV_Fraction = 16*0.62 = 9.92 约等于10 = 0xA;

DIV_Mantissa = 25 = 0x19;

则USART_BRR = 0x19A;

 

2.知USART_BRR(16进制)算出USARTDIV(10进制)的值

例如:如果OVER8=0, USART_BRR=0x1BC,求USARTDIV?

DIV_Mantissa = 0x1B = 27;

DIV_Fraction = 12/16 = 0.75;

则USARTDIV = 27.75;


3.USART波特率计算

例如:USART1通信的波特率位115200,0VER8=0,fck = 100Mhz,求USARTDIV?

解得USARTDIV = 54.253472,可根据上面公式算出DIV_Mantissa = 0x36, DIV_Fraction = 0x4,那么USART_BRR = 0x364

在计算 DIV_Fraction 时经常出现小数情况,经过我们取舍得到整数,这样会导致最终输出的波特率较目标值略有偏差。下面我们从 USART_BRR 的值为 0x364 开始计算得出实际输出的波特率大小。


由 USART_BRR 的值为 0x364,可得 DIV_Fraction=4, DIV_Mantissa=54,所以USARTDIV=54+4/16 =54.25,所以实际波特率为: 115207;这个值跟我们的目标波特率误差为 0.03%,这么小的误差在正常通信的允许范围内。


0VER8=1时,8 倍过采样时计算情况原理是一样的。此部分内容不必全部搞懂,波特率具体计算在库函数中都已完成,不用我们一一计算。


4.USART控制单元

看USART内部框图3部分,是整个USART外设的控制单元,包括发送控制器、唤醒单元、接收控制器,我们通过配置寄存器相应位来设置这些控制器的工作模式,USART的配置寄存器一共有三个我们在这里不一一讲解,我们看这个框图只需理解USART的大致工作过程即可,具体寄存器的配置我们直接调用库函数即可配置,无需我们一位一位的手动配置,如想仔细了解各寄存器的位详细意义,可参考《STM32f4xx中文参考手册》和《RM0383_STM32F411CCU6_Reference manual》。


发送控制器:工作在发送模式,它将按照程序设置的波特率、帧格式将CPU的数据或者DMA总线上的数据一位一位送到Tx引脚。


接收控制器:工作在接收模式,它将按照程序设置的波特率、帧格式将数据从Rx引脚一位一位的接收外部发来的数据并上传给CPU或者DMA。


5.USART数据寄存器和移位寄存器

看USART内部框图4部分,此部分是USART外设外部与内部总线和DMA联系的接口,4部分一共四个寄存器,发送模式用的“发送数据寄存器(TDR)”和“发送移位寄存器”,接收模式用的“接收数据寄存器(RDR)”和“接收移位寄存器”。其实TDR和RDR都属于数据寄存器(USART_DR)具体寄存机介绍看《STM32F4xx中文参考手册》。我们用的时候可以当成两个用。


USART发送过程:

     内部总线有数据需要发送时,

  • 首先要使能发送即USART_CR1的TE位置1;

  • 接着内部总线的数据的一个字节写入“发送数据寄存器(TDR)”;(该操作将清零TXE位也就是发送数据寄存器非空,数据其他数据不可以写入)

  • 紧接着“发送数据寄存器(TDR)”中的数据一次性复制进入“发送移位寄存器”;(将TXE位置既发送数据寄存器为空,后续数据可以接着写入)

  • “发送移位寄存器”将刚才“发送数据寄存器(TDR)”复制得数据一位一位的送到Tx引脚

  • 循环执行上面的操作,直到总线将最后一个数据写入“发送数据寄存器(TDR)”后,等待TC=1。这表明最后一帧的传送已完成。

     USART接收过程:

      Rx引脚有数据输入时,

  • 首先要使能接收即USART_CR1的RE位置1;

  • 然后Rx引脚移入数据的最低有效位,到“接收移位寄存器”;

  • 当“接收移位寄存器”8位满时,将数据一次性写入“接收数据寄存器(RDR)”;(该操作将RXNE置1既接收数据寄存器非空,总线可读取)

  • 总线发现RXNE=1时立即读取数据并将RXNE置零(注意接收期间每接收一个字节RXNE都置1)

循环执行上面操作,直到Rx引脚将最后一字节数据传送入“接收数据寄存器(RDR)”后,等待总线读取完成。


推荐阅读

史海拾趣

FLIR公司的发展小趣事

FLIR公司成立于1978年,总部位于美国俄勒冈州波特兰市。起初,公司专注于高性能、低成本机载应用红外热成像系统的研发与生产。在那个时代,红外热成像技术主要应用于军事领域,成本高昂且难以普及。然而,FLIR凭借其技术创新,成功打破了这一局面,推出了性价比极高的机载红外热成像系统。这些系统能够在完全漆黑的环境或恶劣天气条件下,透过烟雾和阴霾等空气污染物清晰成像,极大地提升了军事侦察和夜间作战的能力。这一突破不仅让FLIR在军事领域崭露头角,也为后续的商业应用奠定了坚实基础。

GMT(致新科技)公司的发展小趣事
设置完成后,选择“确认”或“保存”选项来保存设置。此时,收音机将在指定时间自动开机。
Denyo Europa Gmbh公司的发展小趣事

Denyo Europa Gmbh公司始终认为企业是社会的一部分,应该承担起相应的社会责任。公司积极参与各种公益活动,为当地社区的发展贡献力量;同时,公司还关注弱势群体的需求,为他们提供力所能及的帮助。这种对社会责任的担当精神,使公司在社会中树立了良好的企业形象。

Green Solution Technology Co Ltd公司的发展小趣事

Denyo Europa Gmbh公司一直将产品质量视为企业的生命线。公司建立了严格的质量管理体系,从原材料采购到生产流程,再到产品检测,每一个环节都严格把关。公司还定期对员工进行质量意识培训,确保每一个员工都能深刻理解质量对于企业发展的重要性。这种对质量的执着追求,使公司的产品在市场上赢得了良好的口碑。

Anaheim Automation公司的发展小趣事

2003年,AMOTECH的压敏电阻产品被产业资源部评为“世界一流产品”,这是对公司技术实力的再次肯定。同年,公司还在韩国安全商协会进行了自动报价首次公开募股,为公司的发展筹集了更多资金。随着实力的增强,AMOTECH开始将目光投向海外市场。2004年,公司在山东建立了首家海外工厂,专注于全球定位系统天线的生产,这标志着公司国际化战略的正式启动。

EG & G Inc公司的发展小趣事

近年来,电子行业面临着诸多变革和挑战,如技术更新换代加速、市场需求变化等。为了应对这些变革,EG & G Inc公司不断进行战略调整和业务优化。公司加大了对新技术和新产品的研发力度,同时注重提高生产效率和降低成本。此外,公司还积极探索新的商业模式和市场机会,以保持其在行业中的领先地位并实现持续发展。

以上五个故事概述了EG & G Inc公司在电子行业中的重要发展历程和关键事件。这些故事不仅展示了公司的实力和成就,也反映了其在不断变革的市场环境中保持竞争力和持续发展的能力。

问答坊 | AI 解惑

Verilog HDL UART

如题 很多给出的代码 没有过采样 本UART 测试过 稍作修改 就可以 用作它用! 时钟 源代码 [qq] 381312581 [/qq]…

查看全部问答>

DMA的问题

我想使用DMA从Memeory搬数据到UART tx fifo 进行发送,因为memory是32位的,DMA控制器设置的长度tansfer size实际上是 word为单位,这样如何发送奇数字节的数据?请高手们赐教,谢谢!…

查看全部问答>

了解今天的可编程振荡器

在加速产品开发周期和追求准时生产的时代,定时就是一切。对一个设计工程师或项目开发工程师来说 ,几乎没有什么事情比花六个星期等待一个样机部件更令人恼怒的了,或许更糟的是,在紧张的生产过 程中缺少一个关键部件,而这个部件恰好是晶体 ...…

查看全部问答>

求助:第一个自写驱动 编译出错

我按着周立功的书做的,例如: 1.在C:\\WINCE500\\PLATFORM\\SMDK2410\\SRC\\DRIVERS\\目录下创建SimpleDriver目录; 2.C:\\WINCE500\\PLATFORM\\SMDK2410\\SRC\\DRIVERS\\GPIO目录下复制makefile文件到SimpleDriver目录;(我没有找到GPIO目录, ...…

查看全部问答>

最大利用光照电流蓄电

看了牛人的太阳能蓄电视频,是否可参考高压输变电原理,最大利用光照电流蓄电。…

查看全部问答>

我的链接器报告错误

各位老师,我用IAR-EWARM 6.0平台开发STM32F101VCT6,           编译通过,链接器报告如下错误:          ielftool error: The string \'__checksum\' was not found in the stri ...…

查看全部问答>

程序编译出错

编译时出现这样的错误,请高手指点 Build target \'工程\' compiling pwm.c... pwm.c(87): warning:  #223-D: function "TIM_OC1Init" declared implicitly pwm.c(95): warning:  #223-D: function "TIM_OC2Ini ...…

查看全部问答>

讨论:如何配置CMD文件

请教各位,如何根据片子的存储器状况配置CMD文件,以及如何根据GEL文件和CCS中Memory Map里的信息修改CMD文件中的配置,还有哪些相关信息可以用来确定CMD文件,请高手给予详细讲解,也欢迎各位参与讨论。谢谢!…

查看全部问答>

RTGUI在PC端的模拟器分支发布了

 已经放到GitHub上了,这个分支将作为一个独立的分支而独立存在发展。主页:https://github.com/RTGUIhttp方式的git:https://github.com/RTGUI/RTGUI.gitgit的简单用法:git clone https://github.com/RTGUI/RTGUI.git修改等等后git commit -m ...…

查看全部问答>

如何把数据写入EPCS中

我想把图片数据写入epcs的flash中 然后用fpga读取 VGA显示   但是我如何把图片的数据写入EPCS中 求指导!!…

查看全部问答>