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

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

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

STM32基礎(chǔ)知識:串口通信-輪詢方式

CHANBAEK ? 來源:上下求索電子er ? 作者:上下求索電子er ? 2023-10-25 15:23 ? 次閱讀

串口通信-輪詢方式

1 串口通信概述

1.1 計算機通信的基本概念

計算機通信: 將計算機技術(shù)和通信技術(shù)相結(jié)合,完成計算機與外部設(shè)備或計算機與計算機之間的信息交換。按照數(shù)據(jù)傳輸方式的不同,可以分為串行通信和并行通信兩類。

圖片

串行通信: 數(shù)據(jù)逐位傳輸,傳輸線少,長距離傳輸時成本低,但數(shù)據(jù)的傳輸控制較復(fù)雜。按照實現(xiàn)數(shù)據(jù)同步的方式,可以分為同步串行和異步串行兩種。

  • 同步串行通信: 數(shù)據(jù)傳輸以數(shù)據(jù)塊(一組字符)為單位,在一個數(shù)據(jù)塊內(nèi),字符與字符間無間隔,收發(fā)雙方依靠獨立的時鐘線進行信號的同步。
    圖片
  • 異步串行通信: 數(shù)據(jù)傳輸以單個字符為單位,字符和字符之間的間隙任意,字符內(nèi)部每一位持續(xù)的時間相同。收發(fā)雙方?jīng)]有專門的時鐘信號,而是依靠事先約定的字符格式和通信速率來完成通信適用于大批量的數(shù)據(jù)傳輸。
    圖片

并行通信: 多位數(shù)據(jù)同時傳輸,傳輸控制簡單,傳輸速度快,但是在長距離傳輸時硬件成本較高。

1.2 異步串行通信

異步通信的兩個關(guān)鍵點是字符格式波特率 ,字符格式?jīng)Q定了數(shù)據(jù)的傳輸形式,波特率決定了字符中每一位數(shù)據(jù)的持續(xù)時間。

字符格式

圖片

? 1 位起始位,規(guī)定為低電平;
? 5~8 位數(shù)據(jù)位,即要傳送的有效信息;
? 1 位奇偶校驗位;
? 1~2 位停止位,規(guī)定為高電平。

常用字符格式:1位起始位,8位數(shù)據(jù)位,無奇偶校驗,1位停止位

圖片

傳輸時低位在前,高位在后,上圖發(fā)送數(shù)據(jù)為0xE9。

通信速率

波特率:每秒鐘傳送二進制數(shù)碼的位數(shù),以bit/s(bps)為單位。

常用的波特率有:9600、19200、38400、57600和115200;

波特率為115200,表示每秒傳輸115200位,且每一位數(shù)據(jù)在數(shù)據(jù)線上持續(xù)時間為Tbit= 1/115200 ≈ 8.68us

異步串行通信的數(shù)據(jù)接收過程

圖片

接收過程的本質(zhì)是數(shù)據(jù)采樣,假設(shè)接收端的采樣時鐘是波特率的16倍。

① 接收過程由起始位的下降沿啟動;
② 接收端等待8個時鐘周期,以便建立一個接近比特周期中間的采樣點;
③ 接收端等待16個時鐘周期,使其進入第一個數(shù)據(jù)位周期的中點;
④ 第一個數(shù)據(jù)位被采樣并存儲在接收寄存器中;
⑤ 串口模塊在采樣第二個數(shù)據(jù)位之前等待另外16個時鐘周期;
⑥ 重復(fù)此過程,直到所有數(shù)據(jù)位都被采樣和存儲;
⑦ 由停止位的上升沿使數(shù)據(jù)線返回到空閑狀態(tài)。

串口通信的數(shù)據(jù)傳輸方向

圖片

錯誤校驗方式

  • 奇偶校驗:奇校驗表示數(shù)據(jù)中“1”的個數(shù)與校驗位“1”的個數(shù)之和為奇數(shù);偶校驗表示數(shù)據(jù)中“1”的個數(shù)與校驗位“1”的個數(shù)之和為偶數(shù)。
  • 代碼和校驗:發(fā)送方將所發(fā)數(shù)據(jù)塊求和,產(chǎn)生一個字節(jié)的校驗字符附加到數(shù)據(jù)塊末尾。接收方采用同樣方式進行檢測。
  • 循環(huán)冗余校驗:通過某種數(shù)學(xué)運算實現(xiàn)有效信息與校驗位之間的循環(huán)校驗,常用于磁盤信息的傳輸、存儲區(qū)的完整性校驗等。

