袁 博,蘭文濤
(1.西安鐵路職業技術學院 陜西 西安 710014;2.華為科技有限公司西安研究所 陜西 西安 710000)
WinCE下步進電機驅動程序的設計與應用
袁 博1,蘭文濤2
(1.西安鐵路職業技術學院 陜西 西安 710014;2.華為科技有限公司西安研究所 陜西 西安 710000)
為了實現S3C2440開發板中的GPIO流接口驅動開發,完成了在WinCE下驅動程序所包含的函數以及如何在應用程序中調用驅動程序的開發過程,并解決了控制步進電機運動的工作問題,對在WinCE下開發流驅動以及控制步進電機的運動具有一定的啟示作用。
WinCE;GPIO驅動;步進電機
隨著計算機和通信技術的迅速發展,嵌入式系統在各行業得到了廣泛應用。WinCE系統是微軟公司推出的一種開放的、可裁剪的、32位實時嵌入式操作系統,被廣泛應用于工業控制、移動通信、汽車電子、個人消費品等各個領域。WinCE作為嵌入式系統,有其自身的特殊性,為了提高運行效率,所有驅動皆為動態鏈接庫(DLL),驅動實現可以通過標準流接口函數。對于大多數GPIO外圍設備來說,適用于采用流接口驅動程序模型來開發驅動程序。文中在 WinCE下開發了GPIO驅動程序,然后將其燒寫進內核映像重新加載,為控制步進電機開發所用。
WinCE驅動從結構上講分為本地驅動和流接口驅動。本地驅動專為頂層內置硬件而設計,如鍵盤、觸屏等。這類驅動程序總是在WinCE平臺啟動時被自動加載。與本地驅動程序相對應的是流接口驅動,它是一般類型的設備驅動程序,在實現形式上表現為一個動態鏈接庫DLL,由一個叫做設備管理(Device Manager)程序的特殊應用程序加載、管理和卸載。流接口驅動程序是一種可以定制接口的驅動模型,它的接口是一組固定的流接口函數(見表1),具有很高的通用性,WinCE所有的驅動程序都可以通過這種方式來實現。
由于流接口驅動程序經過編譯后,最終生成的驅動程序文件為dll文件,所以流接口函數也稱作流接口驅動程序的dll接口,這些函數與硬件打交道。在應用層上,開發者通過使用文件系統 API函數:CreatFile、DeviceIoContronl、ReadFile、WriteFile與驅動程序打交道,進行對驅動程序的調用以及功能開發。

表1 流接口驅動函數
2.1WinCE下GPIO工作原理
在WinCE中,程序訪問的地址都是虛擬地址,因此要訪問硬件物理地址,必須將硬件物理地址空間映射到虛擬空間。GPIO口是一個比較重要的概念,用戶可通過GPIO口和硬件設備進行數據交互,控制硬件設備 (如步進電機等)工作,讀取硬件設備的工作狀態數據等。在ARM9平臺上,WinCE系統將GPIO的實地址(S3C2440A的GPIO的基地址為 0x56000000)映射到虛擬地址空間(GPIO對應為0xB1600000),這樣,通過對這段虛擬地址空間的操作,就能夠完成對GPIO或者其他片內資源的控制、輸入輸出工作。
S3C2440A一共有8組GPIO口,117個引腳。這些GPIO口大部分是復用的,可以作為輸入、輸出以及特殊功能口,通過配置寄存器 (GPxCON)來配置為不同的功能。步進電機GPIO口的控制首先需要設置GPxCON寄存器為輸出功能,然后再通過設置GPxDAT寄存器的值為0或1來實現控制GPIO口的高低電平,發送脈沖信號。
2.2GPIO驅動實現過程
WinCE下GPIO驅動程序開發,不管是什么設備,它們的實現框架都是相同的,實際上就是完成一個典型的流接口驅動程序設計,只要把相關的流接口函數實現即可。文中驅動程序的所有文件名用GPIO來命名,實現過程如下:
1)新建GPIO_Driver cpp文件,添加一些頭文件和完善接口函數的內容,主要有:GPI_Init()函數主要是定義一個寄存器結構變量,并給這個變量分配空間并映射到寄存器的空間上。VirtualAlloc()函數的功能是申請一塊虛擬內存空間,該空間 的 大 小為 sizeof(S3C2440_IOPORT_REG) 字 節 。VirtualCopy()函數的功能是將VirtualAlloc()函數申請到的虛擬空間映射到 GPIO寄存器的物理地址(PVOID)(S3C2440_BASE_REG_PA_IOPORT>>8)。經映射后,通過全局結構體變量指針v_pIOPregs就可以訪問GPIO寄存器了。GPI_Open()和GPI_Close()函數主要是為應用程序調用GPIO驅動時提供打開或者關閉的句柄,GPI_IoControl()函數用于設置寄存器。因為GPIO都設置為輸出口,故GPI_Read()函數未用到。GPI_Deinit()函數為驅動卸載函數。
2)創建.def文件,指出需要導出的函數。內容如下:

