(USART1->SR & USART_FLAG_TC));这句是等待数据完完全全从“发送移位寄存器”中发送出去,while (!(USART1->SR & USART_FLAG_TXE));这句是等待数据从USARTx->DR转移到“发送移位寄存器”中。在后一句的写法中,并不需等待数据完全发送,只需要USARTx->DR里面的数据已经被转移走,就可以马上进行...
主要说的是两个标志位:USART_FLAG_TXE 和 USART_FLAG_TC。USART_FLAG_TXE发送缓冲区空标志:说明可以往数据寄存器写入数据了,但并不代表数据发送完成了。USART_FLAG_TC发送完成标志:这个才是代表USART在缓冲区的数据发送完成了,即从机接收到了数据。这两个标志的区别在于:它们分别表示数据在发送过程中,在两个不同...
首先明确一个概念,关于MCU中通信总线和通信协议,通信总线是一种用于连接各种外设和模块的物理接口,它可以传输数据和控制信息。通信协议则是指在通信总线上传输数据时所遵循的规则和约定,以确保不同设备之间能够正确地交换信息,我们也可以把他叫做通信总线协议。 系列文章,主要讲解以下几个总线协议,读者可以按需选择: UA...
软件或DMA控制器 把1Byte数据写入UART的发送数据寄存器TDR后,UART清零TXE标志和TC标志,并自动将数据从发送数据寄存器TDR转移到发送移位寄存器TSR,转移完成后置位TXE标志并触发UART中断请求(TXE中断使能时)、DMA请求(UART的DMA发送模式使能时),同时UART发送器根据UART协议,将发送移位寄存器TSR的数据发送到TX引脚,发...
void UART_SendByte(uint8_t Data){ while(RESET == USART_GetFlagStatus(USART1, USART_FLAG_TXE)); USART_SendData(USART1, Data);} 但发送非空不代表发送完成,虽然在某些场合更高效,但某些场合就会导致数据丢失。 比如:使用此函数发送之后进入休眠、关闭接收端设备电源等情况下。
TXE标志位表示移位寄存器器为空,TC表示发送完成,之前混淆了这两个概念,移位寄存器为空并不等于发送完成了,看手册里的这张图我们就能明了两者之间的关系 3.使用空闲中断来接收数据 定义一个fifo来存放收到的数据(这里的发送fifo先定义着,还没用到) /*uart fifo 结构体*/typedefstruct{uint8_t*rxBuf;/*接收缓冲...
搞明白USART_FLAG_TC 与 USART_FLAG_TXE之间的 区别 最近看到有不少人问USART_FLAG_TC 与 USART_FLAG_TXE的区别是什么,我今天就抽时间详谈此事。 先说串口收发过程: 对于CPU来说,只需要将数据填入发送数据寄存器中就可以启动串口发送了,因为数据寄存器中的数据会由硬件自动打入发送移位寄存器中;同理,接收移位寄存...
TXIE发送缓冲区空中断使能位,设置该位为 1,当USART_SR 中的 TXE 位为1 时产生串口中断。 TCIE发送完成中断使能位,设置该位为 1,当 USART_SR 中的 TC位为 1 时产生串口中断。 RXNEIE 接收缓冲区非空中断使能,设置该位为 1,当 USART_SR中的 ORE 或者 RXNE 位为 1 时产生串口中断。
{while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) ==RESET); USART_SendData(USART3,*dat);while(USART_GetFlagStatus(USART3, USART_FLAG_TC) ==RESET); USART_ClearFlag(USART3, USART_FLAG_TC); delay_us(guardtime); } 发送一定字节数据 ...
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET); } // 发送数组 void Serial_SendArray(uint8_t *Array,uint16_t Length) {uint16_t i; for(i = 0; i < Length;i++) {Serial_SendByte(Array[i]); } } // 发送字符串 ...