那曲檬骨新材料有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

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

3天內不再提示

STM32的USART發送數據時如何使用TXE和TC標志呢?

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

STM32的USART發送數據時如何使用TXE和TC標志呢?

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

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

下面我們來看一下 STM32 的 USART 發送數據時如何使用 TXE 和 TC 標志位。

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

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

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

void USART_SendData(USART_TypeDef* USARTx, uint16_t Data)

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

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

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

USART_SendData(USARTx, Data);

其中,USARTx 為 USART 模塊的實例,Data 為要發送的數據。

5.在發送完全部數據后,TC 標志位會被置為 1,此時表示數據全部發送完成。可以使用 while 循環來等待 TC 標志位被置位為 1,以便確認數據發送是否成功。代碼如下:

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

6.串口發送數據時還需要注意的是,如果發送的數據過于頻繁,會導致 USART TX 緩沖區溢出。因此,在每次發送之前需要判斷 USART 的 TX 緩沖區是否為空,只有當 TX 緩沖區為空時才能進行下一次發送。可以使用 USART_GetFlagStatus 函數來判斷 TXE 標志位是否被置位為 1。

以上就是 STM32 的 USART 發送數據時如何使用 TXE 和 TC 標志位的詳細介紹。在實際開發中,需要根據具體的硬件和應用環境進行針對性設置和調整,才能保證 USART 的正常工作和數據傳輸的穩定性。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • RS485
    +關注

    關注

    39

    文章

    1165

    瀏覽量

    82603
  • STM32
    +關注

    關注

    2272

    文章

    10924

    瀏覽量

    357608
  • 數據寄存器
    +關注

    關注

    0

    文章

    33

    瀏覽量

    7795
  • USART
    +關注

    關注

    1

    文章

    195

    瀏覽量

    30977
收藏 人收藏

    評論

    相關推薦

    TC399 UART能夠接收數據,但無法發送任何數據,為什么?

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

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

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

    做一個STM8 UART半雙工,測試發現數據發送和回發不穩定,怎么解決?

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

    stm32F407 USART發送數據TC不能置位是怎么回事?

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

    USART3用DMA發送只能發送一次是什么原因導致的?

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

    STM32F103C8T6發送數據正常,但是數據數據之間的間隔太長了,為什么

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

    STM32F103RCT6的USART1不能接收多字節數據是什么原因導致的?

    用串口助手手動發送和1秒一次的定時發送時,STM32F103RCT6能完整地接收到15個字節的數據。 用串口助循環發送時,與延時有關。500
    發表于 04-17 06:35

    STM32CubeMX用FreeRTOS+DMA操縱usart發送數據為什么失敗?

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

    STM8S105K6使用串口中斷發送,如何清發送完成中斷TXE

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

    STM8S串口中斷TXETC有什么區別?

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

    STM8S105C6T6 UART2串口能接收數據,不能發送數據是為什么?

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

    stm32g070怎么可以讓usart3串口可以自動接收自己發出的數據

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

    使用STM32G030接收和發送RS485的數據,接收數據錯誤的原因?

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

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

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

    STM32F405 uart DMA收發數據輸出亂碼怎么解決?

    *p_buffer, uint32_t g_len ){while( !LL_USART_IsActiveFlag_TXE( USART2 ) );LL_DMA_ClearFlag_TC6( DMA1
    發表于 03-08 07:38
    大化| 澳门百家乐官网有没有假| 百家乐官网网页游戏| 幸运水果机下载| 百家乐官网平台要多少钱| 百家乐官网下对子的概率| 百家乐模拟分析程序| 德州扑克边池| 百家乐官网三遍| 网上百家乐真坑人| 百家乐官网教父方法| 百家乐微心打法| 安徽棋牌游戏中心| 赌百家乐官网的计划跟策略| 威尼斯人娱乐老牌网站| 实战百家乐官网博彩正网| 怎样玩百家乐看路| 琼海市| 百家乐博之道娱乐城| 太阳城77scs| 线上百家乐可靠吗| 皇冠网h| 海立方百家乐客户端| 金昌市| 百家乐知识技巧玩法| 山西省| 视频百家乐官网试玩| 百家乐桌布动物| 奔驰百家乐官网游戏电玩| 全讯网官网| 太原百家乐官网的玩法技巧和规则 | 百家乐赌场怎么玩| 百家乐官网技巧阅读| 百家乐推锅| 百家乐官网棋牌游戏皇冠网| 梦幻城百家乐的玩法技巧和规则 | 八大胜百家乐官网现金网| 百家乐官网入庄闲概率| 大发888 赌博网站| 百家乐官网园qq群| 璧山县|