2 STM32串口通信

2.1 串口收發(fā)單元

圖片

串口收發(fā)單元主要利用數(shù)據(jù)寄存器DR,發(fā)送引腳TX,接收引腳RX,以及三個通信狀態(tài)位TXE、TC和RXNE來完成數(shù)據(jù)的接收和發(fā)送。

  • TXE:發(fā)送數(shù)據(jù)寄存器空標志。當TDR寄存器的內(nèi)容已經(jīng)傳送到發(fā)送移位寄存器 時,該位由硬件置1。如果串口控制寄存器CR1中的TXEIE位為1,將會觸發(fā)發(fā)送數(shù)據(jù)寄存器空中斷。注意:當TXE置1時,數(shù)據(jù)有可能還在發(fā)送。
  • TC:發(fā)送完成標志。當發(fā)送移位寄存器的內(nèi)容發(fā)送完成,同時TDR寄存器也為 空時,該位由硬件置1,表示本次數(shù)據(jù)傳輸已經(jīng)完成。如果串口控制寄存器CR1中的TCIE位為1,將會觸發(fā)發(fā)送完成中斷。注意:當TC置1時,數(shù)據(jù)才是真正地發(fā)送完成。
  • RXNE:接收數(shù)據(jù)寄存器不為空標志。當移位寄存器的內(nèi)容已經(jīng)傳送到接收數(shù)據(jù)寄存器RDR時,該位由硬件置1。如果串口控制寄存器CR1中的RXNEIE位為1,將會觸發(fā)接收數(shù)據(jù)寄存器不為空中斷。

數(shù)據(jù)寄存器DR在硬件上分為TDR和RDR兩個寄存器,通過數(shù)據(jù)的流向進行區(qū)分,在結(jié)構(gòu)設(shè)計上采用了雙緩沖結(jié)構(gòu);

發(fā)送時,數(shù)據(jù)通過數(shù)據(jù)總線送入TDR寄存器,然后傳送到發(fā)送移位寄存器完成數(shù)據(jù)轉(zhuǎn)換,從并行數(shù)據(jù)轉(zhuǎn)為串行數(shù)據(jù),最后通過TX引腳發(fā)送;

接收時,數(shù)據(jù)通過RX引腳逐位送入接收移位寄存器,8位數(shù)據(jù)接收完成后,送入RDR寄存器,供用戶讀取。

USB轉(zhuǎn)TTL串口模塊

圖片

2.2 串口的數(shù)據(jù)類型定義

①外設(shè)句柄的定義:

HAL庫在結(jié)構(gòu)上,對每個外設(shè)抽象成了一個稱為ppp_HandleTypeDef的結(jié)構(gòu)體,其中ppp就是每個外設(shè)的名字。所有的函數(shù)都是工作在ppp_HandleTypeDef指針之下。

例如,使用USART2時,可以定義USART初始化結(jié)構(gòu)體變量(全局變量)huart2。

UART_HandleTypeDef huart2;

huart2就被稱為串口的句柄,它被貫穿整個USART收發(fā)的流程。

②外設(shè)句柄數(shù)據(jù)類型的組成:

圖片

圖片

③串口初始化數(shù)據(jù)類型:

圖片

成員變量WordLength的取值范圍

宏常量定義含義
UART_WORDLENGTH_8B數(shù)據(jù)位長度為8位
UART_WORDLENGTH_9B數(shù)據(jù)位長度為9位

成員變量StopBits的取值范圍

宏常量定義含義
UART_STOPBITS_1停止位長度為1位
UART_STOPBITS_2停止位長度為2位

成員變量Parity的取值范圍

宏常量定義含義
UART_PARITY_NONE無奇偶校驗
UART_PARITY_EVEN偶校驗
UART_PARITY_ODD奇校驗

成員變量Mode的取值范圍

宏常量定義含義
UART_MODE_RX串口僅處于接收模式,只能接收數(shù)據(jù),不能發(fā)送數(shù)據(jù)
UART_MODE_TX串口僅處于發(fā)送模式,只能發(fā)送數(shù)據(jù),不能接收數(shù)據(jù)
UART_MODE_TX_RX串口處于接收和發(fā)送模式,可以同時收發(fā)數(shù)據(jù)

成員變量HwFlowCtI的取值范圍

