首页 理论教育 STM32串口复位原理及配置

STM32串口复位原理及配置

时间:2023-11-23 理论教育 版权反馈
【摘要】:图7.12寄存器APB2ENR各位描述串口复位当外设出现异常的时候可以通过复位寄存器里面的对应位设置,实现该外设的复位,然后重新配置这个外设达到让其重新工作的目的。图7.14寄存器USART_BRR各位描述前面提到STM32的分数波特率概念,其实就是在这个寄存器里面体现的。图7.15USART_CR1寄存器各位描述该寄存器的高18位没有用到,低14位用于串口的功能设置。图7.17寄存器USART_SR各位描述这里主要关注两个位,第5、6位RXNE和TC。

STM32串口复位原理及配置

串口作为MCU的重要外部接口,既是外部设备接口,同时也是软件开发重要的调试手段。STM32具有多个串口,资源相当丰富,功能也相当强劲。例如STM32F103ZET6最多可提供5路串口,有分数波特率发生器、支持同步单线通信半双工单线通信、支持LIN、支持调制解调器操作、智能卡协议和IrDA SIR ENDEC规范、具有DMA等。在前面的章节已经对串口进行了详细的介绍,下面从寄存器层面介绍如何设置串口。

本节将通过一个实例介绍如何通过设置串口寄存器,实现所需的通信功能,利用串口1接收计算机通过串口发送过来的数据,并把发送过来的数据直接返送回计算机,然后由计算机将数据打印显示出来。

串口最基本的设置就是波特率的设置。STM32的串口只要开启了串口时钟,并设置相应的I/O口模式,然后配置波特率、数据位长度、奇偶校验位等信息,就可以使用了。下面简单介绍这几个与串口基本配置直接相关的寄存器。

(1)串口时钟使能

串口作为STM32的一个外设,其时钟由外设时钟使能寄存器控制,这里使用的串口1是在APB2ENR寄存器的第14位,如图7.12所示。APB2ENR寄存器在之前已经介绍过了,这里只说明一点,除了串口1的时钟使能在APB2ENR寄存器,其他串口的时钟使能位都在APB1ENR。

图7.12 寄存器APB2ENR各位描述

(2)串口复位

当外设出现异常的时候可以通过复位寄存器里面的对应位设置,实现该外设的复位,然后重新配置这个外设达到让其重新工作的目的。一般在系统刚开始配置外设的时候,都会先执行复位该外设的操作。串口1的复位是通过配置APB2RSTR寄存器的第14位来实现的。APB2RSTR寄存器的各位描述如图7.13所示。

图7.13 寄存器APB2RSTR各位描述

从图7.13可知串口1的复位设置位在APB2RSTR的第14位。通过向该位写1复位串口1,写0结束复位。其他串口的复位在APB1RSTR里面。

(3)串口波特率设置

每个串口都有一个自己独立的波特率寄存器USART_BRR,通过设置该寄存器达到配置不同波特率的目的。该寄存器的各位描述如图7.14所示。

图7.14 寄存器USART_BRR各位描述

前面提到STM32的分数波特率概念,其实就是在这个寄存器里面体现的。最低4位用来存放小数部分DIV_Fraction,[15:4]这12位用来存放整数部分DIV_Mantissa。高16位未使用。

这里波特率的计算通过如下公式计算:

这里的fPCLKx(x=1、2)是给外设的时钟(PCLK1用于串口2、3、4、5,PCLK2用于串口1),USARTDIV是一个无符号的定点数,它的值可以通过串口的BRR寄存器值得到。但一般是知道波特率和PCLKx的时钟,要求的就是USART_BRR的值。

下面介绍如何通过USARTDIV得到串口USART_BRR寄存器的值,假设串口1要设置为9 600的波特率,而PCLK2的时钟为72 M。这样,根据上面的公式有:(www.xing528.com)

可得到:

这样,我们就得到了USART1->BRR的值为0X1D4C。只要设置串口1的BRR寄存器值为0X1D4C就可以得到9 600的波特率。

(4)串口控制

STM32的每个串口都有3个控制寄存器USART_CR1~3,串口的很多配置都是通过这3个寄存器来设置的。这里只要用到USART_CR1就可以实现,该寄存器的各位描述如图7.15所示。

图7.15 USART_CR1寄存器各位描述

该寄存器的高18位没有用到,低14位用于串口的功能设置。UE为串口使能位,通过该位置1,以使能串口。M为字长选择位,当该位为0的时候设置串口为8个字长外加n个停止位,停止位的个数(n)是根据USART_CR2的[13:12]位设置来决定的,默认为0。PCE为校验使能位,设置为0,则禁止校验,否则使能校验。PS为校验位选择,设置为0则为偶校验,否则为奇校验。TXIE为发送缓冲区空中断使能位,设置该位为1,当USART_SR中的TXE位为1时,将产生串口中断。TCIE为发送完成中断使能位,设置该位为1,当USART_SR中的TC位为1时,将产生串口中断。RXNEIE为接收缓冲区非空中断使能,设置该位为1,当USART_SR中的ORE或者RXNE位为1时,将产生串口中断。TE为发送使能位,设置为1,将开启串口的发送功能。RE为接收使能位,用法同TE。其他位的设置,这里就不一一列出,可以参考前面USART的相关章节。

(5)数据发送与接收

STM32的发送与接收是通过数据寄存器USART_DR来实现的,这是一个双寄存器,包含了TDR和RDR。当向该寄存器写数据的时候,串口就会自动发送,当收到收据的时候,也是存在该寄存器内。该寄存器的各位描述如图7.16所示。

图7.16 寄存器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的各位描述如图7.17所示。

图7.17 寄存器USART_SR各位描述

这里主要关注两个位,第5、6位RXNE和TC。RXNE(读数据寄存器非空),当该位被置1的时候,就是提示已经有数据被接收到了,并且可以读出来了。这时候我们要做的就是尽快去读取USART_DR,通过读USART_DR可以将该位清零,也可以向该位写0,直接清除。TC(发送完成),当该位被置位时,表示USART_DR内的数据已经被发送完成了。如果设置了这个位的中断,则会产生中断。该位也有两种清零方式:①读USART_SR,写USART_DR;②直接向该位写0。通过以上一些寄存器的操作外加IO口的配置,就可以达到串口最基本的配置,关于串口更详细的介绍,请参考USART相关章节。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