0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

STM32的USART發(fā)送數(shù)據(jù)時如何使用TXE和TC標志呢?

工程師鄧生 ? 來源:未知 ? 作者:劉芹 ? 2023-10-26 11:31 ? 次閱讀

STM32的USART發(fā)送數(shù)據(jù)時如何使用TXE和TC標志呢?

USART 是 STM32 中非常重要的外設(shè)之一,用于串行通信,其中包括串口通信(RS232、RS485)、SPI 和 I2C 等多種串行通信協(xié)議。USART 在 STM32 中有多個實例,包括 USART1、USART2 等,其特性和功能也不完全相同。

在發(fā)送數(shù)據(jù)時,USART 需要使用 TXE 和 TC 標志位。TXE 表示數(shù)據(jù)寄存器空,表示 USART 數(shù)據(jù)發(fā)送寄存器中的數(shù)據(jù)已被全部發(fā)送出去,可以直接寫入新的數(shù)據(jù)。TC 標志表示傳輸完成,表示 USART 發(fā)送完全部數(shù)據(jù),且寄存器都為空。

下面我們來看一下 STM32 的 USART 發(fā)送數(shù)據(jù)時如何使用 TXE 和 TC 標志位。

1.USART 數(shù)據(jù)寄存器有兩種模式:8 位模式和 9 位模式。如果使用 8 位模式發(fā)送數(shù)據(jù),則每次發(fā)送數(shù)據(jù)將用一個 8 位的數(shù)據(jù)寄存器。

2.如果使用 9 位模式發(fā)送數(shù)據(jù),每次發(fā)送的數(shù)據(jù)將使用兩個寄存器:數(shù)據(jù)寄存器和控制寄存器。數(shù)據(jù)寄存器用于存儲 8 位的數(shù)據(jù),而控制寄存器的最高位(第9 位)用于存儲數(shù)據(jù)的第 9 位。

3.在發(fā)送數(shù)據(jù)之前需要配置 USART 的一些參數(shù),例如波特率、數(shù)據(jù)位數(shù)、停止位等。在配置完成后,可以使用 USART_SendData 函數(shù)向數(shù)據(jù)寄存器寫入數(shù)據(jù)。函數(shù)原型如下:

void USART_SendData(USART_TypeDef* USARTx, uint16_t Data)

其中,USARTx 為 USART 模塊的實例,Data 為要發(fā)送的數(shù)據(jù)。由于 STM32 采用的是 Little-Endian 模式,因此在 9 位模式下,Data 的后 8 位會被寫入到數(shù)據(jù)寄存器中,而前一位則會被寫入到控制寄存器的最高位中。

4.當(dāng)數(shù)據(jù)寄存器中的數(shù)據(jù)已被全部發(fā)送出去時,TXE 標志位會被置為 1,此時可以直接寫入新的數(shù)據(jù)。因此,可以使用 while 循環(huán)來判斷 TXE 標志位是否被置為 1,一旦被置為 1,就可以調(diào)用 USART_SendData 函數(shù)發(fā)送下一組數(shù)據(jù)。代碼如下:

while (USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);

USART_SendData(USARTx, Data);

其中,USARTx 為 USART 模塊的實例,Data 為要發(fā)送的數(shù)據(jù)。

5.在發(fā)送完全部數(shù)據(jù)后,TC 標志位會被置為 1,此時表示數(shù)據(jù)全部發(fā)送完成??梢允褂?while 循環(huán)來等待 TC 標志位被置位為 1,以便確認數(shù)據(jù)發(fā)送是否成功。代碼如下:

while (USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET);

6.串口發(fā)送數(shù)據(jù)時還需要注意的是,如果發(fā)送的數(shù)據(jù)過于頻繁,會導(dǎo)致 USART TX 緩沖區(qū)溢出。因此,在每次發(fā)送之前需要判斷 USART 的 TX 緩沖區(qū)是否為空,只有當(dāng) TX 緩沖區(qū)為空時才能進行下一次發(fā)送??梢允褂?USART_GetFlagStatus 函數(shù)來判斷 TXE 標志位是否被置位為 1。

以上就是 STM32 的 USART 發(fā)送數(shù)據(jù)時如何使用 TXE 和 TC 標志位的詳細介紹。在實際開發(fā)中,需要根據(jù)具體的硬件和應(yīng)用環(huán)境進行針對性設(shè)置和調(diào)整,才能保證 USART 的正常工作和數(shù)據(jù)傳輸?shù)姆€(wěn)定性。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • RS485
    +關(guān)注

    關(guān)注

    39

    文章

    1135

    瀏覽量

    82071
  • STM32
    +關(guān)注

    關(guān)注

    2264

    文章

    10854

    瀏覽量

    354296
  • 數(shù)據(jù)寄存器

    關(guān)注

    0

    文章

    33

    瀏覽量

    7736
  • USART
    +關(guān)注

    關(guān)注

    1

    文章

    195

    瀏覽量

    30760