宏常量定義含義
UART_HWCONTROL_NONE無硬件流控
UART_HWCONTROL_RTS使能“請求發(fā)送(RTS)”引腳
UART_HWCONTROL_CTS使能“允許發(fā)送(CTS)”引腳
UART_HWCONTROL_RTS_CTS使能“請求發(fā)送(RTS)”和“允許發(fā)送(CTS)引腳

成員變量OverSampling的取值范圍

宏常量定義含義
UART_OVERSAMPLING_16采樣頻率是信號傳輸頻率的16倍
UART_OVERSAMPLING_8采樣頻率是信號傳輸頻率的8倍

2.3 外設(shè)初始化設(shè)計思想

圖片

①串口初始化過程:

圖片

抽象—串口初始化函數(shù)MX_USART2_UART_Init 將與MCU無關(guān)的通信參數(shù)存入句柄結(jié)構(gòu) + 使用HAL_UART_Init執(zhí)行串口初始化操作,將句柄參數(shù)寫入寄存器。

HAL_UART_Init 干了哪些事?

  • 調(diào)用 HAL_UART_MspInit
  • 修改狀態(tài)忙
  • 配置寄存器
  • 清除標志位

圖片

承載—與MCU相關(guān)的初始化函數(shù)HAL_UART_MspInit :時鐘初始化 + 引腳初始化

圖片

3 串口通信方式

  • 輪詢方式:CPU不斷檢測串口的狀態(tài)標志來判斷數(shù)據(jù)收發(fā)的情況。特點:程序設(shè)計簡單,但CPU在檢測標志位期間,無法執(zhí)行其他任務(wù),CPU利用率較低。
  • 中斷方式:使能中斷后,接收一字節(jié)數(shù)據(jù)或發(fā)送一字節(jié)后申請中斷,在ISR中完成后續(xù)處理。在數(shù)據(jù)收發(fā)期間,CPU可以執(zhí)行其他任務(wù),CPU利用率較高。
  • DMA方式:初始化時設(shè)置相關(guān)參數(shù),啟動DMA傳輸后,數(shù)據(jù)傳輸過程不需要CPU的干預(yù)。傳輸完成后,再產(chǎn)生DMA中斷,由CPU進行后續(xù)處理。傳輸效率最高。

4 輪詢方式的串口通信 ##

  1. 串口初始化函數(shù):HAL_UART_Init

    函數(shù)原型HAL StatusTypeDef HAL_UART_Init (UART_HandleTypeDef *huart)
    功能描述按照串口句柄中指定的參數(shù)初始化串口
    入口參數(shù)huart:串口句柄的地址
    返回值HAL狀態(tài)值:HAL_OK表示初始化成功,HAL_ERROR表示初始化失敗
    注意事項1.該函數(shù)將調(diào)用與MCU相關(guān)的初始化函數(shù)HAL_UART_Msplnit完成時鐘、引腳和中斷等底層硬件的初始化操作2.該函數(shù)由CubeMX自動生成
  2. 接口函數(shù):HAL_UART_Transmit

    函數(shù)原型HAL_StatusTypeDef HAL_UART_Transmit(UART_Handle TypeDef *huart, uint 8_t *pData, uint 16_t Size, uint 32_t Timeout)
    功能描述在輪詢方式下發(fā)送一定數(shù)量的數(shù)據(jù)
    入口參數(shù)1huart:串口句柄的地址
    入口參數(shù)pData:待發(fā)送數(shù)據(jù)的首地址
    入口參數(shù)3Size:待發(fā)送數(shù)據(jù)的個數(shù)
    入口參數(shù)4Timeout:超時等待時間, 以ms為單位, HAL MAX DELAY表示無限等待
    返回值HAL狀態(tài)值:HAL_OK表示發(fā)送成功;HAL_ERROR表示參數(shù)錯誤;HAL_BUSY表示串口被占用;HAL_TIMEOUT表示發(fā)送超時
    注意事項1.該函數(shù)連續(xù)發(fā)送數(shù)據(jù),發(fā)送過程中通過判斷TXE標志來發(fā)送下一個數(shù)據(jù),通過判斷TC標志來結(jié)束數(shù)據(jù)的發(fā)送2.如果在等待時間內(nèi)沒有完成發(fā)送,則不再發(fā)送,返回超時標志3.該函數(shù)由用戶調(diào)用
  3. 接口函數(shù):HAL_UART_Receive

    函數(shù)原型HAL_StatusTypeDef HAL_UART_Receive(UART_Handle TypeDef *huart, uint 8_t *pData, uint 16_t Size, uint 32_t Timeout)
    功能描述在輪詢方式下接收一定數(shù)量的數(shù)據(jù)
    入口參數(shù)1huart:串口句柄的地址
    入口參數(shù)pData:存放數(shù)據(jù)的首地址
    入口參數(shù)3Size:待接收數(shù)據(jù)的個數(shù)
    入口參數(shù)4Timeout:超時等待時間, 以ms為單位, HAL MAX DELAY表示無限等待
    返回值HAL狀態(tài)值:HAL_OK表示發(fā)送成功;HAL_ERROR表示參數(shù)錯誤;HAL_BUSY表示串口被占用;HAL_TIMEOUT表示發(fā)送超時
    注意事項1.該函數(shù)連續(xù)接收數(shù)據(jù),接收過程中通過判斷RXNE標志來發(fā)送下一個數(shù)據(jù)2.如果在等待時間內(nèi)沒有完成接收,則不再接收,返回超時標志3.該函數(shù)由用戶調(diào)用

