USART框图
图10-1这里简单介绍下USART框图。
TX为发送数据的输出引脚,RX为接收数据的输入引脚,SCLK为发送器时钟输出引脚(同步模式下会用到)。其中SCLK来源于APB1总线时钟(36MHz)和APB2总线时钟(72MHz)。
这里涉及到USART数据寄存器(USART_DR)。如图10-2。
图10-2数据的发送和接收
从图10-2的寄存器描述我们知道,USART_DR实际上包含了一个发送用的TDR寄存器,一个接收用的RDR寄存器。发送时,把TDR内容转移到发送移位寄存器,由发送移位寄存器一位一位发出;接收时,把收到的每一位保存到接收移位寄存器然后再转移到RDR。
USART有专门的发送器和接收器,在使用USART前需要先使能USART,将USART_CR1寄存器的UE位置1即可。而发送或接收的数据字长可选8位或9位,由USART_CR1的M位控制。
要启动数据发送,需要先使能USART_CR1的TE位,则发送移位寄存器的数据会在TX引脚输出,从低位开始发送,如果是同步模式,则SCLK也会输出时钟信号。在异步模式中,一个字符帧包含三部分:起始位+数据帧+停止位。中间部分的数据帧则是我们要发送的8位或9位数据。当使能TE位后,发送器开始会先发送一个空闲帧,然后往USART_DR写入要发送的数据。发送完成后,等待状态寄存器(USART_SR)的TC位置1后,则代表数据传输完成,同时如果USART_CR1的TCIE位置1,将产生中断。
同理,在接收时,需要置位USART_CR1的RE位,使能接收。接收完成后,会把USART_SR的RXNE位置1,同时如果USART_CR1的RXNEIE位置1,可以产生中断。
USART_DR、USART_SR和USART_CR1~3需要结合使用,相关寄存器描述可自行查阅参考手册。
波特率相关
USART中,波特率和比特率的值相等,所以一般不区分这两个概念。波特率越大,传输速率越快。USART的发送器和接收器使用相同的波特率,公式如下:
boud =
其中boud为波特率的值,f为USART时钟频率,USARTDIV是USART分频器除法因子,如图10-3的寄存器描述。
图10-3由描述可知,DIV_Mantissa为USARTDIV的整数部分,DIV_Fraction为USARTDIV的小数部分。那么,
USARTDIV = DIV_Mantissa + DIV_Fraction / 16
波特率的常用值有2400、9600、19200、115200。
例如,挂载在APB2总线的USART1,其有72MHz的时钟频率,即f=72MHz,假设我们需要115200的波特率,则由上面的公式可得:
115200 = 72000000 / (16*USARTDIV)
我们能得到USARTDIV=39.0625,那么
DIV_Mantissa=39=0x17,
DIV_Fraction=0.625*16=1=0x01
这时我们应该设置USART_BRR的值为0x171。
校验控制
USART还支持奇偶校验。当使用校验位时,数据帧长度为8位数据帧加上1位校验位,共9位,此时USART_CR1的M位需要置1。将USART_CR1的PCE位置1可以使能校验控制。奇偶校验由硬件自动完成,在发送数据时会自动添加校验位,接收数据时会自动验证校验位。接收数据验证校验位时如果校验失败,USART_SR的PE位将会置1,同时如果USART_CR1的PEIE位置1,便能产生奇偶校验中断。
使能校验控制后,每个字符帧组成将变为:起始位+数据帧+校验位+停止位。