余新栓
(陜西理工學(xué)院 電氣工程系,漢中 723000)
余新栓(講師),主要研究領(lǐng)域?yàn)榍度胧较到y(tǒng)應(yīng)用、計(jì)算機(jī)測(cè)量與控制。
在嵌入式應(yīng)用軟件設(shè)計(jì)中,開(kāi)發(fā)人員應(yīng)該運(yùn)用現(xiàn)代軟件工程思想和先進(jìn)的軟件開(kāi)發(fā)方法,快速完成軟件的開(kāi)發(fā)和維護(hù)工作[1]。STM32系列微控制器是一款基于ARM Cortex-M3內(nèi)核的高性能、低成本、低功耗的嵌入式應(yīng)用產(chǎn)品。目前,編寫STM32應(yīng)用程序主要有兩種方式。大部分學(xué)習(xí)使用STM32的用戶都從固件庫(kù)函數(shù)開(kāi)始,通過(guò)使用ST公司提供的固件庫(kù)中的庫(kù)函數(shù)來(lái)配置CPU,建立工程后調(diào)用片內(nèi)資源的各種功能。另外一些用戶不使用或很少使用庫(kù),通過(guò)直接操作寄存器的方式使用STM32。上述方法需要花費(fèi)一定的精力熟悉固件庫(kù),或者要求熟悉眾多的寄存器結(jié)構(gòu)及其定義,程序開(kāi)發(fā)效率較低。
Matlab是由美國(guó)Mathworks公司發(fā)布的主要面對(duì)科學(xué)計(jì)算、可視化以及交互式程序設(shè)計(jì)的計(jì)算環(huán)境,在很大程度上擺脫了傳統(tǒng)非交互式程序設(shè)計(jì)語(yǔ)言(如C語(yǔ)言)的編輯模式,代表了當(dāng)今國(guó)際科學(xué)計(jì)算軟件的先進(jìn)水平。利用工具箱擴(kuò)展 Matlab環(huán)境,可以解決應(yīng)用領(lǐng)域內(nèi)特定類型的問(wèn)題[2]。本文介紹針對(duì)嵌入式ARM Cortex-M3內(nèi)核STM32微控制器的目標(biāo)模塊庫(kù),并通過(guò)實(shí)例說(shuō)明基于Matlab建模的STM32軟件快速開(kāi)發(fā)方法。
RapidSTM32是一種針對(duì)STM32系列微控制器開(kāi)發(fā)的Simulink目標(biāo)模塊庫(kù)和設(shè)備驅(qū)動(dòng)程序的工具套件。RapidSTM32在高性能的圖形編程語(yǔ)言、STM32微控制器應(yīng)用之間架起了一座橋梁。該模塊庫(kù)利用MathWorks公司的Real-Time Workshop嵌入式編碼器的代碼生成能力,直接自動(dòng)產(chǎn)生程序代碼,實(shí)現(xiàn)了數(shù)字IO、USART、PWM、ADC的等功能程序和工程的自動(dòng)生成。其主要目標(biāo)是幫助用戶(尤其是嵌入式系統(tǒng)初學(xué)者)實(shí)現(xiàn)諸如實(shí)時(shí)事件驅(qū)動(dòng)、卡爾曼濾波等復(fù)雜的系統(tǒng)算法應(yīng)用程序,而不需要了解底層的設(shè)備配置或調(diào)試。借助該模塊庫(kù),用戶能夠利用可視化的交互式程序設(shè)計(jì)環(huán)境,不用手工編寫C或匯編語(yǔ)言代碼,就可以將在Matlab/Simulink下的建模算法翻譯轉(zhuǎn)換為基于STM32微控制器的嵌入式系統(tǒng)程序。
為保證軟件的統(tǒng)一性、一致性、可操作性和版本的連續(xù)性,并能夠在最小環(huán)境下開(kāi)發(fā)成功,需要合理配置相關(guān)軟件。經(jīng)實(shí)驗(yàn)驗(yàn)證,在Microsoft Windows XP SP2下使用RapidSTM32系統(tǒng)最低軟件配置如下:
◆ Matlab 2009a(version 7.8)
◆ Simulink 2009(version 7.3)
◆ Real-Time Workshop 2009(version 7.3)
◆ Real-Time Workshop Embedded Coder 2009 (version 5.3)
◆ RealView MDK for ARM(version 4.0)
◆ Microsoft.Net Framework(version 3.5)
配置完成后,在RapidSTM32開(kāi)發(fā)模塊官方網(wǎng)站http://www.aimagin.com下載 RapidSTM32blockset,解壓后在Matlab 2009下打開(kāi)并安裝RapidSTM32blockset即可。
利用RapidSTM32,基于Matlab的STM32軟件快速開(kāi)發(fā)過(guò)程包括建模、代碼生成、工程編譯、運(yùn)行調(diào)試等環(huán)節(jié),如圖1所示[3]。這里重點(diǎn)介紹根據(jù)建模與代碼生成方法。
圖1 基于MATLAB的STM32軟件開(kāi)發(fā)過(guò)程
2.2.1 建模與仿真
按照上面方法成功安裝了目標(biāo)庫(kù)后,打開(kāi)系統(tǒng)仿真工具箱Simulink,在庫(kù)瀏覽器中就會(huì)看到針對(duì)嵌入式ARM Cortex-M3STM32微控制器的目標(biāo)模塊庫(kù)RapidSTM32 blockse。在Matlab 2009下為STM32軟件建立一個(gè)mdl文件。其中一個(gè)系統(tǒng)仿真模型中可以有一個(gè)或多個(gè)圖模塊。為了仿真STM32嵌入式軟件系統(tǒng),首先需要加入系統(tǒng)時(shí)鐘設(shè)置和相應(yīng)的STM32功能模塊模型。然后根據(jù)硬件目標(biāo)板和系統(tǒng)工作環(huán)境的情況為STM32的功能模塊模型合理設(shè)置參數(shù),比如DAC模塊的引腳安排、輸出數(shù)據(jù)來(lái)源等。對(duì)應(yīng)于實(shí)際系統(tǒng),在Simulink環(huán)境中用多個(gè)子模塊建立嵌入式系統(tǒng)軟件模型。
2.2.2 生成代碼
根據(jù)算法在Matlab/Simulink中建模并完成系統(tǒng)仿真后,選擇RealView MDK作為生成語(yǔ)言的種類,用Build model命令將所建立的模型轉(zhuǎn)換成MDK C代碼,會(huì)產(chǎn)生用于建立工程的多個(gè).C文件和.h文件。選擇Keil μVision4作為目標(biāo)嵌入式系統(tǒng)的軟件編譯環(huán)境。
用RealView MDK編譯環(huán)境構(gòu)建工程,把模型生成的嵌入式系統(tǒng)軟件C語(yǔ)言代碼在KeilμVision4環(huán)境下編譯通過(guò),下載到目標(biāo)嵌入式系統(tǒng)的STM32中運(yùn)行,觀察代碼運(yùn)行情況,并與手工代碼運(yùn)行情況進(jìn)行對(duì)比。對(duì)生成的軟件程序完成工程進(jìn)行編譯,編譯結(jié)果下載到目標(biāo)系統(tǒng)中執(zhí)行,可以滿足系統(tǒng)功能要求。
實(shí)際工程中經(jīng)常需要產(chǎn)生滿足一定要求的信號(hào)波形。下面的實(shí)例說(shuō)明如何通過(guò)模型化設(shè)計(jì)方法,利用Rapid-STM32模塊庫(kù)自動(dòng)生成C語(yǔ)言代碼,快速實(shí)現(xiàn)控制STM32的DAC模塊的應(yīng)用方法。本設(shè)計(jì)實(shí)例中,讓STM32的DAC產(chǎn)生y(t)=1.0*sin(w*t)+2函數(shù)波形。
首先編寫產(chǎn)生上述數(shù)學(xué)函數(shù)波形的運(yùn)算式并運(yùn)行。在Matlab命令窗口運(yùn)行下面的運(yùn)算式:
運(yùn)行后得到繪制波形的各個(gè)參數(shù),刪除掉說(shuō)明信息文字后將計(jì)算波形數(shù)據(jù)整理成如下數(shù)組表達(dá)形式:[2.0000 2.0314 2.0628 2.0941 2.1253 2.1564 2.1874 2.2181 2.2487 2.2790 ……]。
在Simulink Library Browser窗口里,選擇File/New/Model命令,打開(kāi)模塊設(shè)計(jì)窗口,新建一個(gè)模型并保存為sin_boxing.mdl。打開(kāi) Matlab/Simulink窗口,從Simulink中選擇示波器加入到sin_boxing模塊設(shè)計(jì)窗口,從Rapid-STM32庫(kù)中分別選擇Device Configuration下的系統(tǒng)時(shí)鐘設(shè)置與On-chip peripherals下的任意函數(shù)發(fā)生器模塊加入sin_boxing模塊設(shè)計(jì)窗口工作區(qū),最后將各元件連接。
選擇 Simulation/Configuration Parameters命令,在Configuration Parameters窗口的Real-Time Workshop項(xiàng)目設(shè)置中,將Target selection選項(xiàng)中選擇System target file為rapidstm32.tlc,Language選項(xiàng)設(shè)置為C。在 Real-Time Workshop/rapidstm32/options項(xiàng)目設(shè)置中將輸出文件交叉編譯工具選擇為RealView MDK。
接下來(lái)設(shè)置各模塊參數(shù),完成系統(tǒng)時(shí)鐘設(shè)置和DAC參數(shù)設(shè)置。設(shè)置DAC Mode為Arbitrary DAC1,將上面步驟中生成的數(shù)據(jù)復(fù)制到DAC數(shù)據(jù)欄,根據(jù)信號(hào)頻率將采樣時(shí)間設(shè)置為0.000 1s。所有參數(shù)設(shè)置完畢后,連續(xù)運(yùn)行兩次Update Diagram命令兩次后保存。參數(shù)設(shè)置完成后構(gòu)建的STM32嵌入式系統(tǒng)模型如圖2所示。
圖2 完成參數(shù)設(shè)置的STM32DAC仿真模型
運(yùn)行模型后,可以觀察到如圖3所示的輸出波形,說(shuō)明模型正確。在Matlab文件路徑窗口確定生成代碼輸出路徑后,在 Tool菜單下單擊 Real-Time Workshop/Build model命令開(kāi)始自動(dòng)生成MDK工程文件及代碼,命令窗口中開(kāi)始輸出各種代碼文件生成信息,直至輸出如下信息形式,表示代碼文件生成過(guò)程結(jié)束。
圖3 軟件模型仿真輸出波形
按照前面確定的代碼文件輸出路徑,就可以發(fā)現(xiàn)自動(dòng)生成的各種文件,如圖4所示。在MDK將生成的文件編譯成可執(zhí)行文件下載到STM32目標(biāo)板即可順利執(zhí)行。
圖4 生成的部分文件
① 針對(duì)STM32微控制器目標(biāo)系統(tǒng)的軟件開(kāi)發(fā),利用專用模塊庫(kù)建立嵌入式系統(tǒng)軟件仿真模型,實(shí)現(xiàn)系統(tǒng)軟件代碼自動(dòng)生成。與手工編寫代碼的開(kāi)發(fā)周期相比,大大縮短了STM32系統(tǒng)軟件的開(kāi)發(fā)周期,節(jié)約了時(shí)間成本,加快了開(kāi)發(fā)進(jìn)度。
② 使用具有可視化、交互式程序設(shè)計(jì)環(huán)境,把圖形化的算法與模型設(shè)計(jì)方法應(yīng)用于ARM Cortex-M3內(nèi)核的STM32系列微控制器嵌入式軟件開(kāi)發(fā),降低了STM32系列微控制器程序設(shè)計(jì)難度,降低了軟件工程師的勞動(dòng)強(qiáng)度。
[1]劉玉良,李剛,康凱.基于MATLAB的嵌入式系統(tǒng)軟件開(kāi)發(fā)[J].天津大學(xué)學(xué)報(bào),2008,41(5).
[2]http://www.mathworks.com/matlabcentral/newsreader/view_thread/255878.
[3]http://www.aimagin.com/.
[4]Stephen J Chapman.MATLAB編程影印版[M].2版.北京:科學(xué)出版社,2003.