5 任務(wù)實踐1

在PC上利用串口調(diào)試助手發(fā)送數(shù)據(jù)到MCU,MCU調(diào)用scanf函數(shù)讀取數(shù)據(jù),然后調(diào)用printf函數(shù)發(fā)送應(yīng)答信息到PC。

  1. 串口外設(shè)配置
    圖片

    • 異步模式,無硬件流控
    • 設(shè)置通信參數(shù):波特率115200,8位數(shù)據(jù)位,無奇偶校驗,1位停止位,使能接收和發(fā)送,16倍過采樣(CubeMX默認配置)
  2. Keil中勾選Use MicroLIB
    圖片

  3. 編寫代碼
    printf和scanf重定向

    /* USER CODE BEGIN Includes */
    #include < stdio.h >
    /* USER CODE END Includes */
    
    int fputc (int ch, FILE *f)
    {
        HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, HAL_MAX_DELAY);
        return ch;
    }
    int fgetc(FILE *f)
    {
        uint8_t ch = 0;
        HAL_UART_Receive(&huart1, (uint8_t *)&ch, 1, HAL_MAX_DELAY);
        return ch;
    }
    /* USER CODE END 4 */
    

    用戶應(yīng)用代碼——猜數(shù)游戲

    /* USER CODE BEGIN 3 */
        printf("Please guess a number between 0 to 9n");
        if (scanf("%d", &guess_num) == 1)
        {
          if (guess_num == ans)
          {
            printf("You are right! It's %dn", ans);
          }
          else
          {
            printf("You are wrong! It is not %dn", guess_num);
          }
        }
      }
      /* USER CODE END 3 */
    

    實驗現(xiàn)象

    圖片

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

    關(guān)注

    31

    文章

    5253

    瀏覽量

    119205
  • 計算機
    +關(guān)注

    關(guān)注

    19

    文章

    7174

    瀏覽量

    87158
  • STM32
    +關(guān)注

    關(guān)注

    2258

    文章

    10828

    瀏覽量

    352494
  • 串口通信
    +關(guān)注

    關(guān)注

    34

    文章

    1601

    瀏覽量

    55235
  • 異步串行通信
    +關(guān)注

    關(guān)注

    0

    文章

    15

    瀏覽量

    8393
