楊 炯, 曹金華, 王宜懷
(蘇州大學 計算機科學與技術學院,江蘇 蘇州 215006)
串行通信接口(簡稱串行口或串口,可簡寫為UART,或SCI)在USB未普及之前,是PC機必備的通信接口之一。作為設備之間簡便的通信方式,在相當長的時間內,串行口還不會消失,并且在市場上也可很容易地購買到USB到串行口的轉接器。因為簡單且常用,該通信只需要三根線(發送線、接收線和地線),所以UART仍然是MCU與外界通信的簡便方式之一,為現實中的開發帶來極大方便。正因為該通信簡單,在實際應用中卻常常不敢使用而采用復雜的通信方式,比如CAN、USB、以太網等,其實通信穩定可靠不在于協議復雜,而是有問題能否解決,據統計,通信中如果出錯,而一位出錯的可能很大[1],大約90%的誤碼率,所以抑制一位出錯,可以大大解決通信帶來的錯誤。利用UART自身帶有的奇偶校驗方式,因為奇偶校驗能檢驗、但不能糾正一位錯等缺陷,所以采用能自動糾正一位錯且檢驗兩位錯的海明碼方式。
2012年3月14日,ARM公司于中國上海發布了一款擁有全球最低功耗的微處理器ARM Cortex-M0+[2-3]。該處理器采用低成本的90納米低功耗(Low Power,LP)工藝,耗電量僅為9 μA/MHz;飛思卡爾公司在以該微處理器為核的MKL25Z128VLK4[4-6](簡稱KL25)芯片中,仍然包含了三個UART模塊,其實飛思卡爾的芯片大多數包含二個以上,遠比其他通信模塊高,因此探討UART高可靠性應用的研究實現具有非常現實意義。
為了方便軟件編程和推廣應用,本文將研究UART通信結合海明碼校驗技術形成UHM構件[7-8](結合海明碼校驗技術的UART通信構件的簡寫)的實現問題。
以ARM公司最新微處理器ARM Cortex-M0+的飛思卡爾KL25芯片為硬件基礎。
UART的通信運用具有初始化、接收和發送三種基本操作[3,9-10]。
初始化基本操作,完成UART通信工作所需的時鐘源選擇、傳輸方式選擇、是否奇偶校驗、數據幀格式等工作模式設置,以及反映傳輸速度的波特率設置。
發送基本操作,是通過移位寄存器將數據寄存器中字節型一幀數據的變成一位位串行數字,輸送至數據線上,發送時機是通過判斷狀態寄存器UARTx_S1的第7位(TDRE)進行的。
若該位為0,說明發送緩沖區還沒有空閑,待發送的數據還不能裝入其中,需繼續等待,若該位為1,說明發送緩沖區空閑了,待發送的數據能裝入發送緩沖區中,以便發送出去。
發送基本語句(以C語言為例):
while((UART0_S1&(1<<7))==0); //UART0循環等待發送緩沖區空閑,以便能夠發送數據
UART0_D=SendData;
接收基本操作,是將數據線上的一位位數據,接收下來并通過移位寄存器變成字節型一幀數據存入數據寄存器,接收時機是通過判斷狀態寄存器UARTx_S1的第5位(RDRF)進行的。若該位為0,說明所接收的一幀數據還沒有都裝入接收緩沖區,需繼續等待,若該位為1,說明所接收的一幀數據都裝入接收緩沖區中,可以將該幀取走,以便繼續接收下一幀。
接收基本語句(以C語言為例):
while(UART0_S1&(1<<5)==0); //UART0循環等待接收緩沖區裝滿,以便取走所接收的數據
ReData =UART0_D;
海明碼校驗技術[11]是由Richard Hamming于1950年提出的,其實現原理是在信息碼中加入幾個校驗位,將信息碼的每個二進制位分配在幾個奇偶校驗組中,若某一位(不論信息碼還是校驗碼)出錯后,根據所接收的海明碼進行偶校驗,計算出哪位出錯,并糾錯。
比如8位信息碼,為了便于計算哪位出錯,將信息碼(D8…D2D1)和校驗碼(P4…P2P1)一起組合在海明碼(H12…H2H1)中,注:海明碼下標從1開始計數,信息碼順序不變填入海明碼中,但其中海明碼的下標為2m留給校驗碼填寫,即1、2、4、8位。為了區別一位出錯還是兩位出錯,增加一位校驗碼P5,在海明碼中位據H13。
為了便于編程,在此稍作變動,上述海明碼(H13…H2H1)本來需占用兩個字節,但讓其中一個字節保存信息碼,一個字節保存校驗碼,即只是不讓信息碼與校驗碼不混排,但關系保持不變,在編程中會體現。
比如發送方信息碼為D8…D2D1,檢驗一位錯誤并糾正需要校驗碼四個,即P4、P3、P2、P1
設海明碼為H12H11H10H9H8H7H6H5H4H3H2H1
P4、P3、P2、P1根據規則,分別位于:H8、H4、H2、H1
而D8、D7、D6、D5、D4、D3、D2、D1分別位于:H12、H11、H10、H9、H7、H6、H5、H3
據海明碼校驗規則[2],校驗碼的值由下列公式1~4計算:
P1=D1?D2?D4?D5?D7
(1)
P2=D1?D3?D4?D6?D7
(2)
P3=D2?D3?D4?D8
(3)
P4=D5?D6?D7?D8
(4)
為了分清是兩位出錯還是一位出錯,還要補充一個總校驗位P5,使:
(5)
P5位于H13。
為了方便編程,信息碼單獨占用一個字節,校驗碼占用一個字節的后5位。
由此編程實現發送方由信息碼得到校驗碼,然后一起發送。
該函數頭如下。
//函數名稱:send_hmma
//函數參數:data:8位信息碼。
//函數返回:產生校驗位編碼(低5位有效)
//功能概要:發送方對8位信息碼產生5位校驗碼
uint_8 send_hmma(uint_8 data)
接收方收到的海明碼,根據海明碼校驗規則進行校驗,先由式10校驗是一位出錯還是兩位出錯。若一位出錯再由式(6)~(9),檢驗出錯位置,即S4S3S2S1組合值反映該出錯位置值。
若由式(10)得到兩位出錯,丟失所得數據。
為了方便編程,信息碼單獨占用一個字節,校驗碼占用一個字節的后5位。
由此編程實現由所接收的海明碼根據海明碼檢驗規則判斷所接收數據是否正確,檢查發送過程中因干擾而出現的一位錯誤并糾正,而保證接收方所接收信息的準確。若多位錯誤只能丟棄。
該函數頭如下。
//函數名稱:re_hmma
//函數參數:*data:數據位(通過指針可返回糾正后數據值);
// check:校驗位。
//函數返回:0=正確;1=兩位錯
//功能概要:接收方對13位海明碼糾錯并產生8位正確接收數據
uint_8 re_hmma(uint_8 *data,uint_8 check)
根據UART的初始化、接收和發送三種基本操作,按照構件的思想[7],可將它們封裝成三個獨立對外的功能函數,而海明碼的形成和檢錯糾正函數為內部的功能函數。UART初始化函數完成對UART模塊的工作屬性的設定,接收和發送功能函數則完成實際的通信任務,其通信過程中的驗錯糾錯由海明碼形成和檢錯糾正功能函數完成。對UART模塊進行編程,其中涉及到對硬件底層寄存器的直接操作,因此,可將初始化、接收、發送三種基本操作所對應的功能函數共同放置在命名為uart.c的文件中,海明碼形成和檢錯糾正函數作為內部函數也放置在uart.c中,并按照相對嚴格的構件設計原則[2]對其進行封裝,同時配以命名為uart.h的頭文件,用來定義模塊的基本信息和對外接口。
根據以上構件思想,形成以下三個對外函數,其中初始化函數實現流程圖見圖1。

