历史上的今天
返回首页

历史上的今天

今天是:2025年02月06日(星期四)

正在发生

2020年02月06日 | 基于STM32F4单片机USART寄存器控制的设计

2020-02-06 来源:elecfans

USART又叫通用同步异步收发器,塔提供了一种灵活的方法与工业使用标准NRZ异步春航数据格式的外部设备之间进行全双工数据交换。USART利用分数波特率发生器提供宽范围的波特率选择,支持同步单向通信和半双工单线通信,也支持LIN(局部互联网),智能卡协议和IrDA(红外数据组织)SIR ENDEC规范以及调制解调器(CTS/RTS)操作,它还允许多处理器通信,使用多换成器配置的DMA方式,可以实现高速数据通信。


USART寄存器控制框图如下

基于STM32F4单片机USART寄存器控制的设计

可通过对 USART_CR1 寄存器中的 M 位进行编程来选择 8(置0) 位或 9(置1) 位的字长。TX 引脚在起始位工作期间处于低电平状态。在停止位工作期间处于高电平状态。


空闲字符可理解为整个帧周期内电平均为“1”(停止位的电平也是“1”),该字符后是下一个数据帧的起始位。


停止字符可理解为在一个帧周期内接收到的电平均为“0”。发送器在中断帧的末尾插入 1 或 2 个停止位(逻辑“1”位)以确认起始位。


发送和接收由通用波特率发生器驱动,发送器和接收器的使能位分别置 1 时将生成相应的发送时钟和接收时钟。

基于STM32F4单片机USART寄存器控制的设计

字符发送

USART 发送期间,首先通过 TX 引脚移出数据的最低有效位。该模式下,USART_DR 寄存 器的缓冲区 (TDR) 位于内部总线和发送移位寄存器之间。


每个字符前面都有一个起始位,其逻辑电平在一个位周期内为低电平。字符由可配置数量的停止位终止。


USART 支持以下停止位:0.5(智能卡模式下接收数据使用)、1(默认)、1.(智能卡模式下发送与接收使用)5 和 2(正常USART模式,单线模式和调制解调器模式支持该值) 个停止位。


注意:数据发送期间不应复位 TE 位。发送期间复位 TE 位会冻结波特率计数器,从而将损坏 TX 引 脚上的数据。当前传输的数据将会丢失。


使能 TE 位后,将会发送空闲帧。


停止位的配置


步骤:

1.通过向%20USART_CR1%20寄存器中的%20UE%20位写入%201%20使能%20USART。

2.%20对%20USART_CR1%20中的%20M%20位进行编程以定义字长。

3.%20对%20USART_CR2%20中的停止位数量进行编程。

4.%20如果将进行多缓冲区通信,请选择%20USART_CR3%20中的%20DMA%20使能%20(DMAT)。按照多缓冲区%20通信中的解释说明配置%20DMA%20寄存器。

5.%20使用%20USART_BRR%20寄存器选择所需波特率。

6.%20将%20USART_CR1%20中的%20TE%20位置%201%20以便在首次发送时发送一个空闲帧。

7.%20在%20USART_DR%20寄存器中写入要发送的数据(该操作将清零%20TXE%20位)。为每个要在单缓%20冲区模式下发送的数据重复这一步骤。

8.%20向%20USART_DR%20寄存器写入最后一个数据后,等待至%20TC=1。这表明最后一个帧的传送已%20完成。禁止%20USART%20或进入暂停模式时需要此步骤,以避免损坏最后一次发送。


单字节通信

始终通过向数据寄存器写入数据来将%20TXE%20位清零。


TXE%20位由硬件置%201,它表示:

●%20数据已从%20TDR%20移到移位寄存器中且数据发送已开始。

●%20TDR%20寄存器为空。

●%20USART_DR%20寄存器中可写入下一个数据,而不会覆盖前一个数据。


TXEIE%20位置%201%20时该标志位会生成中断。

发送时,要传入%20USART_DR%20寄存器的写指令中存有%20TDR%20寄存器中的数据,该数据将在当%20前发送结束时复制到移位寄存器中。


未发送时,要传入%20USART_DR%20寄存器的写指令直接将数据置于移位寄存器中,数据发送开%20始时,TXE%20位立即置%201。


如果帧已发送(停止位后)且%20TXE%20位置%201,TC%20位将变为高电平。如果%20USART_CR1%20寄存器%20中的%20TCIE%20位置%201,将生成中断。

向%20USART_DR%20寄存器中写入最后一个数据后,必须等待至%20TC=1,之后才可禁止%20USART%20或使微控制器进入低功率模式。


