文档介绍:------------------------------------------------------------------------------------------------ —————————————————————————————————————— STM32 串口 STM32 的串口是相当丰富的, 功能也很强劲。最多可提供 5 路串口( MiniSTM32 使用的是 STM32F103RBT6 ,具有 3 个串口) ,有分数波特率发生器、支持单线光通信和半双工单线通讯、支持 LIN 、智能卡协议和 IrDASIR ENDEC 规范(仅串口 3 支持) 、具有 DMA 等。串口最基本的设置, 就是波特率的设置。 STM32 的串口使用起来还是蛮简单的,只要你开启了串口时钟,并设置相应 IO 口的模式, 然后配置一下波特率, 数据位长度, 奇偶校验位等信息, 就可以使用了。下面, 我们就简单介绍下这几个与串口基本配置直接相关的寄存器。 1, 串口时钟使能。串口作为 STM32 的一个外设, 其时钟由外设时钟使能寄存器控制,这里我们使用的串口 1 是在 APB2ENR 寄存器的第 14 位。 APB2ENR 寄存器在之前已经介绍过了,这里不再介绍。只是说明一点,就是除了串口 1 的时钟使能在 APB2ENR 寄存器,其他串口的时钟使能位都在 APB1ENR 。 2 ,串口复位。当外设出现异常的时候可以通过复位寄存器里面的对应位设置, 实现该外设的复位, 然后重新配置这个外设达到让其重新工作的目的。一般在系统刚开始配置外设的时候, 都会先执行复位该外设的操作。串口 1 的复位是通过配置 APB2RSTR 寄存器的第 14 位来实现的。 APB2RSTR 寄存器的各位描述如下: 图 寄存器 APB2RSTR 各位描述------------------------------------------------------------------------------------------------ ——————————————————————————————————————从上图可知串口 1 的复位设置位在 APB2RSTR 的第 14 位。通过向该位写1 复位串口1,写0 结束复位。其他串口的复位位在 APB1RST R 里面。 3 ,串口波特率设置。每个串口都有一个自己独立的波特率寄存器 USART_BRR , 通过设置该寄存器达到配置不同波特率的目的。该寄存器的各位描述如下: 图 寄存器 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 寄存器值得到。而我们更关心的是如何从 USARTDI V 的值得到 USART_BR R 的值, 因为一般我们知道的是波特率, 和 PCLKx 的时钟,要求的就是 USART_BRR 的值。下面我们来介绍如何通过 USARTDI V 得到串口 USART_BR R 寄存器的值,假设我们的串口 1 要设置为 9600 的波特率,而 PCLK2 的时钟为 72M 。这样,我们根据上面的公式有: USARTDIV=72000000/9600*16= 那么得到: DIV_Fraction=16*=12=0X0C; DIV_Mantissa= 468=0X1D4; ------------------------------------------------------------------------------------------------ ——————————————————————————————————————这样, 我们就得到了 USART1->BRR 的值为 0X1D4C 。只要设置串口 1的 BRR 寄存器值为 0X1D4C 就可以得到 9600 的波特率。 4 ,串口控制。 STM32 的每个串口都有 3 个控制寄存器 USART_CR1~3 ,串口的很多配置都是通过这 3 个寄存器来设置的。这里我们只要用到 USART_CR1 就可以实现我们的功能了。 BIT 13: 串口功能; BIT 12: MODE , 字长。 0:1 个开始位,8 个数据位,1 位停止位