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

STM32_USART 串口通訊

【北京迅為】iTOP-i.MX6開發板使用手冊第四部分固件編譯第十四章非設備樹Android4.4系統編譯

四維圖新亮相第十四屆智能交通市場年會
第十四章 ADC(下篇)

評論