1,串口时钟使能。串口作为STM32的一个外设,其时钟由外设时钟使能寄存器控制。这里我们使用的串口1是在APB2ENR寄存器的第14位。
APB2ENR寄存器在之前已经介绍过了,这里不再介绍。仅仅是说明一点。就是除了串口1的时钟使能在APB2ENR寄存器,其它串口的时钟使能位都在APB1ENR。
2,串口复位。当外设出现异常的时候能够通过复位寄存器里面的相应位设置,实现该外设的复位,然后又一次配置这个外设达到让其又一次工作的目的。一般在系统刚開始配置外设的时候,都会先运行复位该外设的操作。串口1的复位是通过配置APB2RSTR寄存器的第14位来实现的。
APB2RSTR寄存器的各位描写叙述例如以下:
图3.3.1.1寄存器APB2RSTR各位描写叙述
从上图可知串口1的复位设置位在APB2RSTR的第14位。通过向该位写1复位串口1。写0结束复位。其它串口的复位位在APB1RSTR里面。
3,串口波特率设置。
每一个串口都有一个自己独立的波特率寄存器USART_BRR,通过设置该寄存器达到配置不同波特率的目的。该寄存器的各位描写叙述例如以下:
图3.3.1.2寄存器USART_BRR各位描写叙述
前面提到STM32的分数波特率概念,事实上就是在这个寄存器里面体现的。最低4位用来存放小数部分DIV_Fraction,[15:4]这12位用来存放整数部分DIV_Mantissa。高16位未使用。这里波特率的计算通过例如以下公式计算:
以下我们来介绍怎样通过USARTDIV得到串口USART_BRR寄存器的值,如果我们的串口1要设置为9600的波特率,而PCLK2的时钟为72M。这样,我们依据上面的公式有:USARTDIV=72000000/9600*16=468.75
那么得到:DIV_Fraction=16*0.75=12=0X0C;
这样,我们就得到了USART1->BRR的值为0X1D4C。仅仅要设置串口1的BRR寄存器值为0X1D4C就能够得到9600的波特率。
4。串口控制。STM32的每一个串口都有3个控制寄存器USART_CR1~3,串口的非常多配置都是通过这3个寄存器来设置的。这里我们仅仅要用到USART_CR1就能够实现我们的功能了。
BIT 13: 串口功能;
BIT 12: MODE。字长。
0:
*注意:停止位的长度可在USART_CR2寄存器中设置。
BIT 11: WAKE 唤醒功能
BIT 10: 校检使能位,当激活奇偶校验功能时。置位该位将自己主动往要数据传输的高位字节处插入就校验位。
BIT 09: Parity Selection,0:偶校验;1:奇校验。
BIT 08: PE Interrupt Enable
BIT 07: 发送缓冲区空中断使能位
BIT 06: 发送完毕中断使能位
BIT 05: 接收缓冲区非空中断使能位
BIT 04: Idle Interrupt Enable
BIT 03: Transfer Enable
BIT 02: Receive Enable
BIT 01: Receiver Wakeup
BIT 00: Send Break
5,数据发送与接收。STM32的发送与接收是通过数据寄存器USART_DR来实现的。这是一个双寄存器,包括了TDR和RDR。当向该寄存器写数据的时候。串口就会自己主动发送,当收到收据的时候,也是存在该寄存器内。
该寄存器的各位描写叙述例如以下:
图3.3.1.3寄存器USART_DR各位描写叙述
能够看出。尽管是一个32位寄存器。可是仅仅用了低9位(DR[8:0])。其它都是保留。
DR[8:0]为串口数据。包括了发送或接收的数据。因为它是由两个寄存器组成的,一个给发送用(TDR)。一个给接收用(RDR),该寄存器兼具读和写的功能。TDR寄存器提供了内部总线和输出移位寄存器之间的并行接口。RDR寄存器提供了输入移位寄存器和内部总线之间的并行接口。
当使能校验位(USART_CR1种PCE位被置位)进行发送时。写到MSB的值(依据数据的长度不同,MSB是第7位或者第8位)会被后来的校验位该代替。
当使能校验位进行接收时,读到的MSB位是接收到的校验位。
6。串口状态。串口的状态能够通过状态寄存器USART_SR读取。
USART_SR的各位描写叙述例如以下: