從原理圖PCB到移植RTOS【細說STM32】【四】UART

2021-02-20 硬體十萬個為什麼

一、UART是什麼

UART是通用異步收發傳輸器(Universal Asynchronous Receiver/Transmitter),通常稱作UART,是一種異步收發傳輸器,是設備間進行異步通信的關鍵模塊。UART負責處理數據總線和串行口之間的串/並、並/串轉換,並規定了幀格式;通信雙方只要採用相同的幀格式和波特率,就能在未共享時鐘信號的情況下,僅用兩根信號線(Rx 和Tx)就可以完成通信過程,因此也稱為異步串行通信。

若加入一個合適的電平轉換器,如SP3232E、SP3485,UART 還能用於RS-232、RS-485 通信,或與計算機的埠連接。UART 應用非常廣泛,手機、工業控制、PC 等應用中都要用到UART。

UART使用的是 異步,串行通信。
    串行通信是指利用一條傳輸線將資料一位位地順序傳送。特點是通信線路簡單,利用簡單的線纜就可實現通信,降低成本,適用於遠距離通信,但傳輸速度慢的應用場合。
    異步通信以一個字符為傳輸單位,通信中兩個字符間的時間間隔多少是不固定的,然而在同一個字符中的兩個相鄰位間的時間間隔是固定的。 
    數據傳送速率用波特率來表示,即每秒鐘傳送的二進位位數。例如數據傳送速率為120字符/秒,而每一個字符為10位(1個起始位,7個數據位,1個校驗位,1個結束位),則其傳送的波特率為10×120=1200字符/秒=1200波特。
    數據通信格式如下圖:

其中各位的意義如下:
    起始位:先發出一個邏輯」0」信號,表示傳輸字符的開始。
    數據位:可以是5~8位邏輯」0」或」1」。如ASCII碼(7位),擴展BCD碼(8位)。小端傳輸
    校驗位:數據位加上這一位後,使得「1」的位數應為偶數(偶校驗)或奇數(奇校驗)
    停止位:它是一個字符數據的結束標誌。可以是1位、1.5位、2位的高電平。
    空閒位:處於邏輯「1」狀態,表示當前線路上沒有資料傳送。

    註:異步通信是按字符傳輸的,接收設備在收到起始信號之後只要在一個字符的傳輸時間內能和發送設備保持同步就能正確接收。下一個字符起始位的到來又使同步重新校準(依靠檢測起始位來實現發送與接收方的時鐘自同步的)

總結起來,如果我們要配置串口通信,至少要設置一下幾個參數:字長(即一次傳輸數據的長度)、波特率(即每秒傳輸的數據位數)、奇偶校驗位及停止位。

二、串口工作過程分析

USART是通用同步/異步收發器

UART是通用異步收發器

由於常用的是異步模式,所以在此我們都是只需要使用UART。

我們先介紹串口發送的過程,我們先來看一下串口架構圖:

可以看出,串口外設的架構圖乍一看略微複雜,這裡我們分開進行分析:

 

我們直接從發送(TX)和接收(RX)開始講起。

RX和TX此處不做過多介紹。

根據下圖紅色箭頭標記可以看出:對於接收來說,它經過編解碼模塊,然後直接進入到了接收移位寄存器,接收移位寄存器一位一位的接收數據,然後再將接收到的數據一次性寫到接收數據寄存器(RDR)中,這樣,CPU就可以通過讀取接收數據寄存器(RDR)來讀到接收的數據。

同樣,對於發送來說,CPU將數據寫入到發送數據寄存器(TDR),發送數據寄存器(TDR)將數據一次性的發送給發送移位寄存器,然後再根據波特率將數據一位一位的移出。如下圖:

我們知道,發送和接收事先要確定好波特率,那麼波特率是怎麼配置的呢?我們順著箭頭繼續往下找:

 

根據上圖所示,我們不難看出:波特率是通過發送控制器和接收控制器分別控制發送器時鐘和接收器時鐘,然後傳輸到發送移位寄存器和接收移位寄存器中的。

通過上圖我們還可以看出:發送器時鐘和接收器時鐘來自同一單元。我們現在就來分析一下這兩個時鐘是怎麼產生的。

上文中已經介紹過,波特率實際上就是每秒傳輸的二進位位數,通過對時鐘的控制可以改變波特率。我們向波特比率寄存器(即上圖中的USART_BRR)寫入參數,修改了串口時鐘的分頻值USARTDIV。

USART_BRR寄存器包括兩個部分:DIV_Mantissa(即USARTDIV的整數部分)和DIV_Fraction(即USARTDIV的小數部分)。計算公式為:USARTDIV=DIV_Mantissa+(DIV_Fraction/16)。