3)新建注冊表文件gpi.reg,內容如下:

4)新建Makefile文件,內容如下:

該文件指出了驅動程序的編譯和鏈接方法,但實際上該文件并不做什么事情,具體的方法由Sources文件進行設置。
5)新建Sources文件,內容大致如下:

Sources文件,編譯和鏈接文件,用于設置連接器和編譯器,指出驅動程序的編譯和鏈接方法。
6)生成GPI.dll動態鏈接庫,這就是流接口驅動程序的源代碼經過PB的編譯生成的DLL,該文件就是WinCE設備管理器能夠識別并管理的流接口驅動程序文件。
7)將驅動文件編譯進內核
①修改dirs文件,添加以下內容:

②修改dirs文件,添加以下內容:

加入這一行,指明在生成 WinCE內核映像時自動將GPIO.dll加入到內核映像。
③修改platform.reg文件,添加以下內容:

到此,GPIO口驅動程序所需的文件就修改完畢了,重新編譯內核將生成的映像文件燒寫到開發板,完畢后自動啟動WinCE,到這里驅動程序就全部燒寫完成了。
步進電機是將電脈沖信號轉變為角位移或線位移的開環控制元步進電機件。當步進驅動器接收到一個脈沖信號,它就驅動步進電機按設定的方向轉動一個固定的角度。即要使步進電機運動,只需對應引腳輸出高電低電平即可。
利用VS2005開發一個可運行在S3C2440開發板WinCE下的應用程序,該應用程序通過調用GPIO驅動來控制步進電機運動。由于GPIO驅動為流驅動程序,用CreatFile()函數以文件方式打開驅動,內容為:


然后使用該句柄調用DeviceIoControl()函數,內容為:

利用Sleep()函數進行高低電平延時發送步進電機所需的脈沖信號。
應用程序編制完后,示波器與S3C2440控制器相應端口連接好后,在VS2005下運行程序,軟件ActiveSync通過USB與其通信,將在GPIO應用層編制的步進電機運動程序部署到開發板后,給GPB5和GPA10兩個端口發送高低電平,分別延時100 ms和50 ms輸出脈沖波形如圖1所示。

圖1 示波器輸出波形
本文主要介紹了在WinCE嵌入式系統下一種實現GPIO驅動程序的方法,利用VS2005開發工具實現了S3C2440控制器的GPIO控制步進電機運動,對在WinCE下開發其它驅動程序以及控制步進電機的運動具有一定的啟示作用。
[1]王鴻鈺,朱恩.步進電機控制技術入門[M].上海:同濟大學出版社,1990.
[2]姜波.Windows Embedded CE程序設計實踐[M].北京:機械工業出版社2009.
[3]何宗鍵.Windows CE嵌入式系統[M].北京:北京航空航天大學出版社,2006.
[4]楊澤輝,徐燕玲,劉碧君等.基于嵌入式WinCE的GPIO驅動開發[J].太原科技大學學報,2010,31(6):446-448.
[5]胡秀風,丁承君,張明路,等.Windows CE下GPIO驅動程序的設計與應用[J].微計算機信息,2009,25(6-2):281-283.
[6]周立功等.ARM&WinCE實驗與實踐——基于S3C2410[M].北京:北京航空航天大學出版社,2007.
The design and application of stepper motor drive for WinCE
YUAN Bo1,LAN Wen-tao2
(1.Xi'an Railway Vocational&Technical Institute,Xi'an 710014,China;2.Huawei Technologies Co.,LTD.Xi'an Research Institute,Xi'an 710000,China)
In order to satisfy the stream interface driver development of S3C2440 board,WinCE driver contains function and how to call the driver in the application program is accomplished in this paper,the stepper motor motion has also insolved,the process can be enlighten to development stream driver and control stepped motor motion.
WinCE;GPIO drive;stepper motor
TN409
A
1674-6236(2016)16-0174-03
2015-08-22稿件編號:201508112
袁 博(1984—),女,陜西宜川人,碩士研究生,助教。研究方向:供用電技術及其自動化控制。