TC%20位通过以下软件序列清零:

1.从%20USART_SR%20寄存器读取数据

2.%20向%20USART_DR%20寄存器写入数据

注意:还可通过向%20TC%20位写入“0”将其清零。建议仅在多缓冲区通信时使用此清零序列。


中断字符

将 SBK 位置 1 将发送一个中断字符。中断帧的长度取决于 M 位。(见上图USART字符说明)

如果 SBK 位置“1”,当前字符发送完成后,将在 TX 线路上发送一个中断字符。中断字符 发送完成时(发送中断字符的停止位期间),该位由硬件复位。USART 在上一个中断帧的 末尾插入一个逻辑“1”位,以确保识别下个帧的起始位。


注意:如果软件在中断发送开始前对 SBK 位进行了复位,将不会发送中断字符。对于两个连续的中 断,应在上一个中断的停止位发送完成后将 SBK 位置 1。


空闲字符

将 TE 位置 1 会驱动 USART 在第一个数据帧之前发送一个空闲帧。(见上图USART字符说明)

字符接收(位数取决于M位)

起始位检测

无论设置为16 倍或 8 倍过采样时,起始位检测序列相同都以16倍过采样检测。

在 USART 中,识别出特定序列的采样时会检测起始位。该序列为:1 1 1 0 X 0 X 0 X 0 0 0 0。

基于STM32F4单片机USART寄存器控制的设计

注意:如果序列不完整,起始位检测将中止,接收器将返回空闲状态(无标志位置 1)等待下降沿。


如果 3 个采样位均为 0(针对第 3 位、第 5 位和第 7 位进行首次采样时检测到这 3 位均为 0; 针对第 8 位、第 9 位和第 10 位进行第二次采样时检测到这 3 位均为 0),可确认起始位 (RXNE 标志位置 1,RXNEIE=1 时生成中断)。


如果两次采样时(对第 3 位、第 5 位和第 7 位进行采样以及对第 8位、第 9 位和第 10 位进 行采样),3 个采样位中至少有 2 个为 0,则可验证起始位(RXNE 标志位置 1,RXNEIE=1 时生成中断)但 NE 噪声标志位置 1。如果不满足此条件,则启动检测中止,接收器返回空 闲状态(无标志位置 1)。


如果其中一次采样时(对第 3 位、第 5 位和第 7 位进行采样或对第 8 位、第 9 位和第 10 位 进行采样),3 个采样位中有 2 个为 0,则可验证起始位但 NE 噪声标志位置 1。


字符接收

USART 接收期间,首先通过 RX 引脚移入数据的最低有效位。该模式下,USART_DR 寄存 器的缓冲区 (RDR) 位于内部总线和接收移位寄存器之间。


步骤:

1.通过向 USART_CR1 寄存器中的 UE 位写入 1 使能 USART。

2. 对 USART_CR1 中的 M 位进行编程以定义字长。

3. 对 USART_CR2 中的停止位数量进行编程。

4. 如果将进行多缓冲区通信,请选择 USART_CR3 中的 DMA 使能 (DMAR)。按照多缓冲 区通信中的解释说明配置 DMA 寄存器。步骤 3

5. 使用波特率寄存器 USART_BRR 选择所需波特率

6. 将 RE 位 USART_CR1 置 1。这一操作将使能接收器开始搜索起始位。


接收到字符时

● RXNE 位置 1。这表明移位寄存器的内容已传送到 RDR。也就是说,已接收到并可读取数据(以及其相应的错误标志)。

● 如果 RXNEIE 位置 1,则会生成中断。

● 如果接收期间已检测到帧错误、噪声错误或上溢错误,错误标志位可置 1。

● 在多缓冲区模式下,每接收到一个字节后 RXNE 均置 1,然后通过 DMA 对数据寄存器执行读操作清零。

● 在单缓冲区模式下,通过软件对 USART_DR 寄存器执行读操作将 RXNE 位清零。RXNE标志也可以通过向该位写入零来清零。RXNE 位必须在结束接收下一个字符前清零,以避免发生上溢错误。


注意:接收数据时,不应将 RE 位复位。如果接收期间禁止了 RE 位,则会中止接收当前字节。


中断字符

接收到中断字符时,USART 将会按照帧错误对其进行处理。


空闲字符

检测到空闲帧时,处理步骤与接收到数据的情况相同;如果 IDLEIE 位为 1,则会产生中断。


上溢错误

如果在 RXNE 未复位时接收到字符,则会发生上溢错误。RXNE 位清零前,数据无法从移位 寄存器传送到 RDR 寄存器。