波特率計算公式如下:

我們只要知道了USARTDIV的值,就可以知道串口波特率寄存器的值。

舉一個簡單的例子:假設我們串口1要設置的波特率為115200,PLCK2的時鐘頻率為72MHz,根據上面的公式,我們可以得出:

USARTDIV=72000000/(16*115200)=39.0625

由此 我們就可以得到DIV_Fraction=16*0.0625=1=0x01;

DIV_Mantissa=39=0x27。
由於USARTDIV是對串口外設的時鐘源進行分頻,不同的USART掛載的總線並不相同,所以它們的時鐘源fPCLK也不相同。USART1掛載在APB2總線上,其時鐘源為fPCLK2;USART2、3、4、5掛載在APB1上,其時鐘源為fPCLK1。串口的時鐘源經過USARTDIV分頻後,分別輸出作為發送器時鐘及接收器時鐘,來控制發送和接收的時序。

三、程序分析

首先,我們打開iBox開發板的例程USART_DEMO,在左側的工程目錄中找到USER工程文件夾點擊前方的「+」,找到main.c文件並打開。

我們可以看到,在主函數上面有一個fputc(intch, FILE *f)函數。

這個函數的功能是將一個字符寫入到文件中。其參數包括:Ch要寫入的字符; *f指向FILE結構的指針。

 

接下來我們來看一下主函數:

上圖中的兩行代碼分別為定義GPIO結構體和定義USART結構體。

上面的函數是使能APB2總線上的串口時鐘,同時啟動GPIOA埠。

上圖中的代碼是對GPIO埠的配置。其配置方法在第三講中有提及到,我們可以看出其配置的是PA9埠。因為PA9埠同時也是USART1_TX,即串口的發送數據埠。

上圖中的代碼是對PA10埠的配置。因為PA10埠同時也是USART1_RX,即串口的接收數據埠。

我們看一下GPIO的工作模式:GPIO_Pin_9的工作模式為復用推輓輸出;GPIO_Pin_10的工作模式為浮空輸入。我們可以在STM32參考手冊中找到GPIO配置中關於USART的配置,如下表:

我們工作模式為全雙工,所以根據表格,配置好相應的GPIO埠工作模式,分別為復用推輓輸出和浮空輸入。

接下來就是對串口的初始化和配置。如上圖所示。我們逐行分析。

在此之前,我們可以在工程目錄種先找到stm32f10x_usart.h(可以在main.c下面找到,因為我們的main函數包含了此庫函數),即USART庫函數。

我們可以在最下面找到許多函數聲明。我們可以在用戶手冊種找到這些函數的描述,大家可以簡單了解一下。

我們繼續瀏覽stm32f10x_usart.h庫函數,可以找到typedef struct,如下圖(為方便截圖,在此已將注釋隱藏):

我們可以發現 我們程序種需要配置的USART相關參數都在這裡有所聲明。不僅如此,繼續向下翻閱還可以找到所需配置的相關參數(由於代碼略多,在此不做截圖,讀者可自己查閱)。

uint32_t USART_BaudRate:該成員設置了USART傳輸的波特率。          

 

uint16_t USART_WordLength:提示了在一個幀中傳輸或者接收到的數據位數。可取值為:USART_WoedLength_8b(8位數據)和USART_WoedLength_9b(9位數據)。

uint16_t USART_StopBits:在幀尾傳輸的停止位。其定義為USART_StopBits_0.5(0.5個停止位)、USART_StopBits_1(1個停止位)、USART_StopBits_1.5(1.5個停止位)、USART_StopBits_2(2個停止位)。          

uint16_t USART_Parity:奇偶校驗位。其定義為USART_Parity_No(不使用)、USART_Parity_Even(偶模式)、USART_Parity_Odd(奇模式)。             

uint16_t USART_Mode:指定了使能或者失能發送和接收模式。其定義為:USART_Mode_Rx(接收使能)、USART_Mode_Tx(發送使能)。uint16_t USART_HardwareFlowControl:制定了硬體流控制模式是使能還是失能。其定義為:USART_HardwareFlowControl_RTS(發送請求RTS使能)、USART_HardwareFlowControl_CTS(清除發送CTS使能)、USART_HardwareFlowControl_RTS_CTS(RTS和CTS使能)。

USART_Clock、USART_CPOL、USART_CPHA和USART_LastBit在同步模式下才需要配置,在此暫時不做解釋。

了解了這些,對串口的初始化和配置分析就非常容易了。我們回到主函數,觀察串口初始化和配置的幾行代碼:

