注意:TX管脚首先发送最低位,同样,RX管脚也最先接收最低位。
起始位为低,停止位为高。
1.发送
(1)发送使能位TE--在CR1中
USART_InitStructure.USART_Mode = USART_Mode_Tx;
USART_Init(USARTx, &USART_InitStructure);
设置完TE位后,STM32会发送一个空闲帧
(2)TXE位
清零:一般通过往数据寄存器DR中写数据完成
置位:硬件置位,表明:
·数据已经从TDR转移到移位寄存器中,数据已经开始发送;
·TDR为空,下一个数据可以写入DR中,而不会覆盖前面的数据
if(USART_GetITStatus(USARTx, USART_IT_TXE) != RESET)
{
pch->TxCtr++;
MB_TxByte(pch); /* Send next byte */
}
如果TXEIE位为1,将产生发送中断。
(3)TC位
置位:发送完成一个帧之后,TC位被硬件置1,如果USART_CR1中的TCIE被置1.将产生一个中断。
清零:软件操作完成:1.读一次USAR_SR 2.写一次USART_DR
if(USART_GetITStatus(USARTx, USART_IT_TC) != RESET)
2.接收
(1)RE
USART_InitStructure.USART_Mode = USART_Mode_Rx;
USART_Init(USARTx, &USART_InitStructure);
设置RE位后,将使能接收端开始寻找起始位。
(2)RXNE
置1:RXNE被置1表明移位寄存器的内容被转移到RDR中,即数据已经接收到并可以读取了。如果RXNEIE为1,将产生中断。
清零:在单缓冲模式下(DMA为多缓冲模式),清零RXNE通过软件读取USART_DR完成。
if(USART_GetITStatus(USARTx, USART_IT_RXNE) != RESET)
{
c = USART_ReceiveData(USARTx); /* Read the character from the UART */
}
RXNE位必须在下一个数据接收完成之前被清零,否则将产生溢出错误USART_FLAG_ORE置1。
溢出期间接收到的数据将丢失。
3.奇偶校验
M位为数据位长度,PCE位为奇偶校验使能位。
奇偶校验位包含在数据位中。
4.通信分为同步和异步通信,同步通信利用时钟同步信号,从而得知数据的开始和结束。UART为异步通信,利用事先在发送和接收端统一的数据格式来判断数据的开始和结束,同步信号。
USART_InitStructure.USART_BaudRate = baud; /* Configure USART */
USART_InitStructure.USART_WordLength = bits;
USART_InitStructure.USART_StopBits = stops;
USART_InitStructure.USART_Parity = parity;
串口通过收发端统一这些信息,规定数据帧的格式,实现信号同步。