圖1 UART的初始化
初始化函數頭如下:
//函數名稱:uart_init
//功能概要:初始化uart模塊
//參數說明:uartNo:串口號:UART_0、UART_1、UART_2
// sel_clk:選擇串口0時,時鐘源為MCGIRCLK(4 000 Khz)或MCGPLL(48 000 Khz)
// 選擇串口1、2時,時鐘源為BUSCLK(24 000 Khz)
// baud:波特率:300、600、1 200、2 400、4 800、9 600、19 200、115 200 bps
//函數返回:函數執行狀態:0=正常;非0=異常
//說 明:sel_clk若選擇內部時鐘MCGIRCLK,波特率需小于19 200
void uart_init (uint_8 uartNo,uint_32 sel_clk,uint_32 baud_rate);
發送函數實現流程圖如圖2所示。
函數頭如下:
//函數名稱:uart_send1
//參數說明:uartNo: 串口號:UART_0、UART_1、UART_2
// ch :要發送的字節
// yn :是否要海明碼校驗: yn =0,不要;yn =1,要
//函數返回:函數執行狀態:0=正常;非0=異常。
//功能概要:UART發送1個或者2個字節(2個中第一個為海明校驗碼)
uint_8 uart_send1(uint_8 uartNo, uint_8 ch, uint_8 yn);
接收函數實現流程圖如圖3所示,函數頭如下。
//函數名稱:uart_re1
//參數說明:uartNo: 串口號:UART_0、UART_1、UART_2
// fp:接收成功標志的指針:*fp=0,成功接收;*fp=1,接收失敗
// yn:是否要海明碼校驗: yn=0,不要;yn=1,要
//函數返回:接收返回1個字節
//功能概要:UART共接收1個或者2個字節
uint_8 uart_re1 (uint_8 uartNo,uint_8 *fp, uint_8 yn);