上圖代碼是將波特率設置為115200。

上圖代碼定義了數據位數為8位數據。

上圖代碼設定了在幀尾傳輸一個停止位。

上圖代碼設定了不使用奇偶校驗。

上圖代碼設定了不使用硬體流控制模式。

上圖代碼定義了發送和接收模式:使能發送和使能接收。

上圖種兩行代碼第一行為串口初始化,第二行為使能串口。

最後,我們循環列印「USART Printf Example: retarget the C library printf function to the USART」。

接下來,我們觀察實驗現象:首先將程序燒錄到iBox中,然後我們使用USB轉TTL串口工具將iBox與電腦連接,如下圖所示:

iBox的J12接口從左到右依次為:TX、RX和GND(注意:我們沒有為iBox接電源,iBox需要單獨供電)。

接下來,我們打開串口助手。

如上圖:首先我們需要根據我們的程序配置串口(不同助手界面可能有所不同)。

設置好參數後,我們將程序燒錄到iBox中,觀察串口助手。

前期內容:

從原理圖PCB到移植RTOS【細說STM32】【一】用官方代碼建立工程

從原理圖PCB到移植RTOS【細說STM32】【二】新建一個自己的工程

從原理圖PCB到移植RTOS【細說STM32】【三】GPIO

點擊   閱讀原文,可以下載工程文件。

作者:孫彥博