收藏 人收藏

    評論

    相關(guān)推薦

    TC399 UART能夠接收數(shù)據(jù),但無法發(fā)送任何數(shù)據(jù),為什么?

    傳輸數(shù)據(jù)。 我能夠接收數(shù)據(jù),但無法發(fā)送任何數(shù)據(jù)。 我用示波器監(jiān)測了 TX 引腳,它始終保持在 VDD 電平。 目前,我使用以下步驟來初始化 ASCLIN 模塊和
    發(fā)表于 05-21 06:48

    stm32的modbus.c文件,如何觸發(fā)串口發(fā)送中斷?

    1, USART_IT_TC, DISABLE);這個函數(shù),使能發(fā)送中斷后,會發(fā)送個空白幀?從而引發(fā)第一次串口發(fā)送中斷. 所以說,這個函數(shù)應(yīng)該作為個串口
    發(fā)表于 05-10 06:50

    做一個STM8 UART半雙工,測試發(fā)現(xiàn)數(shù)據(jù)發(fā)送和回發(fā)不穩(wěn)定,怎么解決?

    各位大俠: 最近做一個STM8 UART半雙工,發(fā)送自定義協(xié)議控制下位控制器,控制器正常有答復(fù),測試發(fā)現(xiàn)數(shù)據(jù)發(fā)送和回發(fā)不穩(wěn)定, 考慮綜合利用TXE
    發(fā)表于 04-30 06:45

    stm32F407 USART發(fā)送數(shù)據(jù)TC不能置位是怎么回事?

    )//原因:SR寄存器值為0x80,TXE置位,但此時TC沒有置位,移位寄存器數(shù)據(jù)沒有發(fā)送完成 { bitstatus = SET; } else { bitstatus = RE
    發(fā)表于 04-25 06:15

    USART3用DMA發(fā)送只能發(fā)送一次是什么原因?qū)е碌模?/a>

    USART, 配置完畢 USART_Cmd(USART3, ENABLE);//使能或失能USART USART_ClearFlag(
    發(fā)表于 04-19 08:21

    STM32F103C8T6發(fā)送數(shù)據(jù)正常,但是數(shù)據(jù)數(shù)據(jù)之間的間隔太長了,為什么

    ((USART_GetFlagStatus(SC_USART, USART_FLAG_TC) == RESET) ) { Counter++; } 代碼如上,發(fā)送
    發(fā)表于 04-17 07:35

    STM32CubeMX用FreeRTOS+DMA操縱usart發(fā)送數(shù)據(jù)為什么失?。?/a>

    不用用FreeRTOS時,DMA操縱usart可以正常發(fā)送數(shù)據(jù); 用FreeRTOS,不用DMA直接用usart也可以正常發(fā)送
    發(fā)表于 04-15 08:16

    STM8S105K6使用串口中斷發(fā)送,如何清發(fā)送完成中斷TXE?

    中斷,給出的解決方案是UART2_SendData8() or UART2_SendData9(),寫數(shù)據(jù)的方式。單帶來的問題是,實際發(fā)送數(shù)據(jù)時,我的最后一個字節(jié)發(fā)送完了怎么辦,沒發(fā)清
    發(fā)表于 04-11 08:23

    STM8S串口中斷TXETC有什么區(qū)別?

    STM8S單片機和發(fā)送相關(guān)的中斷有兩個:TXE 發(fā)送數(shù)據(jù)寄存器孔 TC 發(fā)送完成 我們編程時,采
    發(fā)表于 04-11 06:52

    STM8S105C6T6 UART2串口能接收數(shù)據(jù),不能發(fā)送數(shù)據(jù)是為什么?

    (UART2_FLAG_TXE)==RESET)); //待發(fā)送寄存器為空 UART2_SendData8(Data); while((UART2_GetFlagStatus(UART2_FLAG_TC)==RESET
    發(fā)表于 04-10 08:05

    stm32g070怎么可以讓usart3串口可以自動接收自己發(fā)出的數(shù)據(jù)

    usart3:沒有開啟DMA模式,開啟此功能必須使能timer1,而且中斷發(fā)送數(shù)據(jù)時,總是產(chǎn)生idle故障標志。且總是接收到自己發(fā)出的數(shù)據(jù)。
    發(fā)表于 03-28 06:53

    使用STM32G030接收和發(fā)送RS485的數(shù)據(jù),接收數(shù)據(jù)錯誤的原因?

    );//等待串口舊數(shù)據(jù)發(fā)送完成 LL_USART_TransmitData8(USART1,newData);//數(shù)據(jù)從串口
    發(fā)表于 03-26 06:55

    STM32F401使用USART6時不正常,發(fā)送HELLO WORLD為亂碼怎么解決?

    各位大神: 我用STM32F401 進行串口通信,UASRT1跟UASRT2使用正常,使用USART6時不正常,發(fā)送HELLO WORLD為亂碼怎么破? 代碼如下: main
    發(fā)表于 03-22 06:18

    STM32F405 uart DMA收發(fā)數(shù)據(jù)輸出亂碼怎么解決?

    *p_buffer, uint32_t g_len ){while( !LL_USART_IsActiveFlag_TXE( USART2 ) );LL_DMA_ClearFlag_TC6( DMA1
    發(fā)表于 03-08 07:38

    ROS主控讀取stm32發(fā)送數(shù)據(jù)

    ROS主控讀取stm32發(fā)送數(shù)據(jù) 之后便可以通過 Stm32_Serial .read (Receive_Data_Pr,sizeof(Receive_Data_Pr)); read
    的頭像 發(fā)表于 11-26 17:49 ?985次閱讀