串口功能讲解
串口框图
对应的板载引脚,我的是STM32F103VET6
引脚 | APB2总线 | APB1总线 | APB1总线 | APB1总线 | APB1总线 |
---|---|---|---|---|---|
串口 | USART1 | USART2 | USART3 | USART4 | USART5 |
TXD | PA9 | PA2 | PB10 | PC10 | PC12 |
RXD | PA10 | PA3 | PB11 | PC11 | PD2 |
SCLK | PA8 | PA4 | PB12 | ||
NCTS | PA11 | PA0 | PB13 | ||
NRTS | PA12 | PA1 | PB14 |
TXD:数据发送
RXD:数据接收
SCLK:时钟,仅同步通信时使用
nRTS:请求发送(Request to send)
nCTS:允许发送(CLear to send)
注意:STM32F103VET6 系统控制器有三个 USART 和两个 UART,其中 USART1 和时钟来源 于 APB2 总线时钟,其最大频率为 72MHz,其他四个的时钟来源于 APB1 总线时钟,其最 大频率为 36MHz。UART 只是异步传输功能,所以没有 SCLK、nCTS 和 nRTS 功能引脚。
数据寄存器——USART_DR:9位有效,包含一个发送数据寄存器IDR和一个接收数据寄存器RDR,一个地址对应了两个物理内存。
数据寄存器
数据寄存器——USART_DR:只有底9位有效,包含一个发送数据寄存器TDR和一个接收数据寄存器RDR。一个地址对应了两个物理内存。
数据格式
(启动位)USART_CR1:M,0:8bit 1:9bit
(停止位)USART_CR2:STOP
(校验位)USATR_CR1:PCE(使能校验),PS(选择校验),PEIE
(校验检测)USART_SR:PE(校验错误)
具体流程
数据发送
UE:USART使能(USART enable) 0:时钟与输出被禁止 1:模块使能
当该位被清零 .
TE:发送使能(使能后 串口可以发送数据)
内存→(读取)CPU或DMA→发送数据寄存器(TDR)→发送移位寄存器→TX
TXE(发送数据寄存器空)→TXC(发送移位寄存器完成)
数据接收
UE:USART使能(USART enable) 0:时钟与输出被禁止 1:模块使能
当该位被清零 .
RE:接收使能(使能后 串口可以接收数据).
RX→接收移位寄存器→接收数据寄存器(RXNE)
波特率
波特率:每秒钟要发送多少数据
USART_BRR:波特率寄存器
分数波特率的产生
Tx / Rx 波特率 =fck/16*USARTDIV
fck:外设的时钟(PCLK1用于USART2、3、4、5,PCLK2用于USART1)
注意需要区分APB1 APB2 两条总线的时钟
USARTDIV:无符号的定点数 这12位的值设置在USART_BRR寄存器
列如:串口1
USART:USART1 时钟为72M
波特率:115200
115200 = 72000000/16*USARTDIV
USARTDIV = 39.0625
DIV_Fraction = 0.0625*16 = 1 = 0x01
DIV_Mantissa = 39 = 0x17
则:USART_BRR = 0X171
基本结构体
串口初始化结构体
typedef struct
{
//串口波特率 115200
uint32_t USART_BaudRate;
/*!< This member configures the USART communication baud rate.The baud rate is computed using the following formula:- IntegerDivider = ((PCLKx) / (16 * (USART_InitStruct->USART_BaudRate))- FractionalDivider = ((IntegerDivider - ((u32) IntegerDivider)) * 16) + 0.5 */
//字长 控制寄存器M位
uint16_t USART_WordLength;
/*!< Specifies the number of data bits transmitted or received in a frame.
This parameter can be a value of @ref USART_Word_Length */
//停止位
uint16_t USART_StopBits;
/*!< Specifies the number of stop bits transmitted.This parameter can be a value of @ref USART_Stop_Bits */
//校验位
uint16_t USART_Parity;
/*!< Specifies the parity mode.This parameter can be a value of @ref USART_Parity @note When parity is enabled, the computed parity is inserted
at the MSB position of the transmitted data (9th bit whenthe word length is set to 9 data bits; 8th bit when the word length is set to 8 data bits). */
//模式(发送与接收)
uint16_t USART_Mode;
/*!< Specifies wether the Receive or Transmit mode is enabled or disabled.
This parameter can be a value of @ref USART_Mode */
//硬件控制流 中断
uint16_t USART_HardwareFlowControl;
/*!< Specifies wether the hardware flow control mode is enabledor disabled.
This parameter can be a value of @ref USART_Hardware_Flow_Control */
} USART_InitTypeDef;
串口时钟配置(同步还是异步通讯)
typedef struct
{
uint16_t USART_Clock; /*!< Specifies whether the USART clock is enabled or disabled.
This parameter can be a value of @ref USART_Clock */
//极性
uint16_t USART_CPOL; /*!< Specifies the steady state value of the serial clock.
//相位 This parameter can be a value of @ref USART_Clock_Polarity */
uint16_t USART_CPHA; /*!< Specifies the clock transition on which the bit capture is made.
This parameter can be a value of @ref USART_Clock_Phase */
uint16_t USART_LastBit; /*!< Specifies whether the clock pulse corresponding to the last transmitted
data bit (MSB) has to be output on the SCLK pin in synchronous mode.
This parameter can be a value of @ref USART_Last_Bit */
} USART_ClockInitTypeDef;