相關焦點

  • RTOS崛起會威脅Linux在嵌入式領域的地位嗎?
    應該會有補充但是替代應該不可能,而且你沒發現很多rtos都是借鑑Linux發明的還有就是這不是一個領域的比較,Linux可以使硬體通用化,這一點完虐單片機,沒有幾個人願意遷移單片機項目代碼Linux開發嵌入式最大的優勢就是資源豐富,這和Linux開源有很大的關係,無數的大牛都在維護和開發
  • 基於Linux的tty架構及UART驅動詳解
    工作原理髮送數據過程:空閒狀態,線路處於高電位;當收到發送數據指令後,拉低線路一個數據位的時間T,接著數據位按低位到高位依次發送,數據發送完畢後,接著發送奇偶檢驗位和停止位(停止位為高電位),一幀數據發送結束。
  • UART簡介
    兩個uart通信如下圖所示:其中發送UART可能來自控制設備(如CPU)的並行數據轉換為串行形式,以串行方式將其發送到接收UART,然後由接收UART將串行數據轉換回並行數據以用於接收設備。數據從發送UART的Tx引腳流到接收UART的Rx引腳。
  • 融創技術社區丨47篇BLDC/PMSM/步進電機等驅動設計資料匯:原理圖PCB圖源碼培訓資料等
    基於FOC5.3庫IHM07自製板BLDC/PMSM電機驅動:原理圖/器件庫/參考程序/培訓資料及說明等開源分享 http://club.digiic.com/Forum/PostDetail/p-11381.html 自製STEVAL-IPM05F 3Sh板:FOC電機控制400V/8A 無感參考程序/原理圖/BOM表等開源分享http
  • STM32移植MQTT連接阿里雲物聯網平臺
    1.MQTT協議移植的paho.mqtt.embedded-c-master,用到的就是MQTTPacket\src目錄下的文件和MQTTPacket\samples目錄下transport.c和.h文件。需要修改的只有transport.c裡的兩個函數,一個發送,一個接收。
  • 實例講解之STM32的高級捕獲模式
    文章來自星球號——《實例講解之STM32的高級捕獲模式》作者:lihui710884923簡單介紹一下stm32所謂輸入捕捉功能,是指通用定時器可以通過檢測輸入信號的跳變沿,檢測到跳變沿的同時將計數器的當前值寫入相應的寄存器。我們可以利用定製器的輸入捕捉模式可以測量輸入信號的高電平時間、佔空比和頻率。
  • 盤點STM32的國產替代者(2)
    多說無益,直接看幾個21ic家網友關於這兩款開發板的測評:【CH32F103測評報告】+基於WCH沁恆CH32F103開發板點燈編程試驗目標:使用WCH沁恆CH32F103開發板點燈編程試驗一、搞點資料看看,電路圖要搞到從21ic論壇(bbs.21ic.com/iclist-900-
  • [網友問答1]STM32驅動PCF8591模塊,實現AD/DA轉換
    模塊原理圖模塊說明:支持4路模擬電壓採集信號輸入(電壓輸入範圍0--5V)模塊帶DA輸出指示燈1個(D2),當DA輸出電壓達到一定值時,該指示燈亮,電壓值越高,指示燈越亮模塊集成1路0--5V電壓輸入採集(通過藍白電位器調節輸入電壓)模塊集成1路光敏電阻(型號:5537),可以通過AD採集環境光線強度模塊集成1路熱敏電阻(型號:MF58),可以通過AD採集環境溫度PCF8591特點:由上面的原理圖可以看出
  • STM32物聯網實戰項目 - HAL裸機開發38 - TFT屏幕移植GUI(LVGL)
    HAL裸機開發38 - TFT屏幕移植
  • 如何將三萬行代碼從 Flow 移植到 TypeScript?
    本文就詳解了將三萬行代碼從Flow移植到TypeScript的全過程。將三萬多行代碼從 Flow 移植到 TypeScript實際上,將所有代碼從Flow移植到TypeScript的第一步是將Babel從6升級到7。
  • 乾貨 | stm32f4功能介紹
    乾貨|stm32f4功能介紹這篇文章主要介紹stm32f4的時鐘樹、定時器、通信方式(串口、I2C).話不多說,直奔主題。具體如下圖所示:1、LSI(低速內部時鐘):由內部RC振蕩器產生,頻率為32kHz。如圖區域①;2、HSI(高速內部時鐘):由內部RC振蕩器產生,頻率為16MHz。如圖區域②;3、LSE(低速外部時鐘):一般由外部晶振提供,頻率為32.768kHz。如圖區域③;4、HSE(低速外部時鐘):一般由外部晶振提供,頻率為4~26MHz。
  • 左手四指絞進機器 高明!「移花接木」助其涅槃重生——宜昌長航東院高難度斷指移植再造術紀實
    左手拍片考慮到馬大哥正當壯年,如果失去四根手指左手就基本喪失勞動能力,經過與鄭之和院長、杜遠立院長等骨科專家緊急商議,張芝亮主任決定先修復手背部皮膚,後期再進行斷指再造。     沒有失去過手指的人,永遠也無法體會到,於一隻手而言,五根手指也是一個團隊。儘管臨床上,醫生根據功能劃分大拇指佔50%的功能,食指和中指各佔15%,無名指和小指各佔10%,但對失去四根手指的馬大哥來說,左手唯一剩下的大拇指顯然根本無法發揮50%的功能,反而形同虛設。
  • 淺談UART總線工作原理​
    淺談UART總線工作原理還記得當年的印表機,滑鼠和數據機嗎?
  • 全陰莖及陰囊移植手術成功實施,可讓移植陰莖恢復完整功能
    在第一次和第二次世界大戰期間,對戰爭損傷的治療促進了植皮術、器官移植技術、以及隨後的整形修復手術的早期發展。戰爭損傷和醫學進步的這種關聯一直延續到現在。五年前,伊拉克戰爭中第一位四肢截肢的倖存者,美軍中士Brendan Marrocco在約翰·霍普金斯大學接受了雙臂移植手術。就在五個月前,約翰·霍普金斯大學又為另一位在阿富汗戰爭中受傷的士兵成功進行了雙臂移植。
  • PCB設計為什麼一般控制50歐姆阻抗?
    圖1 疊層信息圖示從上圖可以看出,設計上面的單端網絡一般都是50歐姆來管控,那很多人就會問,為什麼要求按照50歐姆來管控而不是25歐姆或者80歐姆?首先,默認選擇用50歐姆,而且業內大家都接受這個值,一般來說,肯定是由某個公認的機構制訂了某個標準,大家是按標準進行設計的。
  • 天津碼頭爆炸給PCB行業事故敲響警鐘
    廠方先是將一樓員工疏散到籃球場上。一個小時後,二工廠4層生產車間都瀰漫著刺激性氣味,二樓至四樓的員工也被疏散。「2008年發生過一次氯氣洩漏,這次味道非常刺鼻,我們以為又是氯氣洩漏了,」多名員工回憶起事發時的驚險一幕,仍後怕不已。 10月10日下午,該廠仍處於停工狀態。該公司安全管理副課長王成介紹,8日晚10時30分許,二工廠生產車間一樓出現刺激性氣味,隨後瀰漫擴散。
  • 四旋翼無人飛行器自主飛行控制原理
    下面將逐個說明飛行器的各種飛行姿態:垂直運動——在圖中,因有兩對電機轉向相反,可以平衡其對機身的反扭矩,當同時增加四個電機的輸出功率,旋翼轉速增加使得總的拉力增大,當總拉力足以克服整機的重量時,四旋翼飛行器便離地垂直上升;反之,同時減小四個電機的輸出功率,四旋翼飛行器則垂直下降,直至平衡落地,實現了沿z軸的垂直運動