历史上的今天
返回首页

历史上的今天

今天是:2024年09月24日(星期二)

正在发生

2019年09月24日 | USART里面TXE和TC的用法

2019-09-24 来源:eefocus

在USART的发送端有2个寄存器,一个是程序可以看到的USART_DR寄存器,另一个是程序看不到的移位寄存器,对应USART数据发送有两个标志,一个是TXE=发送数据寄存器空,另一个是TC=发送结束。


当USART_DR中的数据传送到移位寄存器后,TXE被设置,此时移位寄存器开始向TX信号线按位传输数据,但因为TDR已经变空,程序可以把下一个要发送的字节(操作USART_DR)写入TDR中,而不必等到移位寄存器中所有位发送结束,所有位发送结束时(送出停止位后)硬件会设置TC标志。


另一方面,在刚刚初始化好USART还没有发送任何数据时,也会有TXE标志,因为这时发送数据寄存器是空的。TXEIE和TCIE的意义很简单,TXEIE允许在TXE标志为'1'时产生中断,而TCIE允许在TC标志为'1'时产生中断。


至于什么时候使用哪个标志,需要根据你的需要自己决定。但我认为TXE允许程序有更充裕的时间填写TDR寄存器,保证发送的数据流不间断。TC可以让程序知道发送结束的确切时间,有利于程序控制外部数据流的时序。

 

TXE--写寄存器DR清零

RXNE--读寄存器DR清零,也可软件手动清零

 TC--  读/写寄存器DR清零,也可软件手动清零

 

先说TC。即Transmission Complete。发送一个字节后才进入中断,这里称为“发送后中断”。和原来8051的TI方式一样,都是发送后才进中断,需要在发送函数中先发送一个字节触发中断。发送函数如下

/*******
功能:中断方式发送字符串.采用判断TC的方式.即 判断 发送后中断 位.
输入:字符串的首地址
输出:无
*******/
void USART_SendDataString( u8 *pData )
{
    pDataByte = pData;
  
    USART_ClearFlag(USART1, USART_FLAG_TC);//清除传输完成标志位,否则可能会丢失第1个字节的数据.网友提供.
    
    USART_SendData(USART1, *(pDataByte++) ); //必须要++,不然会把第一个字符t发送两次
}


中断处理函数如下
/********
* Function Name  : USART1_IRQHandler
* Description    : This function handles USART1 global interrupt request.
* Input          : None
* Output         : None
* Return         : None
*********/
void USART1_IRQHandler(void)
{
    if( USART_GetITStatus(USART1, USART_IT_TC) == SET  )
    {
        if( *pDataByte == '' )//TC需要 读SR+写DR 方可清0,当发送到最后,到''的时候用个if判断关掉
            USART_ClearFlag(USART1, USART_FLAG_TC);//不然TC一直是set, TCIE也是打开的,导致会不停进入中断. clear掉即可,不用关掉TCIE
        else
            USART_SendData(USART1, *pDataByte++ );
    }

}

其中u8 *pDataByte;是一个外部指针变量

在中断处理程序中,发送完该字符串后,不用关闭TC的中断使能TCIE,只需要清掉标志位TC;这样就能避免TC == SET 导致反复进入中断了。

void USART_Config()
{
  ........................................

  USART_ITConfig(USART1, USART_IT_TC, ENABLE);//Tramsimssion Complete后,才产生中断. 开TC中断必须放在这里,否则还是会丢失第一字节

  USART_Cmd(USART1, ENABLE); //使能USART1
}

.....................................................................

再说判断TXE。即Tx DR Empty,发送寄存器空。当使能TXEIE后,只要Tx DR空了,就会产生中断。所以,发送完字符串后必须关掉,否则会导致重复进入中断。这也是和TC不同之处。

发送函数如下:
/*******
功能:中断方式发送字符串.采用判断TC的方式.即 判断 发送后中断 位.
输入:字符串的首地址
输出:无
*******/
void USART_SendDataString( u8 *pData )
{
    pDataByte = pData;
    USART_ITConfig(USART1, USART_IT_TXE, ENABLE);//只要发送寄存器为空,就会一直有中断,因此,要是不发送数据时,把发送中断关闭,只在开始发送时,才打开。
    
}

中断处理函数如下:

/********
* Function Name  : USART1_IRQHandler
* Description    : This function handles USART1 global interrupt request.
* Input          : None
* Output         : None
* Return         : None
********/
void USART1_IRQHandler(void)
{
    if( USART_GetITStatus(USART1, USART_IT_TXE) == SET  )
    {
        if( *pDataByte == '' )//待发送的字节发到末尾NULL了
            USART_ITConfig(USART1, USART_IT_TXE, DISABLE);//因为是 发送寄存器空 的中断,所以发完字符串后必须关掉,否则只要空了,就会进中断
        else
            USART_SendData(USART1, *pDataByte++ );
    }

}

在串口初始化函数中就不用打开TXE的中断了(是在发送函数中打开的)


推荐阅读

史海拾趣

EOZ Secme公司的发展小趣事

随着国内市场的饱和,EOZ Secme开始积极寻求海外市场的拓展。公司制定了详细的国际化战略,通过参加国际展会、建立海外销售渠道等方式,逐步打开了国际市场的大门。同时,EOZ Secme还积极与国际知名企业开展合作,共同研发新产品,拓展业务领域。这些努力使得EOZ Secme在国际市场上的影响力不断增强。

Fractus公司的发展小趣事

