700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > STM32 USART理解

STM32 USART理解

时间:2019-08-04 06:37:09

相关推荐

STM32 USART理解

文章目录

USART特性:功能概述:寄存器配置步骤:字符发送:字符接收:小数波特率的生成:正常情况下溢出情况DMA一起使用使用DMA进行发送使用DMA接收编程步骤

USART特性:

全双工,异步通信分数波特率发生器系统

发送和接收共用的可编程波特率,最高达4.5Mbits/s可编程数据长度(8位或9位)可配置的停止位支持1或2个发送方为同步传输提供时钟可配置使用DMA的多缓冲器通信单独的发送器和接收器使能位检测标志

接收缓冲器满

发送缓冲器空

传输结束标志检验控制

发送校验位

对接收数据进行校验10个带标志的中断源

发送数据寄存器为空

发送完成

接收数据寄存器满

检测到总线为空

帧错误

溢出错误

校验错误

功能概述:

RX:接收串行数据,通过采样技术来区别数据和噪音,从而恢复数据

TX:发送数据输出

总线在发送或者接收前,应处于空闲状态

一个起始位

一个数据字(8位或者9位),最低有效位在前

1,2个停止位,表明数据帧的结束

使用分数波特率发生器(12位整数和4位小数)

一个状态寄存器(USART_SR

数据寄存器(USART_DR

一个波特率寄存器(USART_BRR

nCTS:清除发送,若是高电平,在当前数据传输结束时阻断下一次数据发送。

nRTS:发送请求,若是低电平,表明USART准备好接收数据

寄存器配置步骤:

字符发送:

通过在USART_CR1寄存器上位置UE位来激活USART编程USART_CR1的M位来定义字长在USART_CR2中编程停止位的位数如果采用多缓冲通信,配置USART_CR3中的DMA使能位(DMAT)利用USART_BRR寄存器选择要求的波特率设置USART_CR1中的TE位,发送一个空闲帧作为第一次数据发送把要发送的数据写进USART_DR寄存器(此动作清除TXE位while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);),在只有一个缓冲器的情况下,每个待发送的数据重复该步骤在USART_DR寄存器中写入最后一个数据字后,要等待TC=1(while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TC)==RESET);),它表示最后一个数据帧的传输结束。当需要关闭USART或需要进入停机模式之前,需要确认传输结束,避免破坏最后一次传输

发送时序图如下

字符接收:

通过在USART_CR1寄存器上位置UE位来激活USART编程USART_CR1的M位来定义字长在USART_CR2中编程停止位的位数如果采用多缓冲通信,配置USART_CR3中的DMA使能位(DMAT)利用USART_BRR寄存器选择要求的波特率设置USART_CR1的RE位,激活接收器,使它开始寻找起始位。

当接收一个字符时RXNE位被置位,(while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_RXNE) == RESET);)它表明移位寄存器的内容被转移到RDR。可以被读出 如果RXNEIE位被设置,产生中断在接收期间,如果检测到帧错误,噪音或者溢出错误,错误标准将被置起在多缓冲器通信时,RXNE在每个字节接收后被置起,并由DMA对数据寄存器的读操作而清零。

注意:在接收数据时,RE位不应该被复位。如果RE位在接收时被清零,当前字节的接收丢失。

小数波特率的生成:

USARTDIV如何计算?

计算公式:

USART1 PCLK2 时钟最高 72M, 其他USART 时钟PCLK1 最高36M

例如:目标115200 再根据时钟,可以计算出来USARTDIV

115200 = 72000/16*(USARTDIV) ->USARTDIV可以计算

12位的整数 4位小数

正常情况下

要求 USARTDIV=25.62

小数部分0.62,右移4位得 16*0.62=9.92,取整10即0x0A

整数部分25=0x19

USART_BRR=0x19A

溢出情况

要求 USARTDIV=50.99

小数部分0.99 * 16 = 16 15.84 最接近的整数0x10,在DIV_frac[3:0]存不下,低位保留0x00 ,向前溢出1

整数部分(50+进位1)=51=0x33

USART_BRR=0x330,USARTDIV=51

DMA一起使用

使用DMA进行发送

通过配置USART_CR3寄存器DMAT位激活。当TXE为被置“1”时,DMA就从指定的SRAM区传送到USART_DR寄存器。为USART的发送分配一个DMA通道在DMA的寄存器上,将USART_DR寄存器地址配置成DMA传输的目的地址。在DMA控制寄存器上,将寄存器地址配置成DMA传输的源地址。在每个TXE事件后,将从此存储区读出数据,发送到USART_DR寄存器。

使用DMA发送时序图

使用DMA接收

通过配置USART_CR3寄存器DMAR位激活。每接到一个字节,DMA控制器就把USART_DR寄存器送到从指定的SRAM区在DMA的寄存器上,将USART_DR寄存器地址配置成DMA传输的源地址。在DMA控制寄存器上,将寄存器地址配置成DMA传输的目的地址。在每个RXNE事件后,将数据从USART_DR传输到存储区。

使用DMA接收时序图

编程步骤

使能RX TX引脚GPIO时钟和USART时钟初始化GPIO,并将GPIO复用到USART上配置USART参数配置中断控制器并使能USART接收中断使能USART在中断服务程序实现发送和接收

配置USART1,GPIO对应PA9,PA10

void USART_Config(void){GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;// GPIO时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);// USART时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);// USART TX配置GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);// USART RX配置GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA, &GPIO_InitStructure);// 波特率USART_InitStructure.USART_BaudRate = 115200;// 数据8位USART_InitStructure.USART_WordLength = USART_WordLength_8b;// 停止位1位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;// 初始化USART1USART_Init(USART1, &USART_InitStructure);// 使能USART1USART_Cmd(USART1, ENABLE); }

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。
相关阅读
STM32 USART 补充

STM32 USART 补充

2021-04-20

STM32--USART详解

STM32--USART详解

2022-05-08

STM32 - USART简介

STM32 - USART简介

2022-05-02

STM32 USART解析

STM32 USART解析

2020-08-13