圖2 uart_send1函數流程圖 圖3 uart_re1函數流程圖
為了檢驗UHM構件的驗錯糾錯功能,在即將發送的海明碼里,有意改變其中某一位,使之成為錯誤的編碼,再發送,接收方接到編碼,由程序處理,若糾錯成正確碼,則說明該程序編程沒有問題,否則程序要調試修正。
為了UHM構件的測試,搭建PC與MCU通信,PC方用C#語言編程實現串行口通信含海明碼校驗進行接收發送數據的功能。
運行界面如圖4所示。通信測試方式有兩種:
(1) MCU端形成海明碼并發送海明碼,PC端接收海明碼并驗錯糾錯。點擊“發送信息(Send Info)”,PC機將信息碼D8…D1發送給MCU,并將海明碼是否校驗和人工干預的某位出錯位號等指令也發送給MCU,MCU接收到信息碼后,按照指令將信息碼轉換為海明碼,及海明碼對應位號數字變動,成為出錯的海明碼,然后將出錯的海明碼,發送給PC機,PC機將進行海明碼驗錯糾錯處理,并顯示。
(2) PC端形成海明碼并發送海明碼,MCU端接收海明碼并驗錯糾錯。通過串行口,點擊“發送數據(Send Data)”按鈕,PC機將信息碼D8…D1和校驗碼P5…P1一起發送給MCU,其中含人工干預的某一位出錯,MCU接收到編碼后進行海明碼驗錯糾錯處理,再回送給PC機顯示。