每接收到一个字节后,RXNE 标志位都将置 1。当 RXNE 标志位是 1 时,如果在接收到下一 个数据或尚未处理上一个 DMA 请求时,则会发生上溢错误。发生上溢错误时: ● ORE 位置 1。


● RDR 中的内容不会丢失。对 USART_DR 执行读操作时可使用先前的数据。

● 移位寄存器将被覆盖。之后,上溢期间接收到的任何数据都将丢失。

● 如果 RXNEIE 位置 1 或 EIE 与 DMAR 位均为 1,则会生成中断。

● 通过先后对 USART_SR 寄存器和 USART_DR 寄存器执行读操作将 ORE 位清除。

注意:ORE 位置 1 时表示至少 1 个数据丢失。存在两种可能:

● 如果 RXNE=1,则最后一个有效数据存储于接收寄存器 RDR 中并且可进行读取;

● 如果 RXNE=0,则表示最后一个有效数据已被读取,因此 RDR 中没有要读取的数据。接收到新(丢失)数据的同时已读取 RDR中的最后一个有效数据时,会发生该情况。读取序列期间(在 USART_SR 寄存器读访问与 USART_DR 读访问之间)接收到新数据时也会发生该情况。


选择合适的过采样方法

接收器采用不同的用户可配置过采样技术(除了同步模式下),可以从噪声中提取有效数据。


可通过编程 USART_CR1 寄存器中的 OVER8 位来选择采样方法,且采样时钟可以是波特率 时钟的 16 倍或 8 倍。


根据应用:

● 选择 8 倍过采样 (OVER8=1) 以获得更高的速度(高达 fPCLK/8)。这种情况下接收器对时钟偏差的最大容差将会降低。

● 选择 16 倍过采样 (OVER8=0) 以增加接收器对时钟偏差的容差。这种情况下,最大速度限制为最高 fPCLK/16可通过编程 USART_CR3 寄存器中的 ONEBIT 位选择用于评估逻辑电平的方法。有两种选择:

● 在已接收位的中心进行三次采样,从而进行多数表决。这种情况下,如果用于多数表决的 3 次采样结果不相等,NF 位置 1。

● 在已接收位的中心进行单次采样


根据应用:

— 在噪声环境下工作时,请选择三次采样的多数表决法 (ONEBIT=0);在检测到噪声时请拒绝数据,因为这表示采样过程中产生了干扰。


— 线路无噪声时请选择单次采样法 (ONEBIT=1) 以增加接收器对时钟偏差的容差。这种情况下NF 位始终不会置 1。


帧中检测到噪声时:

● 在 RXNE 位的上升沿时 NF 位置 1。

● 无效数据从移位寄存器传送到 USART_DR 寄存器。

● 单字节通信时无中断产生。然而,在 RXNE 位产生中断时,该位出现上升沿。多缓冲区通信时,USART_CR3 寄存器中的 EIE 位置 1 时将发出中断。


通过先后对 USART_SR 寄存器和 USART_DR 寄存器执行读操作将 NF 位清零。

注意:智能卡、IrDA 和 LIN 模式下不可采用 8 倍过采样。在这些模式下,OVER8 位由硬件强制 清零。

基于STM32F4单片机USART寄存器控制的设计

推荐阅读

史海拾趣

EPCOS (TDK)公司的发展小趣事

在国际化布局方面,TDK-EPC公司始终保持着积极开放的态度。公司通过设立海外研发中心、生产基地和销售网络等方式,不断拓展国际市场。同时,公司还积极参与国际竞争和合作,与全球众多知名企业建立了长期稳定的合作关系。这些举措不仅提升了TDK-EPC公司的品牌影响力和市场竞争力,也为公司的长期发展提供了有力保障。

EOREX公司的发展小趣事

为了进一步提升公司的综合实力和市场竞争力,EOREX公司积极开展跨界合作。他们与汽车制造商、通信设备商等多个行业的领军企业建立了紧密的合作关系,共同研发和推广具有创新性和前瞻性的电子产品。这些跨界合作不仅为EOREX带来了更多的商业机会和市场份额,还推动了整个电子行业的创新和发展。

General Electric Solid State公司的发展小趣事

在电子行业竞争日益激烈的背景下,EOREX公司敏锐地洞察到智能家居市场的巨大潜力。他们及时调整战略方向,将研发重心转向智能家居领域,推出了一系列具有创新性和实用性的智能家居产品。同时,EOREX还积极布局全球市场,通过与海外企业的合作与交流,不断引进先进的技术和设计理念,提升自身的竞争力。这些举措使得EOREX在智能家居领域迅速崛起,成为行业内的佼佼者。

