STM32 UART寄存器之 TC & TXE的区别

 首先看一下datasheet的表述:

下面对二者做一些区分

定义

TXE:发送数据寄存器空

TC:发送完成

置位

都是hardware置位,TXE是TDR寄存器数据转移到移位寄存器后置位;TC是在TXE置位后,并且数据帧传输完成;

中断

TXE:TXEIE使能中断;TC:TCIE使能中断;

那这两个寄存器应该怎么应用,有什么本质的区别吗?

从说明文档可以看出这两个标志位是有时间先后顺序的,TC要在TXE置位并且数据传输完成后才置位,表明TXE是更早发生的。TXE只能表明数据寄存器的数据被传输的移位寄存器,而此时数据并没有发送出去。TC则表示一帧数据发送完成,缓冲区的数据都已经发送出去了,甚至接收端也已经收到数据了。

TC才可以表示数据发送完成。

TXE表示你可以将下一个byte的数据写入数据寄存器了。具体使用方法可参考:

代码 

    Rx485_TX;
    uint8_t *p;
    p = (udp_demo_recvbuf + id*RS_485_SendSize);
    for(uint8_t i = 0; i < RS_485_SendSize; i++)
    {
        UART4->TDR = *(p+i);
        while(!(UART4->ISR & UART_FLAG_TXE));
    }
    //HAL_UART_Transmit(&huart4, udp_demo_recvbuf + id*RS_485_SendSize, RS_485_SendSize,1);
    while(!(UART4->ISR & UART_FLAG_TC));
    Rx485_RX;

上述代码中,RS485半双工通信,需要在发送数据前将数据方向设置为TX,每向TDR数据寄存器写入1字节数据后要判断TXE是否可以写入下一字节数据。当一帧数据全部写完后,在判断TC标志位,是否已经完成发送。如果将判定TXE标志位换成TC标志位,数据发送的时间会比较久一些;如果不加入TC判定,在TXE置位后立即设置Rx485_RX,会导致数据帧末尾没有完全发送成功。这个小例子将TXE和TC的关系说明的很到位了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值