陶俊豪等

摘 要: 為實現激光測距系統的遠程控制和數據狀態信息采集,提出了一種基于LPC1788微控制器的互聯網智能控制系統。該系統使用FreeRTOS系統作為遠程終端的實時操作系統,并基于emWin圖形用戶界面庫開發了用戶操作界面,然后使用LwIP網絡協議棧實現了網絡狀態采集和控制通信,此外,系統采用微控制器自帶UART的DMA模式實現了遠程數據和狀態信息的采集。該遠程控制系統具有結構簡單、可靠性高、穩定性好等優點,可以推廣到其他智能控制系統和基于物流網的智能家居中。
關鍵詞: LPC1788; FreeRTOS移植; Emwin移植; LwIP協議棧; 遠程控制
中圖分類號: TN302?34 文獻標識碼: A 文章編號: 1004?373X(2015)21?0076?04
LPC1788?based remote intelligent control system of Internet
TAO Junhao, ZHANG Peng, CAI Fei
(Unit 63801 of PLA, Xichang 615042, China)
Abstract: To achieve remote control and data state information collection of laser range?finding system, a LPC1788?based remote intelligent control system of Internet is proposed. The FreeRTOS system is taken as the real?time operating system of remote terminal in this system. The user operation interface is developed based on emWin GUI, and then the network state acquisition and control communication are realized by using LwIP protocol stack. Moreover the acquisition of remote data and state information is realized by adopting DMA mode of the microprocessor with UART. The remote control system has simple structure, high reliability and good stability, and can be extended to other intelligent control systems and logistics?based smart home.
Keywords: LPC1788; FreeRTOS transplant; Emwin transplant; LwIP protocol stack; remote control
0 引 言
隨著Internet的廣泛應用和物聯網技術的飛速發展,基于互聯網的遠程智能控制技術引起工業界的廣泛關注,而嵌入式系統以其低成本、小體積、控制靈活、易集成等特點被廣泛應用于工業控制、智能家居等各種場合。LPC1788微控制器正是在這種情況下推出的,其集成了LCD圖像控制器和10/100M的以太網EMAC,主要是針對各種高級通信、高質量圖像顯示等應用場合,是工業自動化、銷售網點和醫療診斷應用的理想選擇。因而可以用作基于互聯網的遠程智能控制系統中。
1 系統功能
本文提出的遠程智能控制系統是基于一套激光器測距系統的遠程控制,該激光器原有操作方式是通過機械按鈕按下與抬起方式實現散熱開關、發射開關、自檢開關、輸出頻率切換等功能的,并且通過RS 422/RS 485串口輸出測距和其他狀態信息。為實現遠程智能控制,需要設計一套人機交互的遠程控制端,實現測距信息和狀態的采集、水泵和發射開關以及發射頻率切換、測距過量程報警等操作。
為不改變現有電路系統,可以通過網絡或RS 422/RS 485工業串口控制繼電器的開合來實現按鈕的按下與抬起,兩者的區別在于傳輸信號的接口形式不同,而網絡接口可以利用現有Internet布線實現更遠距離的、更安全的信息傳遞。狀態采集方面,RS 422/RS 485串口和網絡接口都可以實現遠距離的數據交互,但是RS 422/RS 485串口形式的數據收發更簡單靈活。由于受制于現有激光器的電路結構和接口形式,本文采用網絡接口實現遠程控制,而測距和狀態數據收發方面采用RS 422/RS 485串口。
在遠程控制端需要設計一個友好的人機交互終端,該終端通過以太網接口和RS 422/RS 485串口與遠程激光器系統通信,實現在LCD屏幕上實時顯示測距信息和狀態、按鈕的遠程觸摸顯示、觸摸屏校正等功能。為此,選擇LPC1788微控制器作為控制核心,該芯片自帶以太網接口、UART接口及LCD控制器,可以極大地簡化設計。由于終端需要完成網絡通信、信息狀態采集、信息實時顯示、按鈕觸摸控制等功能,涉及多個進程,若采用大循環模式將使代碼復雜化降低編程效率,因而此處采用操作系統模式完成終端程序設計;在信息狀態顯示和按鈕觸摸控制方面可以采用圖形化的界面來實現,以增加界面的可視性;在網絡通信方面可以采用嵌入式的網絡通信協議;信息狀態采集方面可以采用基于UART的DMA模式實現大量的數據交互。系統的最終結構圖如圖1所示,圖形化的界面示意圖如圖2所示。
2 實時操作系統的移植[1?3]
為實現網絡數據和串口數據的實時傳輸,需為LPC1788微控制器選擇一個合適的嵌入式實時操作系統(RTOS),可供選擇的有μC/OS?Ⅲ,FreeRTOS,VxWorks及國產實時操作系統等,相較于其他系統而言,FreeRTOS是一個完全免費的操作系統,而且具有資源占用少、代碼公開、可移植、可裁剪、調度策略靈活等特點,可以方便地移植到各種單片機上。作為一個輕量級的操作系統,FreeRTOS提供的功能包括:任務管理、時間管理、信號量、消息隊列、內存管理、記錄功能等,因而本文選擇以FreeRTOS 8.2.0RC1作為操作系統,開發環境采用Keil MDK?ARM 4.72(以下簡稱MDK)。
在FreeRTOS移植方面,由于官網代碼為每種處理器架構和編譯器端口提供了預配置好的應用例程,可以作為移植參考。FreeRTOS代碼根目錄包括兩部分,FreeRTOS Plus包含了除系統外的其他軟件單元,本文用到的代碼都在FreeRTOS目錄中。系統核心代碼包含在FreeRTOS/Source目錄下的tasks.c,queue.c,list.c三個文件中,從8.0.0版本加入了用于內部任務通信和同步的event_groups.c,同目錄下完成軟件定時器和協程功能的timers.c和croutine.c為可選文件,所有實時內核的頭文件位于FreeRTOS/Source/include目錄中。在操作系統接口層方面,每種支持的處理器架構包含了一些架構相關代碼位于FreeRTOS/Source/Portable/[compiler]/[architecture]子目錄下,對應基于Cortex?M3內核的LPC1788在MDK下接口文件為port.c和portmacro.h。此外,在任務、隊列、互斥量、軟件定時器以及時間組創建時需要內核分配內存,系統提供了5種內存分配策略位于FreeRTOS/Source/Portable/MemMang子目錄下,其中heap_1.c只分配不收回,采用數組方式分配內存;heap_2.c采用最佳擬合算法和鏈表分配內存但是不合并相鄰內存塊,可以實現動態創建、刪除任務和隊列;heap_3.c使用編譯器自帶malloc()和free()函數實現申請和釋放內存;heap_4.c采用首次適配法對回收的內存塊進行合并以減少碎片,本文即采用此種方式;heap_5.c除了實現和heap_4.c一樣的功能外,還可以在不連續堆棧的內存堆進行內存分配。
在完成以上代碼文件移植的基礎上,還需要在應用的根目錄下為應用加入一個自定義的配置文件Free? RTOSConfig.h,需配置內容可在官網查閱,其主要實現內核的配置和裁剪,如是否采用搶占式調度、任務最大優先級、時鐘和滴答頻率、是否使用鉤子函數、互斥量、二值信號量、任務通知、堆棧溢出檢測等以及處理器中斷優先級位等。此外,MDK可以將調試輸出信息通過printf()函數重定向到串口或者JTAG的ITM端口,實現調試信息可視化。若要實現此功能,需在工程文件中加入Retarget.c和Serial.c兩個文件(在MDK安裝目錄下可找到),然后定義一個打印信號互斥量以便各個任務都可以通過重定向的端口打印調試信息。完成上述文件的移植后就可以創建任務并啟動任務調度函數,創建任務時需注意設置合理的棧空間,當前任務的棧空間剩余情況可以通過uxTaskGetStackHighWaterMark()函數檢查。
3 顯示系統及emWin圖形用戶界面[4?5]
智能化的遠程控制系統除能進行通信控制外還需要一個友好的人機交互界面,為此本文選擇7寸電阻觸摸屏進行人機交互的設計。電阻觸摸屏的選擇一方面是由降低設計復雜性決定的,另一方面是出于保證長時間工作穩定性的考慮。由于很多誤差源如電子噪聲、比例系數及機械不同軸性會影響觸摸坐標值,因此需要對觸摸屏系統進行校正,考慮到控制系統對按鈕位置準確度要求高,校正選擇tslib五點式校正算法。控制系統除了顯示按鈕以外,還需要顯示測距信息和狀態,并以曲線圖的方式顯示,為提高開發效率和智能化水平,選擇emwin圖形用戶界面。
emwin圖形用戶界面是以C語言編寫的界面,由圖形庫、字體庫、窗口管理器、控件小工具和PC工具等組成,它能提供高效且獨立于處理器和顯示器的圖形用戶界面,用于任何使用圖形進行操作的應用。其與單任務和多任務環境、專用操作系統或任何商業RTOS兼容,可以適用于任何尺寸的、具有任何控制顯示器和CPU的物理和虛擬顯示器。為便于用戶開發,恩智浦公司基于LPC1788微控制器對emwin進行了預編譯生成了emwin庫文件,開發時用戶只需要從恩智浦軟件論壇LPCWARE.COM下載壓縮包就可以獲得相關源文件、說明書、輔助設計工具和板級支持例程(BSP),本文使用的版本為5.24h。
移植時需要加入庫文件、配置文件和頭文件。對于MDK編譯器的庫文件位于NXP\emWin\emWin_library\Keil目錄下,名為emWin_M3.lib,配置文件位于NXP/emWin/emWin_Config目錄下,頭文件位于NXP/emWin/emWin_header目錄下。在目標系統上使用emWin之前,需要對軟件進行配置。配置過程詳見恩智浦軟件官網說明書,其包括GUI配置和LCD配置,GUI配置是對可用功能、默認顏色、字體以及可用存儲器進行配置;LCD配置需要定義顯示器物理尺寸、顯示驅動和顏色轉換程序。
移植完成后,為實現圖2所示的界面,使用窗口管理器創建兩個窗口,一個窗口用于放置控制,另一個窗口放置窗口對象(小工具),包括GRAGPH圖形小工具、文本小工具、編輯小工具。在進行觸摸校正時,使用GUI_SaveContext()函數保存上下文,然后使用WM_InvalidateWindow()和WM_HideWindow()函數隱藏窗口,在完成屏幕校正后使用WM_ShowWindow()和WM_ValidateWindow()函數恢復窗口并使用GUI_RestoreContext()恢復上下文。此外,為支持漢字顯示可以使用GUI_UC_SetEncodeUTF8()函數開啟外語支持,emWin的Tool子目錄含有U2C.exe可以將UTF?8轉換為C編碼,然后在需要顯示漢字字符串的按鈕上使用BUTTON_SetText()函數就可以支持漢字按鈕。
4 LWIP網絡協議棧[6?8]
LPC1788微控制器以太網模塊包含了一個10 Mb/s或100 Mb/s以太網媒體訪問控制器,通過DMA硬件加速來優化性能。以太網物理接口通過標準的MII或簡化的MII(RMII)接口連接外部PHY芯片,本文采用RMII接口連接LAN8720i芯片對外通信,網絡協議棧采用針對嵌入式系統的LwIP輕量級協議棧。LwIP在保證嵌入式產品擁有完整TCP/IP功能的同時,又能保證協議棧對處理器資源的有限消耗,其運行一般只需要幾十KB的RAM和40 KB左右的ROM。為提高開發效率,恩智浦提供了LwIP 1.4.0的源碼、以太網底層驅動文件LPC17_emac.c以及PHY芯片LAN8720的驅動,用戶可以從恩智浦軟件論壇LPCWARE.COM下載lwip_lpc?v1.10.zip壓縮包獲得相關代碼和例程。
在移植帶FreeRTOS操作系統模擬層時,移植的文件除lwip_lpc\lwip?1.4.0\src文件夾下的源文件外,需要自己編寫的文件包括cc.h(主要完成協議棧內部使用的數據類型定義)、lwipopts.h(完成協議棧內核的參數配置)、sys_arch.c以及sys_arch.h(為協議棧提供郵箱、信號量等機制),這些文件在例程中均有參考代碼,需要指出的是,以太網描述數組必須將內存定義到用于存儲外設數據的片上SRAM或連接到外部存儲控制器的SDRAM才能保證描述符和控制符正常收發數據。
在完成上述移植之后就可以創建網絡初始化任務和網絡通信任務了,初始化代碼如下:
board_setup); //RMII端口(GPIO)初始化
tcpip_init(tcpip_init_done_signal,(void *) &tcpipdone);
//創建tcpip_thread進程
while (!tcpipdone) { vTaskDelay(1); }
IP4_ADDR(&gw,192,168,1,1);
IP4_ADDR(&ipaddr,192,168,1,232);
IP4_ADDR(&netmask,255,255,255,0);
netif_add(&lan8720, &ipaddr, &netmask, &gw, NULL, lpc_enetif_init,tcpip_input); //添加網絡接口
netif_set_default(&lan8720);
netif_set_up(&lan8720); //建立連接
NVIC_SetPriority(ENET_IRQn,9); //中斷優先級設定
NVIC_EnableIRQ(ENET_IRQn);
sys_thread_new("tcpecho_thread", lwip_task, NULL,DEFAULT_THREAD_STACKSIZE, DEFAULT_THREAD_PRIO);
while (1) {
lpc_phy_sts_sm(&lan8720); //PHY芯片狀態更新
vTaskDelay(300);}
在網絡通信任務中,LPC1788與網絡繼電器采用UDP協議進行通信,代碼如下:
IP4_ADDR(&net_relay,192,168,1,25); //網絡繼電器地址
conn = netconn_new(NETCONN_UDP);
conn?>recv_timeout=100; //接收超時選項
netconn_bind(conn, IP_ADDR_ANY,7); //綁定端口
while (1) {
while(!(lan8720.flags & NETIF_FLAG_LINK_UP) ) vTaskDelay(50);
netconn_connect(conn, &net_relay,1883);
buf_snd=netbuf_new);
data = netbuf_alloc(buf_snd, 2);
netconn_send(conn, buf_snd); //發送網絡命令
netbuf_free(buf_snd);
netconn_recv(conn, &buf_recv); //接收返回參數
vTaskDelay(10);
netbuf_copy(buf_recv, recv[0], buf_recv?>p?>tot_len);
netbuf_delete(buf_recv);
netbuf_delete(buf_snd);
}
5 基于UART?DMA的數據傳輸
LPC1788的通用DMA控制器支持外設到存儲器、存儲器到外設和存儲器之間的傳輸,使用通用異步收發器的DMA模式可以極大減少處理器負荷,加速傳輸速度。而使用恩智浦軟件論壇提供的標準固件庫可以進一步提高開發效率。LPC1788的UART還可以工作在RS 485模式,要使用DMA方式需要完成端口功能配置、初始化UART及FIFO,GPDMA初始化、設定中斷優先級、設定DMA工作參數、使能中斷和相應通道,在中斷函數給出接收任務的信號量并關閉相應通道,在任務中每接收一次數據都要重新設定下一次DMA接收的工作參數并使能通道。在任務接收到中斷給出的信號量之后需要發數據給圖像顯示進程顯示激光測距機的狀態信息等參數。
6 結 語
本文提出了一種基于LPC1788的智能控制系統,該系統實現了網絡遠程控制和狀態參數接收,因而可以推廣應用到基于物聯網的智能家居和其他智能控制系統中。
參考文獻
[1] 張龍彪,張果,王劍平,等.嵌入式操作系統FreeRTOS的原理與移植實現[J].信息技術,2012(11):31?34.
[2] YIU J. ARM Coretex?M3權威指南[M].宋巖,譯.北京:北京航空航天大學出版社,2009.
[3] 劉濱,王琦,劉麗麗.嵌入式操作系統FreeRTOS的原理與實現[J].單片機與嵌入式系統應用,2005(7):8?11.
[4] 李昕澤,鄧中華.一種工業遠程實時監控系統的實現[J].單片機與嵌入式系統應用,2014,14(1):51?53.
[5] 宋玉貴,尹艷玲.基于LPC1788 emWin中文顯示的設計與研究[J].工具技術,2013,47(7):24?26.
[6] 趙國鋒,馬文武.基于LWIP的嵌入式網絡系統設計與實現[J].微計算機信息,2008,24(23):59?61.
[7] 余曉光.基于實時操作系統FreeRTOS的Lwip協議的移植研究[D].昆明:昆明理工大學,2013.
[8] 宋華魯,閆銀發,張世福,等.基于STM32和FreeRTOS的嵌入式太陽能干燥實時監測和控制系統設計[J].現代電子技術,2013,36(23):103?106.