数据的发送
TE标志位
- 要想使串口能够发送数据,必须置位TE标志位,并且在写入发送寄存器TDR之前置位。
- 当TE位置位,会产生一个空闲帧。
- 数据传输过程中,复位TE,会导致数据发送错误,波特率产生器会冻结。
TXE状态标志位
该位由硬件置位,它表示:
- 数据已从 USART_TDR 寄存器移至移位寄存器,并且数据传输已经开始。
- USART_TDR 寄存器为空。
- 下一个数据可以写入 USART_TDR 寄存器而无需覆盖以前的数据。
如果 TXEIE 置位,会产生一个中断 该标志位清除方法:
- 写入新数据到USART_TDR
- USART_RQR中的TXFRQ置位刷新该标志位
TC标志位
该标准位代表发送结束,如图。
发送数据的配置顺序
- 配置CR1寄存器的M标志位,即配置数据长度;
- 配置波特率;
- 配置停止位长度;
- 通过置位CR1的UE标志位使能USART模块;
- 如果需要配置DMA可在CR3寄存器配置DMA;
- 置位CR1寄存器的TE标志位,发送一个空闲帧;
- 将要发送的数据写入TDR寄存器,如果在单数据传输模式,TXE会被清除;
- 最后一个数据被写入TDR寄存器后,等待TC标志位置位,表示最后一帧数据发送完成。
数据的读取
RXNE状态标志位
当该标志位置位,代表:
- 移位寄存器的内容被传送到TRD寄存器,可读;
- 如果使能RXNEIE标志位可产生中断
接收数据的配置顺序
- 配置CR1寄存器的M标志位,即配置数据长度;
- 配置波特率;
- 配置停止位长度;
- 通过置位CR1的UE标志位使能USART模块;
- 如果需要配置DMA可在CR3寄存器配置DMA;
- 置位CR1寄存器的RE标志位,RX开始寻找起始帧。
波特率
fCK在RCC_CGFR3寄存器中配置
例: SYSCLK频率为72MHz,想要得到19200的波特率,则: 将USARTSW配置为01,即SYSCLK
19200 = 72000000 / USARTDIV
OVER8不置位 则BBR = 3750十六进制为0x0EA6。
注意:
- 如果调试过程中,单片机读不到数据,但是能发送数据,可能是外部没有上拉,此时可以配置引脚内部上拉进行调试,有了上拉以后,串口才能读到数据。
- Modbus的地址为1,实际发出的地址是0;CAN的地址为1,实际发送的也是1。两种协议的区别。
- 不清除中断标志位会导致一直进入中断,可在中断中关闭中断使能从而避免一直进入中断。
附录
寄存器|初始化
void USART1_Init(void)
{
USART1->CR1 = (USART1->CR1 & 0xe000000)
;
USART1->BRR = 1250;
USART1->CR2 = (USART1->CR2 & 0x0000008f)
;
USART1->CR3 = 0
;
USART1->CR1 |= USART_CR1_RXNEIE | USART_CR1_RE;
USART1->CR1 |= USART_CR1_UE;
USART1->GTPR = 0x0000
;
USART1->RTOR = 0x00000000
;
USART1->RQR = (USART1->RQR & 0xffffffe0)
;
USART1->ICR = (USART1->ICR & 0xffede4a0)
;
}
|