RM新时代网站-首页

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

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

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

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

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

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

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

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

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

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

2.如果使用 9 位模式發(fā)送數(shù)據(jù),每次發(fā)送的數(shù)據(jù)將使用兩個(gè)寄存器:數(shù)據(jù)寄存器和控制寄存器。數(shù)據(jù)寄存器用于存儲(chǔ) 8 位的數(shù)據(jù),而控制寄存器的最高位(第9 位)用于存儲(chǔ)數(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 模塊的實(shí)例,Data 為要發(fā)送的數(shù)據(jù)。由于 STM32 采用的是 Little-Endian 模式,因此在 9 位模式下,Data 的后 8 位會(huì)被寫入到數(shù)據(jù)寄存器中,而前一位則會(huì)被寫入到控制寄存器的最高位中。

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

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

USART_SendData(USARTx, Data);

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

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

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

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

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

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

    關(guān)注

    39

    文章

    1156

    瀏覽量

    82291
  • STM32
    +關(guān)注

    關(guān)注

    2270

    文章

    10895

    瀏覽量

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

    關(guān)注

    0

    文章

    33

    瀏覽量

    7750
  • USART
    +關(guān)注

    關(guān)注

    1

    文章

    195

    瀏覽量

    30835
收藏 人收藏

    評論

    相關(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);這個(gè)函數(shù),使能發(fā)送中斷后,會(huì)發(fā)送個(gè)空白幀?從而引發(fā)第一次串口發(fā)送中斷. 所以說,這個(gè)函數(shù)應(yīng)該作為個(gè)串口
    發(fā)表于 05-10 06:50

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

    各位大俠: 最近做一個(gè)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置位,但此時(shí)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

    STM32F103RCT6的USART1不能接收多字節(jié)數(shù)據(jù)是什么原因?qū)е碌模?/a>

    用串口助手手動(dòng)發(fā)送和1秒一次的定時(shí)發(fā)送時(shí),STM32F103RCT6能完整地接收到15個(gè)字節(jié)的數(shù)據(jù)。 用串口助循環(huán)發(fā)送時(shí),與延時(shí)有關(guān)。500
    發(fā)表于 04-17 06:35

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

    不用用FreeRTOS時(shí),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ù)的方式。單帶來的問題是,實(shí)際發(fā)送數(shù)據(jù)時(shí),我的最后一個(gè)字節(jié)發(fā)送完了怎么辦,沒發(fā)清
    發(fā)表于 04-11 08:23

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

    STM8S單片機(jī)和發(fā)送相關(guān)的中斷有兩個(gè):TXE 發(fā)送數(shù)據(jù)寄存器孔 TC 發(fā)送完成 我們編程時(shí),采
    發(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串口可以自動(dòng)接收自己發(fā)出的數(shù)據(jù)

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

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

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

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

    各位大神: 我用STM32F401 進(jìn)行串口通信,UASRT1跟UASRT2使用正常,使用USART6時(shí)不正常,發(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
    RM新时代网站-首页