收藏 人收藏

    評論

    相關(guān)推薦

    QT串口通信的簡單使用

    QT串口通信是上位機和下位機通信常用的通信方式, 也是學(xué)習(xí)QT必須學(xué)會的基礎(chǔ)知識, 這篇就簡單介
    的頭像 發(fā)表于 01-15 09:27 ?1411次閱讀
    QT<b class='flag-5'>串口</b><b class='flag-5'>通信</b>的簡單使用

    CAN通信基礎(chǔ)知識

    記錄一下,方便以后翻閱~主要內(nèi)容:1)CAN通信基礎(chǔ)知識;2)STM32 CAN控制器簡介;3)相關(guān)實驗代碼解讀。參考資料:《STM32中文參考手冊_V10》第22章——控制器局域網(wǎng)(
    發(fā)表于 08-19 08:24

    USART串口基礎(chǔ)知識

    第29章 STM32H7的USART串口基礎(chǔ)知識和HAL庫API本章節(jié)為大家講解USART(Universal synchronous asynchronous receiver transmitter,通用同步異步收發(fā)器)的
    發(fā)表于 08-20 08:05

    串口通信基礎(chǔ)知識點匯總,不看肯定后悔

    串口通信基礎(chǔ)知識點匯總,不看肯定后悔
    發(fā)表于 12-03 06:47

    STM32串口通信基礎(chǔ)知識點匯總,不看肯定后悔

    STM32串口通信基礎(chǔ)知識點匯總,不看肯定后悔
    發(fā)表于 12-03 08:03

    串口基礎(chǔ)知識點匯總

    串行口一串口基礎(chǔ)知識串口概念串行接口(Serial port)"同步/異步串行接收/發(fā)送器。"又稱“串口”USART,也稱串行通信接口(通常
    發(fā)表于 02-23 07:27

    通信基礎(chǔ)知識教程

    通信基礎(chǔ)知識 1、電信基礎(chǔ)知識2、通信電源技術(shù)3、配線設(shè)備結(jié)構(gòu)、原理與防護4、防雷基礎(chǔ)知識5、EMC
    發(fā)表于 03-04 16:48 ?33次下載

    51單片機串口通信的一些基礎(chǔ)知識免費下載

    本文檔的主要內(nèi)容詳細介紹的是51單片機串口通信的一些基礎(chǔ)知識免費下載。
    發(fā)表于 08-21 17:31 ?5次下載
    51單片機<b class='flag-5'>串口</b><b class='flag-5'>通信</b>的一些<b class='flag-5'>基礎(chǔ)知識</b>免費下載

    STM32】基于cubemx+HAL庫的串口實驗(一)

    stm32串口實驗一、實驗前準備二、具體項目代碼項目1:printf重定向?qū)嶒灒?b class='flag-5'>輪詢方式通信重定向:輪詢
    發(fā)表于 12-09 13:06 ?3次下載
    【<b class='flag-5'>STM32</b>】基于cubemx+HAL庫的<b class='flag-5'>串口</b>實驗(一)

    STM32實戰(zhàn)-串口通信方式匯總

    STM32實戰(zhàn)-串口通信方式匯總1.串口基本概念2.串口發(fā)送3.
    發(fā)表于 12-14 18:39 ?3次下載
    <b class='flag-5'>STM32</b>實戰(zhàn)-<b class='flag-5'>串口</b><b class='flag-5'>通信</b><b class='flag-5'>方式</b>匯總

    串口通信基礎(chǔ)知識詳解

    目錄通信基礎(chǔ)知識STM32串口通信基礎(chǔ)(UART)串口通信
    發(fā)表于 12-20 19:20 ?14次下載
    <b class='flag-5'>串口</b><b class='flag-5'>通信</b><b class='flag-5'>基礎(chǔ)知識</b>詳解

    STM32中的串口通信基礎(chǔ)知識

    目錄串口通信基本原理并行通信與串行通信串行通信中單工,半雙工和全雙工的區(qū)別按通信
    發(fā)表于 12-24 18:37 ?4次下載
    <b class='flag-5'>STM32</b>中的<b class='flag-5'>串口</b><b class='flag-5'>通信</b>的<b class='flag-5'>基礎(chǔ)知識</b>

    STM32 HAL庫開發(fā)學(xué)習(xí)筆記: USART1串口通訊(中斷方式) IDE-STM32CubeIDE

    STM32串口通訊有三種方式,分別為阻塞(輪詢)、中斷、DMA。串口模式和配置 源代碼編寫
    發(fā)表于 12-24 18:52 ?19次下載
    <b class='flag-5'>STM32</b> HAL庫開發(fā)學(xué)習(xí)筆記: USART1<b class='flag-5'>串口</b>通訊(中斷<b class='flag-5'>方式</b>) IDE-<b class='flag-5'>STM32</b>CubeIDE

    第三節(jié): 串口通信(用CubeMX學(xué)習(xí)STM32)

    用CubeMX學(xué)習(xí)STM32, 串口通信學(xué)習(xí), 通過輪詢方式和中斷方式兩種
    發(fā)表于 12-27 18:46 ?8次下載
    第三節(jié): <b class='flag-5'>串口</b><b class='flag-5'>通信</b>(用CubeMX學(xué)習(xí)<b class='flag-5'>STM32</b>)

    STM32串口通信簡明知識

    STM32串口通信簡明知識
    的頭像 發(fā)表于 10-25 15:48 ?1159次閱讀
    <b class='flag-5'>STM32</b><b class='flag-5'>串口</b><b class='flag-5'>通信簡明知識</b>