面对不断变化的市场需求和技术挑战,Fractus始终保持着对研发的重视和投入。公司拥有一支经验丰富的研发团队,致力于在天线技术领域进行持续的创新和探索。近年来,Fractus在微型化、多波段和智能天线技术方面取得了显著进展,并推出了多款具有自主知识产权的创新产品。展望未来,Fractus将继续秉承创新精神,推动天线技术的不断发展,为电子行业的进步贡献更多力量。

Bharat Electronics Ltd公司的发展小趣事

作为电子行业的领军企业,BEL始终注重技术创新和研发。公司不断投入大量资源用于新产品的研发和创新,努力引领行业趋势。近年来,BEL在无人机、太阳能电池组等领域取得了显著成果,推出了一系列具有创新性和市场竞争力的产品,为公司的持续发展注入了新的活力。

Hirosugi-Keiki公司的发展小趣事

作为电子行业的领军企业,BEL始终注重技术创新和研发。公司不断投入大量资源用于新产品的研发和创新,努力引领行业趋势。近年来,BEL在无人机、太阳能电池组等领域取得了显著成果,推出了一系列具有创新性和市场竞争力的产品,为公司的持续发展注入了新的活力。

Apex Tool Group公司的发展小趣事

Bharat Electronics Ltd(以下简称BEL)的创立可追溯到印度硅谷班加罗尔,那里不仅是科技创新的摇篮,也是BEL扎根生长的沃土。自1954年起,BEL便在飞利浦和大盾的支持下成立,初期主要生产ECC81、ECC82、ECC83、EL34等电子管,为国防事业提供关键技术支持。其成立之初便与印度国防部紧密合作,成为印度军工电子领域的领军企业,为国家的国防安全奠定了坚实的基础。

Endicott Research Group Inc (ERG)公司的发展小趣事

面对日益激烈的市场竞争,ERG始终坚持技术研发和创新。他们与多所知名大学和科研机构建立合作关系,共同研发新型电源技术和照明解决方案。这些合作不仅为ERG带来了先进的技术和研发资源,还使其在行业中保持了技术领先地位。通过与科研机构的紧密合作,ERG不断推出更具创新性和竞争力的产品。

问答坊 | AI 解惑

求救:如何将SST 89E564RD (40-c-p1 0438064-AC)变成仿真器

买了块廉价的芯片,想自己做仿真器 里面没有启动程序 想自己DIY一个仿真器 麻烦成功的大虾发一个可以用的    1电路图    2软件    3监控程序 4 其他对SST 89E564RD  用的上 [ 本帖最后由 wanzsxit ...…

查看全部问答>

2009年竞赛学生守则].doc

本帖最后由 paulhyde 于 2014-9-15 08:57 编辑 2009年竞赛学生守则].doc  …

查看全部问答>

再次请教S3C2440+WinCE5.0+4.2BSP下使用4GB的SDHC大容量SD卡驱动问题,大家指点

再次请教S3C2440+WinCE5.0+4.2BSP下使用4GB的SDHC大容量SD卡驱动问题,大家指点!!! 大家好,谢谢大家一直以来这么热心的回复的我帖子,帮助我,谢谢大家,祝大家工作顺利! 我的环境:S3C2440+WinCE5.0+4.2BSP,开发板是广嵌科技的GEC2440。 ...…

查看全部问答>

nrf905通过匹配网络连接50欧姆单端天线问题

现在用nrf905设计开发一个射频智能卡测试平台的无线接口,为增强实验的可靠性,我们在设计了PCB环形差分天线的前提下,通过两个跳线,将芯片的ANT1和ANT2通过匹配网络再连接到SMA天线接口处,以备PCB环形天线不能满足实验要求时,可以经过跳线连接 ...…

查看全部问答>

在eMbedded Visual C++中使用VC++编写的.dll的问题

我最近做个项目,在手机上显示监控图像。在eMbedded Visual C++中使用VC下的Dll出错。 提示如下: error LNK2019: unresolved external symbol __imp__MP4_ClientStopCapture referenced in function \"protected: void __thiscall CKlsDlgDlg::On ...…

查看全部问答>

在ADC下面或附近数模一点共地有什么区别

datasheet上是说应该在下面一点共地,但是如果在附近引出来用0欧电阻接可能产生什么问题,还查到有说,用磁珠相连有选频的好处,这个“选频”怎么讲?是指可以把数字区指定频率的噪声滤掉吗?数字区的噪声频率是不是就是单片机的频率啊?谢谢指教 ...…

查看全部问答>

i2c是什么玩意?

在网上看了好多i2c的资料  但感觉还是云里雾里的  不明白怎么用?求大虾指点!…

查看全部问答>

神器!Launchpad游戏扩展板

这是继MSP430的MP3扩展板(DSP C5000)后的又一个华丽的扩展板。 说说功能吧!扩展板提供一路VGA输出,VGA的DA采用电阻分压的方式,分辨率为400×300,并且支持两个任天堂的游戏手柄, 打游戏嘛!手柄肯定不能少。主芯片是一片Spartan 3的FPGA ...…

查看全部问答>

画PCB用哪个软件好?

求教各位大神,尤其是已经工作的,在公司做项目画PCB一般是用哪个软件呢?…

查看全部问答>

有符号数的整数乘法演算问题。。。

在网上看到了这样一份有符号整数乘法的演算,请问哪位能解释下。。。。 为什么这里的加法与我们的平时的不一样的,应该怎样理解。。。…

查看全部问答>