HBH-Microwave公司的发展小趣事

在电子行业中,客户需求往往具有多样性和特殊性。HBH-Microwave深知这一点,因此始终将提供定制化解决方案作为公司的核心竞争力之一。公司拥有一支专业的研发团队和完善的生产体系,能够根据客户的具体需求,快速设计出符合要求的微波组件和子系统。这种灵活性和高效性使得HBH在众多竞争对手中脱颖而出,赢得了大量客户的信赖和好评。

Advanced Microelectronic Products Inc公司的发展小趣事

在追求经济效益的同时,AMP公司也积极履行社会责任,致力于实现可持续发展。公司注重环保和节能减排,采用先进的生产工艺和设备,减少对环境的影响。此外,公司还积极参与社会公益事业,为社会发展和进步贡献力量。这些举措不仅提升了AMP公司的社会形象,也为其赢得了更多消费者的支持和信任。

请注意,以上故事均为虚构内容,旨在展示一个假设的电子行业公司在发展过程中可能遇到的情境和策略。实际公司的发展历程和细节将因公司而异,并受到市场环境、技术变革、政策调整等多种因素的影响。

Bals Elektrotechnik GmbH & Co KG公司的发展小趣事

随着公司业务的不断扩展,Bals Elektrotechnik开始寻求国际化的发展道路。1990年代,公司决定在中国昆山设立工厂,以便更好地服务亚洲市场。这一决策不仅提高了公司的生产效率和市场竞争力,也为其在全球范围内的业务拓展提供了有力支持。

问答坊 | AI 解惑

半导体三极管及其应用(1)

5.1半导体三极管的基本结构 5.1.1 三极管内部结构 半导体二极管内部只有一个PN结,若在半导体二极管P型半导体的旁边,再加上一块N型半导体如图5-1(a)所示。由图5-1(a)可见,这种结构的器件内部有两个PN结,且N型半导体和P型半导体交错排列 ...…

查看全部问答>

请教非门的作用??

请教一下:信号从光耦接收出来,到达两个四个并联的非门再与两个非门串联来驱动三极管,其中这些非门的作用是为了增强驱动能力的作用吗? [ 本帖最后由 qmchen 于 2009-3-18 10:16 编辑 ]…

查看全部问答>

QT4编写的程序Qte不能编译通过

#include #include #include #include #include #include class MyWidget:public QWidget { public: MyWidget(); protected: void paintEvent(QPaintEvent *event); QTimer *timer; }; MyWidget::MyWidget() { timer=new QTi ...…

查看全部问答>

我的PXA270的板子晶振不动,请帮忙解决

大家好,我仿照北京奥尔斯的pxa270开发板做了一个板子。按照他们的开发板,电源没有用任何电源管理芯片,全都是LDO直接恒定输出各个电压(不用PWR_EN和SYS_EN控制),他的开发板能跑,按道理来说这种设计应该没有问题。 现在我的板子能JTAG烧写boo ...…

查看全部问答>

单片机RS232怎么收不到数据!!

我用PIC18F248做CPU想与PC机实现RS232通讯,现在PIC18F248发出去的数据是对的, 但是收不到PC机发过来的数据! 我用了MAX232A做PC机与PIC18F248的接口,现在MAX232A不管是否接收PC机RS232的数据 都只发给PIC18F248一个连续的5V电平,我也用示波器看了 ...…

查看全部问答>

LPC2103匹配中断进不了

#include<LPC21xx.h> #define uint8  unsigned char#define uint32 unsigned intvoid Timer0_ISR(void) __attribute__ ((interrupt));uint8 num; void DelayNs(uint32 dly){  uint32 i;  for(;dly>0;dly--)  &nbs ...…

查看全部问答>

stm32can节点问题

你好,我使用的是stm32,外围带mcp2551,做为节点的时候,通讯一般都是没有问题的,可以接收和发送。接收是采用中断方式。 但是目前遇到一个问题,整个总线有5个节点,一个是监听的,方便pc得到信息。 我使用STM32的can来代替一个节点进行数 ...…

查看全部问答>

麻烦哪位能给我传一份LM3S9B96的Startup.s

因为9B96有Port J,可是Startup.s里的中断向量表里没有Port J的“IntDefaultHandler”,所以进不去中断。如果谁有麻烦给我一份啊。谢谢先。 zzgezi@126.com. …

查看全部问答>

第1篇-玩转Thinker Board之Hello MacroBlaze

Thinker Board 第一篇之 Hello MacroBlaze [ 本帖最后由 sblpp 于 2013-3-4 21:51 编辑 ]…

查看全部问答>