單芯片解決方案,開啟全新體驗(yàn)——W55MH32 高性能以太網(wǎng)單片機(jī)
W55MH32是WIZnet重磅推出的高性能以太網(wǎng)單片機(jī),它為用戶帶來前所未有的集成化體驗(yàn)。這顆芯片將強(qiáng)大的組件集于一身,具體來說,一顆W55MH32內(nèi)置高性能Arm? Cortex-M3核心,其主頻最高可達(dá)216MHz;配備1024KB FLASH與96KB SRAM,滿足存儲與數(shù)據(jù)處理需求;集成TOE引擎,包含WIZnet全硬件TCP/IP協(xié)議棧、內(nèi)置MAC以及PHY,擁有獨(dú)立的32KB以太網(wǎng)收發(fā)緩存,可供8個獨(dú)立硬件socket使用。如此配置,真正實(shí)現(xiàn)了All-in-One解決方案,為開發(fā)者提供極大便利。
在封裝規(guī)格上,W55MH32 提供了兩種選擇:QFN100和QFN68。
W55MH32L采用QFN100封裝版本,尺寸為12x12mm,其資源豐富,專為各種復(fù)雜工控場景設(shè)計(jì)。它擁有66個GPIO、3個ADC、12通道DMA、17個定時器、2個I2C、5個串口、2個SPI接口(其中1個帶I2S接口復(fù)用)、1個CAN、1個USB2.0以及1個SDIO接口。如此豐富的外設(shè)資源,能夠輕松應(yīng)對工業(yè)控制中多樣化的連接需求,無論是與各類傳感器、執(zhí)行器的通信,還是對復(fù)雜工業(yè)協(xié)議的支持,都能游刃有余,成為復(fù)雜工控領(lǐng)域的理想選擇。 同系列還有QFN68封裝的W55MH32Q版本,該版本體積更小,僅為8x8mm,成本低,適合集成度高的網(wǎng)關(guān)模組等場景,軟件使用方法一致。更多信息和資料請進(jìn)入http://www.w5500.com/網(wǎng)站或者私信獲取。
此外,本W(wǎng)55MH32支持硬件加密算法單元,WIZnet還推出TOE+SSL應(yīng)用,涵蓋TCP SSL、HTTP SSL以及 MQTT SSL等,為網(wǎng)絡(luò)通信安全再添保障。
為助力開發(fā)者快速上手與深入開發(fā),基于W55MH32L這顆芯片,WIZnet精心打造了配套開發(fā)板。開發(fā)板集成WIZ-Link芯片,借助一根USB C口數(shù)據(jù)線,就能輕松實(shí)現(xiàn)調(diào)試、下載以及串口打印日志等功能。開發(fā)板將所有外設(shè)全部引出,拓展功能也大幅提升,便于開發(fā)者全面評估芯片性能。
若您想獲取芯片和開發(fā)板的更多詳細(xì)信息,包括產(chǎn)品特性、技術(shù)參數(shù)以及價(jià)格等,歡迎訪問官方網(wǎng)頁:http://www.w5500.com/,我們期待與您共同探索W55MH32的無限可能。
第十四章 USART——串口通訊
本章參考資料:《W55MH32-參考手冊》USART章節(jié)。
學(xué)習(xí)本章時,配合《W55MH32-參考手冊》USART章節(jié)一起閱讀, 效果會更佳,特別是涉及到寄存器說明的部分。特別說明,本書內(nèi)容是以W55MH32系列控制器資源講解。
1 串口通訊協(xié)議簡介
串口通訊(Serial Communication)是一種設(shè)備間非常常用的串行通訊方式,因?yàn)樗唵伪憬荩虼舜蟛糠蛛娮釉O(shè)備都支持該通訊方式, 電子工程師在調(diào)試設(shè)備時也經(jīng)常使用該通訊方式輸出調(diào)試信息。
在計(jì)算機(jī)科學(xué)里,大部分復(fù)雜的問題都可以通過分層來簡化。如芯片被分為內(nèi)核層和片上外設(shè);W55MH32標(biāo)準(zhǔn)庫則是在寄存器與用戶代碼之間的軟件層。 對于通訊協(xié)議,我們也以分層的方式來理解,最基本的是把它分為物理層和協(xié)議層。物理層規(guī)定通訊系統(tǒng)中具有機(jī)械、電子功能部分的特性, 確保原始數(shù)據(jù)在物理媒體的傳輸。協(xié)議層主要規(guī)定通訊邏輯,統(tǒng)一收發(fā)雙方的數(shù)據(jù)打包、解包標(biāo)準(zhǔn)。 簡單來說物理層規(guī)定我們用嘴巴還是用肢體來交流,協(xié)議層則規(guī)定我們用中文還是英文來交流。
下面我們分別對串口通訊協(xié)議的物理層及協(xié)議層進(jìn)行講解。
1.1 物理層
串口通訊的物理層有很多標(biāo)準(zhǔn)及變種,我們主要講解RS-232標(biāo)準(zhǔn) ,RS-232標(biāo)準(zhǔn)主要規(guī)定了信號的用途、通訊接口以及信號的電平標(biāo)準(zhǔn)。
使用RS-232標(biāo)準(zhǔn)的串口設(shè)備間常見的通訊結(jié)構(gòu)見下圖,串口通訊結(jié)構(gòu)圖 :
在上面的通訊方式中,兩個通訊設(shè)備的“DB9接口”之間通過串口信號線建立起連接,串口信號線中使用“RS-232標(biāo)準(zhǔn)”傳輸數(shù)據(jù)信號。 由于RS-232電平標(biāo)準(zhǔn)的信號不能直接被控制器直接識別,所以這些信號會經(jīng)過一個“電平轉(zhuǎn)換芯片”轉(zhuǎn)換成控制器能識別的“TTL標(biāo)準(zhǔn)”的電平信號,才能實(shí)現(xiàn)通訊。
1.1.1 電平標(biāo)準(zhǔn)
根據(jù)通訊使用的電平標(biāo)準(zhǔn)不同,串口通訊可分為TTL標(biāo)準(zhǔn)及RS-232標(biāo)準(zhǔn),見下表, TTL電平標(biāo)準(zhǔn)與RS232電平標(biāo)準(zhǔn) :
通訊標(biāo)準(zhǔn) | 電平標(biāo)準(zhǔn) (發(fā)送端) |
5V TTL |
邏輯 1:2.4V–5V 邏輯 0:0~0.5V |
RS-232 |
邏輯 1:-15V~-3V 邏輯 0:+3V~+15V |
我們知道常見的電子電路中常使用TTL的電平標(biāo)準(zhǔn),理想狀態(tài)下,使用5V表示二進(jìn)制邏輯1,使用0V表示邏輯0; 而為了增加串口通訊的遠(yuǎn)距離傳輸及抗干擾能力,它使用-15V表示邏輯1,+15V表示邏輯0。 使用RS232與TTL電平校準(zhǔn)表示同一個信號時的對比見下圖,RS-232與TTL電平標(biāo)準(zhǔn)下表示同一個信號 :
因?yàn)榭刂破饕话闶褂肨TL電平標(biāo)準(zhǔn),所以常常會使用MAX3232芯片對TTL及RS-232電平的信號進(jìn)行互相轉(zhuǎn)換。
1.1.2 RS-232信號線
在最初的應(yīng)用中,RS-232串口標(biāo)準(zhǔn)常用于計(jì)算機(jī)、路由與調(diào)制調(diào)解器(MODEN,俗稱“貓”)之間的通訊 ,在這種通訊系統(tǒng)中, 設(shè)備被分為數(shù)據(jù)終端設(shè)備DTE(計(jì)算機(jī)、路由)和數(shù)據(jù)通訊設(shè)備DCE(調(diào)制調(diào)解器)。我們以這種通訊模型講解它們的信號線連接方式及各個信號線的作用。
在舊式的臺式計(jì)算機(jī)中一般會有RS-232標(biāo)準(zhǔn)的COM口(也稱DB9接口),見下圖,電腦主板上的COM口及串口線 :
其中接線口以針式引出信號線的稱為公頭,以孔式引出信號線的稱為母頭。在計(jì)算機(jī)中一般引出公頭接口,而在調(diào)制調(diào)解器設(shè)備中引出的一般為母頭,使用上圖中的串口線即可把它與計(jì)算機(jī)連接起來。通訊時,串口線中傳輸?shù)男盘柧褪鞘褂们懊嬷v解的RS-232標(biāo)準(zhǔn)調(diào)制的。
在這種應(yīng)用場合下,DB9接口中的公頭及母頭的各個引腳的標(biāo)準(zhǔn)信號線接法見下圖,DB9標(biāo)準(zhǔn)的公頭及母頭接法見下表,DB9信號線說明 :
序號 | 名稱 | 符號 | 數(shù)據(jù)方向 | 說明 |
1 | 載波檢測 | DCD | DTE→DCE | Data Carrier Detect,數(shù)據(jù)載波檢測,用于 DTE 告知對方,本機(jī)是否收到對方的載波信號 |
2 | 接收數(shù)據(jù) | RXD | DTE←DCE | Receive Data,數(shù)據(jù)接收信號,即輸入。 |
3 | 發(fā)送數(shù)據(jù) | TXD | DTE→DCE | Transmit Data,數(shù)據(jù)發(fā)送信號,即輸出。兩個設(shè)備之間的 TXD 與 RXD 應(yīng)交叉相連 |
4 | 數(shù)據(jù)終端 (DTE) 就緒 | DTR | DTE→DCE | Data Terminal Ready,數(shù)據(jù)終端就緒,用于 DTE 向?qū)Ψ礁嬷緳C(jī)是否已準(zhǔn)備好 |
5 | 信號地 | GND | - | 地線,兩個通訊設(shè)備之間的地電位可能不一樣,這會影響收發(fā)雙方的電平信號,所以兩個串口設(shè)備之間必須要使用地線連接,即共地。 |
6 | 數(shù)據(jù)設(shè)備 (DCE) 就緒 | DSR | DTE←DCE | Data Set Ready,數(shù)據(jù)發(fā)送就緒,用于 DCE 告知對方本機(jī)是否處于待命狀態(tài) |
7 | 請求發(fā)送 | RTS | DTE→DCE | Request To Send,請求發(fā)送,DTE 請求 DCE 本設(shè)備向 DCE 端發(fā)送數(shù)據(jù) |
8 | 允許發(fā)送 | CTS | DTE←DCE | Clear To Send,允許發(fā)送,DCE 回應(yīng)對方的 RTS 發(fā)送請求,告知對方是否可以發(fā)送數(shù)據(jù) |
9 | 響鈴指示 | RI | DTE←DCE | Ring Indicator,響鈴指示,表示 DCE 端與線路已接通 |
上表中的是計(jì)算機(jī)端的DB9公頭標(biāo)準(zhǔn)接法,由于兩個通訊設(shè)備之間的收發(fā)信號(RXD與TXD)應(yīng)交叉相連, 所以調(diào)制調(diào)解器端的DB9母頭的收發(fā)信號接法一般與公頭的相反,兩個設(shè)備之間連接時,只要使用“直通型”的串口線連接起來即可, 見下圖,計(jì)算機(jī)與調(diào)制調(diào)解器的信號線連接 :
串口線中的RTS、CTS、DSR、DTR及DCD信號,使用邏輯 1表示信號有效,邏輯0表示信號無效。 例如,當(dāng)計(jì)算機(jī)端控制DTR信號線表示為邏輯1時,它是為了告知遠(yuǎn)端的調(diào)制調(diào)解器,本機(jī)已準(zhǔn)備好接收數(shù)據(jù),0則表示還沒準(zhǔn)備就緒。
在目前的其它工業(yè)控制使用的串口通訊中,一般只使用RXD、TXD以及GND三條信號線, 直接傳輸數(shù)據(jù)信號,而RTS、CTS、DSR、DTR及DCD信號都被裁剪掉了。
1.2 協(xié)議層
串口通訊的數(shù)據(jù)包由發(fā)送設(shè)備通過自身的TXD接口傳輸?shù)浇邮赵O(shè)備的RXD接口。在串口通訊的協(xié)議層中, 規(guī)定了數(shù)據(jù)包的內(nèi)容,它由啟始位、主體數(shù)據(jù)、校驗(yàn)位以及停止位組成,通訊雙方的數(shù)據(jù)包格式要約定一致才能正常收發(fā)數(shù)據(jù), 其組成見下圖,串口數(shù)據(jù)包的基本組成 :
1.2.1 波特率
本章中主要講解的是串口異步通訊,異步通訊中由于沒有時鐘信號(如前面講解的DB9接口中是沒有時鐘信號的), 所以兩個通訊設(shè)備之間需要約定好波特率,即每個碼元的長度,以便對信號進(jìn)行解碼, 圖 串口數(shù)據(jù)包的基本組成 中用虛線分開的每一格就是代表一個碼元。常見的波特率為4800、9600、115200等。
1.2.2 通訊的起始和停止信號
串口通訊的一個數(shù)據(jù)包從起始信號開始,直到停止信號結(jié)束。數(shù)據(jù)包的起始信號由一個邏輯0的數(shù)據(jù)位表示, 而數(shù)據(jù)包的停止信號可由0.5、1、1.5或2個邏輯1的數(shù)據(jù)位表示,只要雙方約定一致即可。
1.2.3 有效數(shù)據(jù)
在數(shù)據(jù)包的起始位之后緊接著的就是要傳輸?shù)闹黧w數(shù)據(jù)內(nèi)容,也稱為有效數(shù)據(jù),有效數(shù)據(jù)的長度常被約定為5、6、7或8位長。
1.2.4 數(shù)據(jù)校驗(yàn)
在有效數(shù)據(jù)之后,有一個可選的數(shù)據(jù)校驗(yàn)位。由于數(shù)據(jù)通信相對更容易受到外部干擾導(dǎo)致傳輸數(shù)據(jù)出現(xiàn)偏差, 可以在傳輸過程加上校驗(yàn)位來解決這個問題。校驗(yàn)方法有奇校驗(yàn)(odd)、偶校驗(yàn)(even)、0校驗(yàn)(space)、1校驗(yàn)(mark)以及無校驗(yàn)(noparity)。
奇校驗(yàn)要求有效數(shù)據(jù)和校驗(yàn)位中“1”的個數(shù)為奇數(shù),比如一個8位長的有效數(shù)據(jù)為:01101001,此時總共有4個“1”, 為達(dá)到奇校驗(yàn)效果,校驗(yàn)位為“1”,最后傳輸?shù)臄?shù)據(jù)將是8位的有效數(shù)據(jù)加上1位的校驗(yàn)位總共9位。
偶校驗(yàn)與奇校驗(yàn)要求剛好相反,要求幀數(shù)據(jù)和校驗(yàn)位中“1”的個數(shù)為偶數(shù), 比如數(shù)據(jù)幀:11001010,此時數(shù)據(jù)幀“1”的個數(shù)為4個,所以偶校驗(yàn)位為“0”。
0校驗(yàn)是不管有效數(shù)據(jù)中的內(nèi)容是什么,校驗(yàn)位總為“0”,1校驗(yàn)是校驗(yàn)位總為“1”。
2 W55MH32的USART簡介
通用同步異步收發(fā)器(Universal Synchronous Asynchronous Receiver and Transmitter)是一個串行通信設(shè)備, 可以靈活地與外部設(shè)備進(jìn)行全雙工數(shù)據(jù)交換。 有別于USART還有一個UART(Universal Asynchronous Receiver and Transmitter), 它是在USART基礎(chǔ)上裁剪掉了同步通信功能,只有異步通信。 簡單區(qū)分同步和異步就是看通信時需不需要對外提供時鐘輸出,我們平時用的串口通信基本都是UART。
串行通信一般是以幀格式傳輸數(shù)據(jù),即是一幀一幀的傳輸,每幀包含有起始信號、數(shù)據(jù)信息、停止信息, 可能還有校驗(yàn)信息。USART就是對這些傳輸參數(shù)有具體規(guī)定,當(dāng)然也不是只有唯一一個參數(shù)值,很多參數(shù)值都可以自定義設(shè)置,只是增強(qiáng)它的兼容性。
USART滿足外部設(shè)備對工業(yè)標(biāo)準(zhǔn)NRZ異步串行數(shù)據(jù)格式的要求,并且使用了小數(shù)波特率發(fā)生器, 可以提供多種波特率,使得它的應(yīng)用更加廣泛。USART支持同步單向通信和半雙工單線通信;還支持局域互連網(wǎng)絡(luò)LIN、 智能卡(SmartCard)協(xié)議與lrDA(紅外線數(shù)據(jù)協(xié)會) SIR ENDEC規(guī)范。
USART支持使用DMA,可實(shí)現(xiàn)高速數(shù)據(jù)通信,有關(guān)DMA具體應(yīng)用將在DMA章節(jié)作具體講解。
USART在W55MH32應(yīng)用最多莫過于“打印”程序信息,一般在硬件設(shè)計(jì)時都會預(yù)留一個USART通信接口連接電腦, 用于在調(diào)試程序是可以把一些調(diào)試信息“打印”在電腦端的串口調(diào)試助手工具上,從而了解程序運(yùn)行是否正確、如果出錯哪具體哪里出錯等等。
3 USART功能框圖
USART的功能框圖包含了USART最核心內(nèi)容,掌握了功能框圖,對USART就有一個整體的把握, 在編程時就思路就非常清晰。USART功能框圖見下圖,USART功能框圖 :
TX: 發(fā)送數(shù)據(jù)輸出引腳。
RX: 接收數(shù)據(jù)輸入引腳。
SW_RX: 數(shù)據(jù)接收引腳,只用于單線和智能卡模式,屬于內(nèi)部引腳,沒有具體外部引腳。
nRTS: 請求已發(fā)送(Request To Send),n表示低電平有效。如果使能RTS流控制,當(dāng)USART接收器準(zhǔn)備好接收新數(shù)據(jù)時就會將nRTS變成低電平; 當(dāng)接收寄存器已滿時,nRTS將被設(shè)置為高電平。該引腳只適用于硬件流控制。
nCTS: 清除以發(fā)送(Clear To Send),n表示低電平有效。如果使能CTS流控制,發(fā)送器在發(fā)送下一幀數(shù)據(jù)之前會檢測nCTS引腳, 如果為低電平,表示可以發(fā)送數(shù)據(jù),如果為高電平則在發(fā)送完當(dāng)前數(shù)據(jù)幀之后停止發(fā)送。該引腳只適用于硬件流控制。
SCLK: 發(fā)送器時鐘輸出引腳。這個引腳僅適用于同步模式。
USART引腳在W55MH32芯片具體分布見下表,W55MH32芯片的USART引腳 :
引腳 | APB2 總線(USART1) | APB1 總線 | |||
USART1 | USART2 | USART3 | UART4 | UART5 | |
TX | PA9 | PA2 | PB10 | PC10 | PC12 |
RX | PA10 | PA3 | PB11 | PC11 | PD2 |
SCLK | PA8 | PA4 | PB12 | ||
nCTS | PA11 | PA0 | PB13 | ||
nRTS | PA12 | PA1 | PB14 |
W55MH32系統(tǒng)控制器有三個USART和兩個UART,其中USART1和時鐘來源于APB2總線時鐘,其最大頻率為216MHz, 其他四個的時鐘來源于APB1總線時鐘,其最大頻率為108MHz。UART只是異步傳輸功能,所以沒有SCLK、nCTS和nRTS功能引腳。
數(shù)據(jù)寄存器
USART數(shù)據(jù)寄存器(USART_DR)只有低9位有效,并且第9位數(shù)據(jù)是否有效要取決于USART控制寄存器1(USART_CR1)的M位設(shè)置, 當(dāng)M位為0時表示8位數(shù)據(jù)字長,當(dāng)M位為1表示9位數(shù)據(jù)字長,我們一般使用8位數(shù)據(jù)字長。
USART_DR包含了已發(fā)送的數(shù)據(jù)或者接收到的數(shù)據(jù)。USART_DR實(shí)際是包含了兩個寄存器,一個專門用于發(fā)送的可寫TDR, 一個專門用于接收的可讀RDR。當(dāng)進(jìn)行發(fā)送操作時,往USART_DR寫入數(shù)據(jù)會自動存儲在TDR內(nèi);當(dāng)進(jìn)行讀取操作時,向USART_DR讀取數(shù)據(jù)會自動提取RDR數(shù)據(jù)。
TDR和RDR都是介于系統(tǒng)總線和移位寄存器之間。串行通信是一個位一個位傳輸?shù)模l(fā)送時把TDR內(nèi)容轉(zhuǎn)移到發(fā)送移位寄存器, 然后把移位寄存器數(shù)據(jù)每一位發(fā)送出去,接收時把接收到的每一位順序保存在接收移位寄存器內(nèi)然后才轉(zhuǎn)移到RDR。
USART支持DMA傳輸,可以實(shí)現(xiàn)高速數(shù)據(jù)傳輸,具體DMA使用將在DMA章節(jié)講解。
控制器
USART有專門控制發(fā)送的發(fā)送器、控制接收的接收器,還有喚醒單元、中斷控制等等。 使用USART之前需要向USART_CR1寄存器的UE位置1使能USART,UE位用來開啟供給給串口的時鐘。
發(fā)送或者接收數(shù)據(jù)字長可選8位或9位,由USART_CR1的M位控制。
發(fā)送器
當(dāng)USART_CR1寄存器的發(fā)送使能位TE置1時,啟動數(shù)據(jù)發(fā)送,發(fā)送移位寄存器的數(shù)據(jù)會在TX引腳輸出, 低位在前,高位在后。如果是同步模式SCLK也輸出時鐘信號。
一個字符幀發(fā)送需要三個部分:起始位+數(shù)據(jù)幀+停止位。起始位是一個位周期的低電平,位周期就是每一位占用的時間; 數(shù)據(jù)幀就是我們要發(fā)送的8位或9位數(shù)據(jù),數(shù)據(jù)是從最低位開始傳輸?shù)模煌V刮皇且欢〞r間周期的高電平。
停止位時間長短是可以通過USART控制寄存器2(USART_CR2)的STOP[1:0]位控制,可選0.5個、1個、1.5個和2個停止位。 默認(rèn)使用1個停止位。2個停止位適用于正常USART模式、單線模式和調(diào)制解調(diào)器模式。0.5個和1.5個停止位用于智能卡模式。
當(dāng)選擇8位字長,使用1個停止位時,具體發(fā)送字符時序圖見下圖,字符發(fā)送時序圖 :
當(dāng)發(fā)送使能位TE置1之后,發(fā)送器開始會先發(fā)送一個空閑幀(一個數(shù)據(jù)幀長度的高電平),接下來就可以往USART_DR寄存器寫入要發(fā)送的數(shù)據(jù)。 在寫入最后一個數(shù)據(jù)后,需要等待USART狀態(tài)寄存器(USART_SR)的TC位為1,表示數(shù)據(jù)傳輸完成,如果USART_CR1寄存器的TCIE位置1,將產(chǎn)生中斷。
在發(fā)送數(shù)據(jù)時,編程的時候有幾個比較重要的標(biāo)志位我們來總結(jié)下:
名稱 | 描述 |
TE | 發(fā)送使能 |
TXE | 發(fā)送寄存器為空,發(fā)送單個字節(jié)的時候使用 |
TC | 發(fā)送完成,發(fā)送多個字節(jié)數(shù)據(jù)的時候使用 |
TXIE | 發(fā)送完成中斷使能 |
接收器
如果將USART_CR1寄存器的RE位置1,使能USART接收,使得接收器在RX線開始搜索起始位。 在確定到起始位后就根據(jù)RX線電平狀態(tài)把數(shù)據(jù)存放在接收移位寄存器內(nèi)。接收完成后就把接收移位寄存器數(shù)據(jù)移到RDR內(nèi), 并把USART_SR寄存器的RXNE位置1,同時如果USART_CR2寄存器的RXNEIE置1的話可以產(chǎn)生中斷。
在接收數(shù)據(jù)時,編程的時候有幾個比較重要的標(biāo)志位我們來總結(jié)下:
名稱 | 描述 |
RE | 接收使能 |
RXNE | 讀數(shù)據(jù)寄存器非空 |
RXNEIE | 接收完成中斷使能 |
小數(shù)波特率生成
波特率指數(shù)據(jù)信號對載波的調(diào)制速率,它用單位時間內(nèi)載波調(diào)制狀態(tài)改變次數(shù)來表示,單位為波特。 比特率指單位時間內(nèi)傳輸?shù)谋忍財(cái)?shù),單位bit/s(bps)。對于USART波特率與比特率相等,以后不區(qū)分這兩個概念。波特率越大,傳輸速率越快。
USART的發(fā)送器和接收器使用相同的波特率。計(jì)算公式如下:
其中,fPLCK為USART時鐘, USARTDIV是一個存放在波特率寄存器(USART_BRR)的一個無符號定點(diǎn)數(shù)。 其中DIV_Mantissa[11:0]位定義USARTDIV的整數(shù)部分,DIV_Fraction[3:0]位定義USARTDIV的小數(shù)部分。
例如:DIV_Mantissa=24(0x18),DIV_Fraction=10(0x0A),此時USART_BRR值為0x18A; 那么USARTDIV的小數(shù)位10/16=0.625;整數(shù)位24,最終USARTDIV的值為24.625。
如果知道USARTDIV值為27.68,那么DIV_Fraction=16*0.68=10.88,最接近的正整數(shù)為11, 所以DIV_Fraction[3:0]為0xB;DIV_Mantissa=整數(shù)(27.68)=27,即為0x1B。
波特率的常用值有2400、9600、19200、115200。下面以實(shí)例講解如何設(shè)定寄存器值得到波特率的值。
我們知道USART1使用APB2總線時鐘,最高可達(dá)72MHz,其他USART的最高頻率為108MHz。 我們選取USART1作為實(shí)例講解,即fPLCK=216MHz。為得到115200bps的波特率,此時:
115200=21600000016/16?USARTDIV
解得USARTDIV=117.1875,可算得DIV_Fraction=0.1875*16=3=0x03,DIV_Mantissa=117=0x75,即應(yīng)該設(shè)置USART_BRR的值為0x753。
3.1 校驗(yàn)控制
W55MH32系列控制器USART支持奇偶校驗(yàn)。當(dāng)使用校驗(yàn)位時,串口傳輸?shù)拈L度將是8位的數(shù)據(jù)幀加上1位的校驗(yàn)位總共9位, 此時USART_CR1寄存器的M位需要設(shè)置為1,即9數(shù)據(jù)位。將USART_CR1寄存器的PCE位置1就可以啟動奇偶校驗(yàn)控制, 奇偶校驗(yàn)由硬件自動完成。啟動了奇偶校驗(yàn)控制之后,在發(fā)送數(shù)據(jù)幀時會自動添加校驗(yàn)位,接收數(shù)據(jù)時自動驗(yàn)證校驗(yàn)位。 接收數(shù)據(jù)時如果出現(xiàn)奇偶校驗(yàn)位驗(yàn)證失敗,會見USART_SR寄存器的PE位置1,并可以產(chǎn)生奇偶校驗(yàn)中斷。
使能了奇偶校驗(yàn)控制后,每個字符幀的格式將變成:起始位+數(shù)據(jù)幀+校驗(yàn)位+停止位。
3.2 中斷控制
USART有多個中斷請求事件,具體見下表,USART中斷請求 :
中斷事件 | 事件標(biāo)志 | 使能控制位 |
發(fā)送數(shù)據(jù)寄存器為空 | TXE | TXEIE |
CTS 標(biāo)志 | CTS | CTSIE |
發(fā)送完成 | TC | TCIE |
準(zhǔn)備好讀取接收到的數(shù)據(jù) | RXNE | RXNEIE |
檢測到上溢錯誤 | ORE | — |
檢測到空閑線路 | IDLE | IDLEIE |
奇偶校驗(yàn)錯誤 | PE | PEIE |
斷路標(biāo)志 | LBD | LBDIE |
多緩沖通信中的噪聲標(biāo)志、上溢錯誤和幀錯誤 | NF/ORE/FE | EIE |
4 USART初始化結(jié)構(gòu)體詳解
標(biāo)準(zhǔn)庫函數(shù)對每個外設(shè)都建立了一個初始化結(jié)構(gòu)體,比如USART_InitTypeDef,結(jié)構(gòu)體成員用于設(shè)置外設(shè)工作參數(shù), 并由外設(shè)初始化配置函數(shù),比如USART_Init()調(diào)用,這些設(shè)定參數(shù)將會設(shè)置外設(shè)相應(yīng)的寄存器,達(dá)到配置外設(shè)工作環(huán)境的目的。
初始化結(jié)構(gòu)體和初始化庫函數(shù)配合使用是標(biāo)準(zhǔn)庫精髓所在,理解了初始化結(jié)構(gòu)體每個成員意義基本上就可以對該外設(shè)運(yùn)用自如了。 初始化結(jié)構(gòu)體定義在W55MH32_usart.h文件中,初始化庫函數(shù)定義在W55MH32_usart.c文件中,編程時我們可以結(jié)合這兩個文件內(nèi)注釋使用。
USART初始化結(jié)構(gòu)體
typedef struct { uint32_t USART_BaudRate; // 波特率 uint16_t USART_WordLength; // 字長 uint16_t USART_StopBits; // 停止位 uint16_t USART_Parity; // 校驗(yàn)位 uint16_t USART_Mode; // USART模式 uint16_t USART_HardwareFlowControl; // 硬件流控制 } USART_InitTypeDef;
USART_BaudRate: 波特率設(shè)置。一般設(shè)置為2400、9600、19200、115200。標(biāo)準(zhǔn)庫函數(shù)會根據(jù)設(shè)定值計(jì)算得到USARTDIV值,從而設(shè)置USART_BRR寄存器值。
USART_WordLength: 數(shù)據(jù)幀字長,可選8位或9位。它設(shè)定USART_CR1寄存器的M位的值。如果沒有使能奇偶校驗(yàn)控制,一般使用8數(shù)據(jù)位;如果使能了奇偶校驗(yàn)則一般設(shè)置為9數(shù)據(jù)位。
USART_StopBits: 停止位設(shè)置,可選0.5個、1個、1.5個和2個停止位,它設(shè)定USART_CR2寄存器的STOP[1:0]位的值,一般我們選擇1個停止位。
USART_Parity: 奇偶校驗(yàn)控制選擇,可選USART_Parity_No(無校驗(yàn))、USART_Parity_Even(偶校驗(yàn))以及USART_Parity_Odd(奇校驗(yàn)),它設(shè)定USART_CR1寄存器的PCE位和PS位的值。
USART_Mode: USART模式選擇,有USART_Mode_Rx和USART_Mode_Tx,允許使用邏輯或運(yùn)算選擇兩個,它設(shè)定USART_CR1寄存器的RE位和TE位。
USART_HardwareFlowControl: 硬件流控制選擇,只有在硬件流控制模式才有效,可選有使能RTS、使能CTS、同時使能RTS和CTS、不使能硬件流。
當(dāng)使用同步模式時需要配置SCLK引腳輸出脈沖的屬性,標(biāo)準(zhǔn)庫使用一個時鐘初始化結(jié)構(gòu)體USART_ClockInitTypeDef來設(shè)置,該結(jié)構(gòu)體內(nèi)容也只有在同步模式才需要設(shè)置。
USART時鐘初始化結(jié)構(gòu)體
typedef struct { uint16_t USART_Clock; // 時鐘使能控制 uint16_t USART_CPOL; // 時鐘極性 uint16_t USART_CPHA; // 時鐘相位 uint16_t USART_LastBit; // 最尾位時鐘脈沖 } USART_ClockInitTypeDef;
USART_Clock: 同步模式下SCLK引腳上時鐘輸出使能控制,可選禁止時鐘輸出(USART_Clock_Disable)或開啟時鐘輸出(USART_Clock_Enable);如果使用同步模式發(fā)送,一般都需要開啟時鐘。它設(shè)定USART_CR2寄存器的CLKEN位的值。
USART_CPOL: 同步模式下SCLK引腳上輸出時鐘極性設(shè)置,可設(shè)置在空閑時SCLK引腳為低電平(USART_CPOL_Low)或高電平(USART_CPOL_High)。它設(shè)定USART_CR2寄存器的CPOL位的值。
USART_CPHA: 同步模式下SCLK引腳上輸出時鐘相位設(shè)置,可設(shè)置在時鐘第一個變化沿捕獲數(shù)據(jù)(USART_CPHA_1Edge)或在時鐘第二個變化沿捕獲數(shù)據(jù)。它設(shè)定USART_CR2寄存器的CPHA位的值。USART_CPHA與USART_CPOL配合使用可以獲得多種模式時鐘關(guān)系。
USART_LastBit: 選擇在發(fā)送最后一個數(shù)據(jù)位的時候時鐘脈沖是否在SCLK引腳輸出,可以是不輸出脈沖(USART_LastBit_Disable)、輸出脈沖(USART_LastBit_Enable)。它設(shè)定USART_CR2寄存器的LBCL位的值。
5 USART_Rs485
5.1 代碼解析
USART1 作為調(diào)試終端(接收命令、打印結(jié)果),USARTx 作為 RS485 接口(收發(fā)數(shù)據(jù))。通過輪詢方式檢測命令和數(shù)據(jù),演示了 RS485 總線的基本通信流程。適用于需要 RS485 通信的嵌入式系統(tǒng)開發(fā),可作為工業(yè)通信設(shè)備(如 Modbus 從機(jī))的原型基礎(chǔ)。核心邏輯清晰,依賴自定義的rs485.h驅(qū)動實(shí)現(xiàn)硬件細(xì)節(jié),便于移植和擴(kuò)展。程序流程如下:
1. 基礎(chǔ)配置與依賴
頭文件:包含標(biāo)準(zhǔn)庫、延時驅(qū)動(delay.h)、硬件抽象層(W55MH32.h)及自定義 RS485 驅(qū)動(rs485.h)。
宏定義:DATA_LEN指定通信數(shù)據(jù)長度(5 字節(jié))。
全局變量:USART_TEST指向 USART1(調(diào)試串口),rs485buf存儲 RS485 收發(fā)數(shù)據(jù)。
2. 主函數(shù)流程
初始化階段:系統(tǒng)初始化
delay_init():初始化延時函數(shù)。
UART_Configuration(115200):配置 USART1(PA9/TX, PA10/RX)為調(diào)試串口,波特率 115200。打印系統(tǒng)時鐘頻率(SYSCLK/HCLK/PCLK1/PCLK2/ADCCLK)。
RS485 初始化:RS485_Init(9600):配置 RS485 總線(波特率 9600),具體實(shí)現(xiàn)(如 GPIO、USART 配置)封裝在rs485.h中。
主循環(huán)邏輯
int main(void) { uint8_t key; uint8_t rs485buf[5], i; RCC_ClocksTypeDef clocks; delay_init(); UART_Configuration(115200); RCC_GetClocksFreq(&clocks); printf("n"); printf("SYSCLK: %3.1fMhz, HCLK: %3.1fMhz, PCLK1: %3.1fMhz, PCLK2: %3.1fMhz, ADCCLK: %3.1fMhzn", (float)clocks.SYSCLK_Frequency / 1000000, (float)clocks.HCLK_Frequency / 1000000, (float)clocks.PCLK1_Frequency / 1000000, (float)clocks.PCLK2_Frequency / 1000000, (float)clocks.ADCCLK_Frequency / 1000000); printf("USART RS485 Test.n"); RS485_Init(9600); //Initialize RS485 while (1) { if (GetCmd() == 's') { for (i = 0; i < DATA_LEN; i++) { rs485buf[i] = 0x5A + i; } RS485_Send_Data(rs485buf, DATA_LEN); printf("RS485 Send Data Successn"); } RS485_Receive_Data(rs485buf, &key); if (key) //Data received { printf("RS485 Recv Data Successn"); if (key > DATA_LEN) key = DATA_LEN; //The maximum is 5 data. for (i = 0; i < DATA_LEN; i++) { printf("rs485buf[%d] = 0x%xn", i, rs485buf[i]); } } } }
命令檢測(USART1 輸入):通過GetCmd()輪詢 USART1 接收緩沖區(qū),檢測是否收到字符's'。收到's' 后,生成測試數(shù)據(jù)(0x5A~0x5E),調(diào)用RS485_Send_Data發(fā)送。
RS485 數(shù)據(jù)收發(fā):
發(fā)送:周期性發(fā)送預(yù)設(shè)數(shù)據(jù)(如未使用中斷,需確保半雙工模式下的收發(fā)切換)。
接收:調(diào)用RS485_Receive_Data輪詢接收數(shù)據(jù),收到后通過 USART1 打印數(shù)據(jù)內(nèi)容。
調(diào)試輸出:通過重定向的printf輸出狀態(tài)信息(如發(fā)送成功、接收數(shù)據(jù))。
5.2 實(shí)驗(yàn)現(xiàn)象
程序初始化成功之后,會打印輸出各時鐘的頻率和串口測試信息,我們發(fā)送字符“s”,W55MH32就打印了串口發(fā)送成功的消息:
6 補(bǔ)充說明
對于W55M32芯片,各個引腳可以做什么外設(shè)功能或者電氣特性參數(shù)在數(shù)據(jù)手冊 查閱,引腳和外設(shè)的功能特性和對應(yīng)寄存器的使用在 參考手冊 查閱。
以下對于W55MH32芯片,當(dāng)根據(jù)數(shù)據(jù)手冊確定要使用某個引腳做某個外設(shè)功能時,在參考手冊如下查閱外設(shè)的GPIO應(yīng)該如何配置,當(dāng)對各種配置不了解時以能在手冊查閱出的結(jié)果為準(zhǔn)。
6.1 TIM1/TIM8引腳配置
TIM1/TIM8 引腳 | 配置 | GPIO 配置 |
TIM1/8_CHx | 輸入捕獲通道 x | 浮空輸入 |
TIM1/8_CHx | 輸出比較通道 x | 推挽復(fù)用輸出 |
TIM1/8_CHxN | 互補(bǔ)輸出通道 x | 推挽復(fù)用輸出 |
TIM1/8_BKIN | 剎車輸入 | 浮空輸入 |
TIM1/8_ETR | 外部觸發(fā)時鐘輸入 | 浮空輸入 |
6.2 通用定時器TIM2/3/4/5引腳配置
TIM2/3/4/5 引腳 | 配置 | GPIO 配置 |
TIM2/3/4/5_CHx | 輸入捕獲通道 x | 浮空輸入 |
TIM2/3/4/5_CHx | 輸出比較通道 x | 推挽復(fù)用輸出 |
TIM2/3/4/5_ETR | 外部觸發(fā)時鐘輸入 | 浮空輸入 |
6.3 USART引腳配置
USART 引腳 | 配置 | GPIO 配置 |
USARTx_TX | 全雙工模式 | 推挽復(fù)用輸出 |
USARTx_TX | 半雙工同步模式 | 推挽復(fù)用輸出 |
USARTx_RX | 全雙工模式 | 浮空輸入或帶上拉輸入 |
USARTx_RX | 半雙工同步模式 | 未用,可作為通用 I/O |
USARTx_CK | 同步模式 | 推挽復(fù)用輸出 |
USARTx_RTS | 硬件流量控制 | 推挽復(fù)用輸出 |
USARTx_CTS | 硬件流量控制 | 浮空輸入或帶上拉輸入 |
關(guān)于串口中斷的使用,以串口1舉例,在參考手冊、庫內(nèi)定義和啟動文件等可以看出 串口1使用 USART1_IRQn 一個中斷源,使用 USART1_IRQHandler 一個中斷函數(shù),回顧EXIT章節(jié)的補(bǔ)充說明有類似意思, 對于串口1這里,如果使能了多個標(biāo)志位的中斷,它們會在各自的時序流程觸發(fā)中斷,因此在中斷函數(shù)里面用多個GetITStatus函數(shù)判斷標(biāo)志并來做此標(biāo)志的流程操作,查閱手冊中的寄存器描述了解各標(biāo)志位的時序和如何清除標(biāo)志位等, 某些標(biāo)志位優(yōu)先以手冊中有描述的軟件清除流程而可以不使用ClearFlag函數(shù)。
以上補(bǔ)充總結(jié)對之后的外設(shè)學(xué)習(xí)也是同樣道理,注意對于GPIO配置和外設(shè)在不同系列芯片會存在差異,重點(diǎn)在于掌握整體概念,學(xué)會在不同芯片的手冊中查閱對應(yīng)內(nèi)容。
WIZnet 是一家無晶圓廠半導(dǎo)體公司,成立于 1998 年。產(chǎn)品包括互聯(lián)網(wǎng)處理器 iMCU?,它采用 TOE(TCP/IP 卸載引擎)技術(shù),基于獨(dú)特的專利全硬連線 TCP/IP。iMCU? 面向各種應(yīng)用中的嵌入式互聯(lián)網(wǎng)設(shè)備。
WIZnet 在全球擁有 70 多家分銷商,在香港、韓國、美國設(shè)有辦事處,提供技術(shù)支持和產(chǎn)品營銷。
香港辦事處管理的區(qū)域包括:澳大利亞、印度、土耳其、亞洲(韓國和日本除外)。
-
單片機(jī)
+關(guān)注
關(guān)注
6065文章
44934瀏覽量
647657 -
以太網(wǎng)
+關(guān)注
關(guān)注
40文章
5594瀏覽量
174991 -
串口通訊
+關(guān)注
關(guān)注
1文章
265瀏覽量
25419 -
USART
+關(guān)注
關(guān)注
1文章
201瀏覽量
31683
發(fā)布評論請先 登錄
視頻詳解:上海尤老師verilog入門到實(shí)戰(zhàn)第十四課
「正點(diǎn)原子Linux連載」第十四章蜂鳴器試驗(yàn)
第十四講 555定時器

STM32的USART串口通訊程序

【STM32學(xué)習(xí)筆記】串口通訊 — USART / UART

STM32_USART 串口通訊

STM32的USART串口通訊程序

才茂亮相第十四屆配電技術(shù)應(yīng)用大會
【北京迅為】iTOP-i.MX6開發(fā)板使用手冊第四部分固件編譯第十四章非設(shè)備樹Android4.4系統(tǒng)編譯

評論