文章目录
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); }