圖4 測試UHM構件的工程運行界面
通過以上的KL25的UART通信的融入海明碼校驗技術的編程設計,構建了3個可移植并重用于Freescale. Kinetis L系列所有UART的構件,通過了測試并進行了封裝,使得該校驗技術UART通信的應用變得易用又可靠。但在抗干擾非常強的場合,引起多位錯差,這將無法糾正與檢測出來,可考慮采用檢錯能力更強的編碼(如循環冗余校驗碼),但冗余度相應會大大增加。或者在硬件方面同時使用差分方式完善UART通信,差分方式的使用并不影響軟件編程,如此將大大提高UART的應用前景。
本測試工程不僅應用于系統開發中,而且是理解和掌握海明碼校驗概念的好實驗題材方案[12-13],完成項目與實踐教學的轉換[14-15],所以該測試工程已應用于硬件實驗室[16],輔助學生理解掌握概念。
[1] 趙軍軍.海明碼在微機信息傳輸中的糾錯原理與應用[J].寶雞文理學院學報(自然科學版),1997,17(1):54-58.
ZHAO Jun-jun. Error-correcting Principle And Applications In Microcomputer Information Transmission With Hamming code[J].Baoji University of Arts and Sciences Journals Press(Natural Science Edition),1997,17(1):54-58.
[2] ARM. Cortex-M0+ Technical Reference Manual Rev.r0p0[EB/OL]. http://www.freescale.com.cn,2012.
[3] 王宜懷,朱仕浪,郭 蕓.嵌入式技術基礎與實踐教程(第3版)[M].北京:清華大學出版社,2013:26-155.
[4] Freescale. Kinetis L Peripheral Module Rev.0[EB/OL]. http://www.freescale.com.cn,2012.
[5] Freescale Inc. KL25 Sub-Family Reference Manual Rev.3[EB/OL]. http://www.freescale.com.cn,2012.
[6] 曹金華,賀黎瀟,沈安東,等.基于KL25的AD轉換動態在線校正技術[J].實驗室研究與探索,2013,212(10):249-252.
CAO Jinhua,He Li-xiao,Shen An-dong.AD Conversion Technique of Online Dynamic Reviser Based on KL25[J].Research and Exploration in Laboratory, 2013,212(10):249-252.
[7] 蔣銀珍,王宜懷,王加俊. 基于硬件構件的底層軟件構件開發方法研究[J].微計算機信息, 2010,309(14):77-79.
JIANG Yin-zhen, WANG Yi-huai, WANG Jia-jun. Development Method Research for Bottom Driver Based on EHC[J].Microcomputer Information, 2012,185(2):91-94.
[8] 曹金華,李 映,沈安東,等. 基于XS128的P-Flash之ICP構件的設計與實現[J].實驗技術與管理,2012(2):91-94.
CAO Jinhua,LI Ying,SHEN An-dong.Design And Implementation Based On XS128 P-Flash ICP Compents[J]. Experimental Technology and Management,2012(2):91-94.
[9] 王宜懷,曹金華.嵌入式系統設計實踐——基于飛思卡爾S12X微控制器[M].北京:北京航空航天大學出版社,2011:157-165.
[10] 王宜懷,陳建明,蔣銀珍.基于32位ColdFire構建嵌入式系統[M].北京:電子工業出版社,2009:82-92.
[11] 王愛英.計算機組成與結構(第5版)[M].北京:清華大學出版社,2013:62-64.
[12] 張清祥.探索實驗教學載體,培養學生實踐創新能力[J].實驗技術與管理, 2012,29(2):130-133.
ZHANG Qing-xiang.Exploring A Carrier For Exercising Experiment And Practice And Cultivating Students’ Innovative Practice Ability[J]. Experimental Technology and Management, 2012,29(2):130-133.
[13] 李曉勇,周麗濤.提升計算機專業實踐能力的研究與探索[J].計算機教育,2010(1):116-118.
LI Xiao-yong,ZHOU Li-tao. Research And Exploration Of Enhancing Computer Professional Practice.Competer Education, 2010(1):116-118.
[14] 徐 昊.以“項目”為引擎,探索“工學結合”實踐教學新方法[J].計算機教育,2010(17):126-128.
XU Hua.Discussion on Work-integrated Learning Method Based on Engine of Projects[J].Competer Education,2010(17):126-128.
[15] 官 頌,張 鵬,董艇艦,等.擴招背景下提高實踐教學質量的方法研究與實踐[J].實驗技術與管理, 2011,28(8):126-128,132.
GUAN Song,ZHANG Peng,DONG Tingjian,etal.Research and practice on improving quality of practical teaching under background of enrollment expansion[J].Experimental Technology and Management,2011,28(8):126-128,132.
[16] 馬漢達,鮑可進.計算機硬件課程實驗教學改革與實踐[J].實驗室研究與探索,2013(10):360-362.
MA Han-da,BAO Ke-jin.Reform and practice of experimental teaching of computer hardware[J].Research and Exploration in Laboratory, 2013(10):360-362.