




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、基于Cortex-M4的配電(pi din)終端實(shí)時(shí)應(yīng)用平臺(tái)軟件設(shè)計(jì)報(bào)告1 設(shè)計(jì)(shj)背景看了網(wǎng)絡(luò)上有多篇介紹基于飛思卡爾Kinetis的FTU設(shè)計(jì)方案,筆者對(duì)飛思卡的kinetis系列芯片也有所關(guān)注,在飛思卡爾與萬利共同設(shè)計(jì)推出的MAPS-K64開發(fā)套件初期心理癢癢地就不由自主地購入了一套,由于專注工作等原因一直沒空把這板子(bn zi)用起來。目前筆者手頭還有NXP LPC1768,IMX.287, STM32F4,CC2530,MSP430F等開發(fā)板,這些板子也僅使用過一段時(shí)間后就閑置在工具箱里躺著了。當(dāng)下創(chuàng)客是一個(gè)充滿活力與希望年輕群體,李總理大力推進(jìn)“大眾創(chuàng)業(yè)萬眾創(chuàng)新”,高度關(guān)注
2、并為創(chuàng)客們點(diǎn)贊。當(dāng)看著這一大堆用真金白銀購入的板子還閑置在工具箱里,某天心頭來勁一定不能白瞎花這個(gè)錢得把它們折騰起來,咱也要用實(shí)際行動(dòng)向創(chuàng)客精神致敬。首當(dāng)其沖被選中是MAPS-K64開發(fā)套件,一是因?yàn)镵64強(qiáng)悍的性能,二是開發(fā)套件提供的外設(shè)資源較為豐富,基于它設(shè)計(jì)一個(gè)FTU軟件方案實(shí)現(xiàn)最為強(qiáng)勁的實(shí)時(shí)響應(yīng)性能,因?yàn)楣P者熱鐘于RTOS的應(yīng)用設(shè)計(jì),碼農(nóng)當(dāng)用上RTOS后完全不想回到“裸奔”時(shí)代,配電網(wǎng)的FTU軟件設(shè)計(jì)一直崇尚“裸奔”,對(duì)此我只想以本設(shè)計(jì)報(bào)告來證實(shí)應(yīng)用RTOS實(shí)時(shí)效果更為優(yōu)越。筆者手中沒有飛思卡爾官方設(shè)計(jì)的FTU方案軟件源碼,本軟件方案純屬按個(gè)人思路進(jìn)行全新設(shè)計(jì),不存在如有雷同的情形,筆
3、者崇尚開源精神,恪守職業(yè)道德,首選應(yīng)用開源軟件代碼,本方案未采用任何與FTU相關(guān)公司的商業(yè)代碼(可以說完全擁有自主知識(shí)產(chǎn)權(quán),嘿嘿,開個(gè)玩笑,本軟件方案未申請(qǐng)經(jīng)有關(guān)部門審核頒布認(rèn)證_),包括MAPS-K64開發(fā)套件提供的例程都未使用,它的部分例程還是完全不能用的,各模塊均按照統(tǒng)一規(guī)范進(jìn)行設(shè)計(jì)驗(yàn)證。芯片驅(qū)動(dòng)采用飛思卡爾Kinetis最新的軟件開發(fā)包KSDK V1.2,其它中間庫則采用開源軟件代碼(除emWin外,僅個(gè)人學(xué)習(xí)評(píng)估使用,未用于商業(yè)用途)。由于資源、時(shí)間等因素受限,現(xiàn)階段未具有交流采樣板、開入開出板,專業(yè)試驗(yàn)設(shè)備等無法模模擬饋線故障,因而本期主要成果是搭建FTU軟件設(shè)計(jì)平臺(tái),具備FTU基
4、礎(chǔ)應(yīng)用功能,在軟件設(shè)計(jì)上以極致高效的設(shè)計(jì),力求在實(shí)時(shí)響應(yīng)上實(shí)現(xiàn)最高性能,達(dá)到實(shí)時(shí)應(yīng)用評(píng)估目的,在II期則補(bǔ)充實(shí)現(xiàn)FTU其余軟件功能,形成一個(gè)完整的軟件實(shí)現(xiàn)方案。本方案預(yù)期分為三個(gè)階段實(shí)施,I期為軟件開發(fā)平臺(tái)搭建,具備FTU基礎(chǔ)功能,II期為故障判斷,標(biāo)準(zhǔn)通信協(xié)議,數(shù)據(jù)存儲(chǔ),超低功耗BLE的應(yīng)用,基于Qt的維護(hù)配置工具(gngj)的實(shí)現(xiàn),III期為設(shè)計(jì)交直流和開入開出板驗(yàn)證,項(xiàng)目眾籌等(大膽(ddn)臆想,不一定具備實(shí)施條件)。本文為I期開發(fā)已基本完成的情況(qngkung)作一個(gè)總結(jié)報(bào)告,主要目的有如下三個(gè)方面:1、基于Cortex-M4和RTOS的實(shí)時(shí)響應(yīng)特性展現(xiàn);2、闡述個(gè)人對(duì)FTU軟件框
5、架設(shè)計(jì)的理解與其高效程序設(shè)計(jì)的一些思想;3、杜絕閉門造車自我感覺良好的局面,與人分享吸納各方改進(jìn)提升建議。2 配電網(wǎng)監(jiān)控終端介紹智能配電網(wǎng)是智能電網(wǎng)的重要組成部分,其主要實(shí)現(xiàn)配電系統(tǒng)正常運(yùn)行及事故情況下的監(jiān)測、保護(hù)、控制、用電和配電管理的智能化。智能配網(wǎng)系統(tǒng)配用電自動(dòng)化系統(tǒng)由主站、通信系統(tǒng)、自動(dòng)化監(jiān)控終端設(shè)備三大部分構(gòu)成,形成一個(gè)完整的信息傳輸與處理系統(tǒng),實(shí)現(xiàn)對(duì)配電網(wǎng)運(yùn)行的遠(yuǎn)程管理。其中自動(dòng)化監(jiān)控終端設(shè)備包括饋線終端(Feeder Terminal Unit,F(xiàn)TU)、站所終端(Distribution Terminal Uint, DTU)、配電變壓器終端(Transform Termina
6、l Unit, TTU)等。FTU主要安裝在10kV饋電線路上,對(duì)柱上開關(guān)(斷路器、負(fù)荷開關(guān)、分段開關(guān))進(jìn)行監(jiān)控,完成遙信、遙測、遙控,故障檢測功能,并與配電自動(dòng)化主站通信,提供配電系統(tǒng)運(yùn)行情況和各種監(jiān)測信息,包括開關(guān)狀態(tài)、電能參數(shù)、相間故障、接地故障以及故障時(shí)的參數(shù),可執(zhí)行配電主站下發(fā)的命令,對(duì)配電終端進(jìn)行調(diào)節(jié)和控制,實(shí)現(xiàn)故障定位、故障隔離和非故障區(qū)域快速恢復(fù)供電功能。DTU一般安裝在常規(guī)的開閉所(站),環(huán)網(wǎng)柜、小型變電站、箱式變電站等處,完成對(duì)開關(guān)設(shè)備的位置信號(hào)、電壓、電流、有功功率,無功功率、功率因數(shù)、電能量等數(shù)據(jù)采集與計(jì)算,對(duì)開關(guān)進(jìn)行分合閘操作,實(shí)現(xiàn)對(duì)饋線開關(guān)的故障識(shí)別、隔離和對(duì)非故障
7、區(qū)間的恢復(fù)供電。TTU主要用于監(jiān)測并記錄配電(pi din)變壓器運(yùn)行工況,記錄并保存一段時(shí)間內(nèi)監(jiān)測參數(shù)的整點(diǎn)值,電壓、電流的最大值、最小值及其出現(xiàn)的時(shí)間,供電中斷及恢復(fù)時(shí)間,形成數(shù)據(jù)表。本文(bnwn)主要構(gòu)建側(cè)重于FTU的配電網(wǎng)實(shí)時(shí)應(yīng)用平臺(tái),DTU和TTU的實(shí)現(xiàn)亦是通用的。FTU一般(ybn)功能介紹: 交流量采集:采集三相交流電壓和電流(3U3I),本平臺(tái)軟件模擬(3U3I+U0I0)共8個(gè)交流輸入通道; 實(shí)現(xiàn)電壓、電流、零序電壓、零序電流、有功功率、無功功率、功率因數(shù),頻率的測量和計(jì)算; 直流量采集:2路直流輸入; 狀態(tài)量采集:開關(guān)狀態(tài)、接地刀閘狀態(tài)采集; 113次諧波分量計(jì)算、三相不
8、平衡度的分析計(jì)算; 遙信輸入(無源,24V)和遙控輸出(合、分閘、常開觸點(diǎn)); 事件順序記錄、歷史記錄、主站下發(fā)信息可當(dāng)?shù)卮鎯?chǔ); 支持IEC60870-5-101、 IEC60870-5-104、 MODBUS等常用規(guī)約; 支持多種通信方式、提供多路通信接口,提供2路RS 232或2路RS 485串行通信口,2路10/100M自適應(yīng)以太網(wǎng)口; 配置GPRS模塊; 具備故障檢測及故障差別功能:過流,過負(fù)荷; 配備后備電源,當(dāng)主電源供電不足或消失時(shí),能自動(dòng)無縫投入; 具備對(duì)時(shí)功能,支持SNTP等對(duì)時(shí)方式,接收主站或其它時(shí)間同步裝置的對(duì)時(shí)命令,與系統(tǒng)保持同步。3 硬件評(píng)估板介紹目前暫缺手頭暫缺完整的
9、FTU硬件平臺(tái),只能借助于飛思卡爾聯(lián)合萬利電子推出的MAPS四色板平臺(tái)作為本次評(píng)估開發(fā)板,其具有豐富的通用接口,具有良好的擴(kuò)展性,目前開發(fā)套件由MCU主板和通用外設(shè)板構(gòu)成。MAPS-K64主板MAPS-K64主板特性(txng): 飛思卡爾K64微控制器-MK64FN1M0VLQ12; 10/100M自適應(yīng)(shyng)以太網(wǎng)接口; FlexBus擴(kuò)展(kuzhn)1Mx16 PSRAM,帶地址鎖在器; FlexBus擴(kuò)展2.8英寸彩色LCD(QVGA 240 x320); 標(biāo)準(zhǔn)的2.54mm 20pin SWD調(diào)試接口; Full Speed USB Device, Micro B接口供電;
10、 支持RTC功能,3.0V鋰電池給VBAT供電; CN3,CN6擴(kuò)展接口,可與通用外設(shè)板對(duì)接,提供豐富的擴(kuò)展功能; 排針座引出微控制器所有IO口,方便擴(kuò)展MK64FN1M0VLQ12微控制器特性: ARM Cortex-M4內(nèi)核 + DSP,120MHz主頻,單周期MAC,單指令多數(shù)據(jù)(SIMD)擴(kuò)展,單精度浮點(diǎn)運(yùn)算單元(FPU); 集成1MB Flash、256KB SRAM、128KB FlexNVM、4KB FlexRAM,F(xiàn)lexBus接口(ji ku)用于連接外部存儲(chǔ)器; 兩個(gè)(lin )16位SAR ADC、兩個(gè)12位DAC、3個(gè)模擬比較(bjio)器、內(nèi)部參考電壓 8兩個(gè)8通道定
11、時(shí)器(PWM/電機(jī)控制),兩個(gè)兩通道定時(shí)器、實(shí)時(shí)時(shí)鐘等; 10/100 M以太網(wǎng)MAC、CAN、USB OTG(支持無晶振USB設(shè)計(jì)); 3個(gè)SPI模塊、3個(gè)I2C模塊、6個(gè)UART模塊、SDHC接口、I2S模塊,最大支持100個(gè)GPIOs口; 多種低功耗模式,工作電壓:1.713.6V,工作功耗最低可低至250uA/MHz,工作溫度-40105。MAPS通用外設(shè)板MAPS-DOCK板的外設(shè)資源非常豐富,主要包括: 飛思卡爾K20微控制器,基于Cortex-M4處理器,作為板載調(diào)試器; 一個(gè)Micro-SD卡插槽、一個(gè)8Mbit SPI Nor Flash、一個(gè)2Kbit EEPROM; I2
12、S音頻編解碼器,支持一路立體聲耳機(jī)輸出,兩路Speaker輸出,一路麥克風(fēng)輸入; 板載USB調(diào)試器, 支持CMSIS-DAP協(xié)議(xiy),同時(shí)支持USB轉(zhuǎn)UART功能; USB全速接口(ji ku)、紅外收發(fā)接口、兩個(gè)UART接口、一個(gè)CAN接口; 一個(gè)DAC/PWM Audio輸出(shch)接口; 兩路單端或一路差分ADC輸入; 一個(gè)128x64單色LCD屏,SPI接口; 四個(gè)物理按鍵、四個(gè)LED顯示、一個(gè)五向按鍵、六個(gè)觸摸按鍵。4 實(shí)時(shí)響應(yīng)特性驗(yàn)證汽車沖撞氣囊在汽車發(fā)生碰撞時(shí)是否能及時(shí)彈出是一個(gè)實(shí)時(shí)響應(yīng)的最好例子,若在發(fā)生碰撞后某一截止時(shí)刻后才彈出,則無法起到應(yīng)有的保護(hù)作用,這是喪失實(shí)
13、時(shí)響應(yīng)導(dǎo)致的后果。配電網(wǎng)饋線終端具備故障定位、故障隔離和非故障區(qū)域快速恢復(fù)供電功能,若故障檢測實(shí)時(shí)性得不到保證,最終故障是能識(shí)別,但已超過切除故障的理想時(shí)間,饋線上的故障有可能引發(fā)更大范圍的故障。所以筆者認(rèn)為要能快速進(jìn)行故障定位,就必須提供故障定位的實(shí)時(shí)響應(yīng)特性,為此在FTU軟件設(shè)計(jì)非常有必要結(jié)合RTOS的進(jìn)行軟件設(shè)計(jì)。下圖是FTU對(duì)1路饋線的所有遙測量模擬計(jì)算結(jié)果,這么多項(xiàng)計(jì)算結(jié)果是不是有點(diǎn)震撼效果,總共137個(gè)遙測值/饋線的計(jì)算量,還有3個(gè)直流量計(jì)算(后兩者轉(zhuǎn)換系數(shù)為1.0,即實(shí)際ADC采樣值),幾乎可以囊括所有的測量值。遙測值的計(jì)算過程極為復(fù)雜,包括64點(diǎn)采樣值的FFT信號(hào)處理,有效值的
14、開平方計(jì)算,相角的反正切計(jì)算,高精度頻率計(jì)算,這些計(jì)算都是極為消耗MCU使用率的。然后再看看MCU的利用率統(tǒng)計(jì)(tngj)結(jié)果:簡直是逆天了,這么繁重的計(jì)算(j sun)任務(wù)竟然僅占用MCU的33%使用率,還有66%的空閑時(shí)間,其實(shí)FTU最繁重的遙測計(jì)算是在App Core Task那個(gè)任務(wù)而已,神馬情況,才19%,是的,你一點(diǎn)都沒有看錯(cuò),僅僅占用MCU 19%的使用率即可完成一路饋線137個(gè)測量值的計(jì)算,還包括3個(gè)直流量計(jì)算以及9路遙信處理,再看下圖。第一通道為AD周期采樣每5ms輸出上升脈沖(michng),配電網(wǎng)正常工頻周期為20ms,本平臺(tái)每周期采樣64個(gè)點(diǎn),即每次完成16個(gè)點(diǎn)(四分之
15、一周波)采樣值輸出脈沖,下降沿是在計(jì)算任務(wù)完成瞬時(shí)遙測值完畢后輸出的,可通過第一通道的脈寬看出故障判斷固有延遲時(shí)長。第2通道的脈沖上升時(shí)刻為每次開始進(jìn)行瞬時(shí)遙測值計(jì)算時(shí)輸出的,下降沿為結(jié)束本次遙測計(jì)算時(shí)輸出的,其中各次脈寬不一要等長,是因?yàn)檫b測值處理有選擇地進(jìn)行濾波計(jì)算所致,每次計(jì)算都是以本次采樣所得的四分之一周波數(shù)據(jù)與前四分之三數(shù)據(jù)進(jìn)行組合計(jì)算的,這樣的滑動(dòng)數(shù)據(jù)窗的數(shù)據(jù)方式,確保以最完整的信息進(jìn)行FFT信息處理。通過觀察第1通道,時(shí)標(biāo)100ms-200ms間共嚴(yán)格地出現(xiàn)了20個(gè)脈沖,T1-T2時(shí)長為99.998750ms,說明采樣完成按照每5ms觸發(fā)App Core Task進(jìn)行遙測計(jì)算。局
16、部放大某一上升沿進(jìn)行(jnxng)兩個(gè)通道對(duì)比圖如下可以清晰地看到,T1-T2時(shí)差僅為11.750us,意味著每5ms采樣完四分之一周波后觸任務(wù)進(jìn)行計(jì)算,任務(wù)實(shí)時(shí)響應(yīng)僅僅只需要11.750微秒而已,請(qǐng)?zhí)貏e注意是11.750微秒,對(duì)于這樣實(shí)時(shí)響應(yīng)特性,技藝超眾的碼農(nóng)設(shè)計(jì)裸奔程序也很難達(dá)到如此快速(kui s)的實(shí)時(shí)響應(yīng),以后則可以十分有底氣地說,F(xiàn)TU結(jié)合RTOS進(jìn)行軟件設(shè)計(jì)實(shí)時(shí)響應(yīng)特性更好。再看看(kn kn)下圖:通道1的脈沖寬度:0.649500ms,這意味著從每5ms采樣完成觸發(fā)計(jì)算到瞬時(shí)遙測計(jì)算完畢,僅僅只需要0.649500ms,這意味著故障判斷的固有延時(shí)為:0.65ms左右,完全小
17、于1ms的節(jié)奏啊,所以最為理想的情況是故障在1ms內(nèi)就能夠被檢測出來,最壞的情況是故障被延時(shí)5+0.65ms被檢測出來。筆者還有另一手段進(jìn)行上述時(shí)間的對(duì)比計(jì)時(shí)測量,是應(yīng)用MCU的以120MHz為時(shí)鐘源的計(jì)數(shù)器進(jìn)行消耗時(shí)鐘計(jì)數(shù),求最小值、平均值、最大值,測試結(jié)果與上述IO脈沖測量相差無幾,在此就不重復(fù)闡述了。下圖為板上按鍵模塊開入進(jìn)行遙信處理生成的SOE,以及網(wǎng)絡(luò)Ping結(jié)果,同樣具備良好的實(shí)時(shí)響應(yīng)效果:5 程序設(shè)計(jì)(chn x sh j)思想Bob大叔認(rèn)為在代碼閱讀過程中人們說臟話(zn hu)的頻率是衡量代碼質(zhì)量的唯一標(biāo)準(zhǔn)。軟件系統(tǒng)的質(zhì)量好壞,歸根結(jié)義還是需要代碼來告知。代碼優(yōu)劣不僅直接決定
18、了軟件的質(zhì)量,還將直接影響軟件成本。軟件成本由開發(fā)成本和維護(hù)成本組成,而往往維護(hù)成本遠(yuǎn)高于開發(fā)成本,這其中耗費(fèi)的主要成本就是理解代碼和修改代碼造成的,代碼的質(zhì)量與其整潔度成正比。干凈的代碼,既在質(zhì)量上較為可靠,也為后期維護(hù)、升級(jí)奠定了良好的基礎(chǔ)。細(xì)節(jié)決定成敗,思路清晰、言簡意賅(yn jin y gi)的代碼讓程序員一目了然;而格式凌亂、拖沓冗長的代碼讓程序員一頭霧水。除了可以正確運(yùn)行以外,優(yōu)秀代碼必須具備良好的可讀性,編寫的代碼要使人能在最短的時(shí)間內(nèi)理解才行。編碼不僅僅只是一們技術(shù),也是一門藝術(shù),編寫可讀性高的代碼尤其如此。代碼最重要的讀者不是編譯器、解釋器或者電腦,而是人,寫出的代碼能讓人
19、快速理解、輕松維護(hù)、容易擴(kuò)展(kuzhn)的程序員才是專業(yè)程序員。精簡、高效、穩(wěn)定、可靠是嵌入式程序設(shè)計(jì)過程所應(yīng)該力爭實(shí)現(xiàn)的,把有限的資源用到極致發(fā)掘出SOC卓越的性能。除可編程器件的程序外,程序運(yùn)行時(shí)是嚴(yán)格按順序執(zhí)行,只有簡單、高效設(shè)計(jì)的程序才能快速響應(yīng)事件,并非應(yīng)用RTOS的程序就具備實(shí)時(shí)響應(yīng)功效了。工業(yè)應(yīng)用的嵌入系統(tǒng)還要求實(shí)現(xiàn)無間斷超長時(shí)間進(jìn)行精準(zhǔn)(jn zhn)監(jiān)控,因而務(wù)必在程序設(shè)計(jì)中排除各類不穩(wěn)定因素,比如嚴(yán)格按MISRA-C(汽車制造業(yè)嵌入式C編碼標(biāo)準(zhǔn))進(jìn)行程序設(shè)計(jì)。省內(nèi)存、模塊化、可配置、可移植的設(shè)計(jì)也在嵌入式程序設(shè)計(jì)具有重要意義。雖然微控制器的內(nèi)存資源有很大的提升,相對(duì)來說還
20、是比較匱乏的,用最少的內(nèi)存實(shí)現(xiàn)既定的功能可縮減??臻g的大小,提升程序的高效性。模塊化的程序設(shè)計(jì)可最大程度地減少程序的耦合性,抽象封裝優(yōu)良的模塊可移植性強(qiáng),可用于多個(gè)應(yīng)用平臺(tái)??膳渲脛t實(shí)現(xiàn)程序維護(hù)升級(jí)的極大便利性,通過修改一些配置屬性即可實(shí)現(xiàn)特定的需求,減少程序的維護(hù)成本,如FreeRTOSConfig.h, lwipopt.h等均設(shè)計(jì)有可配置選項(xiàng),使其得到廣泛地應(yīng)用,Micrium公司出品的uCOS-III其代碼堪稱最為規(guī)范而且整潔的程序。軟件設(shè)計(jì)中的關(guān)鍵思想:代碼應(yīng)該是易于理解的,遵循統(tǒng)一的編程規(guī)范,實(shí)現(xiàn)高效整潔穩(wěn)健的程序設(shè)計(jì)。要充分借鑒C+的分類設(shè)計(jì)思想,把功能按模塊進(jìn)行分類,最大程序減小
21、模塊間的耦合,同時(shí)把通用的功能函數(shù)封裝好,做好一經(jīng)驗(yàn)證正常后續(xù)則可到處快速使用目的。6 軟件架構(gòu)本平臺(tái)軟件架構(gòu)劃分為5個(gè)層次,分別為用戶應(yīng)用層App,通用接口層Common,應(yīng)用支持層Asp,中間層Mid,驅(qū)動(dòng)層Drv。用戶應(yīng)用層AppAppOS、 ComApp、 HmiApp、 MainApp、 NetApp、 ShellApp、SoeApp、 WinApp、 YcApp、 YxApp、 YkApp通用接口CommonCommon、 DbgPrintf、 SoftClock、 StrLib、 StrPrintf應(yīng)用支持層AspExterRam、 FlexBus、 FramFlash、 HwT
22、icker、 I2CBus、LcmDisp、 NorFlash、 GpioPin、 PinMux、 RTC、 SerialCom、SpiBus、 System、 Watchdog中間層MidFreeRTOS V8.20、 LwIP V1.41、 emWin V5.26驅(qū)動(dòng)層DrvKSDK V1.26.1 驅(qū)動(dòng)(q dn)層驅(qū)動(dòng)層為整個(gè)軟件架構(gòu)的最底層,采用飛思卡專門為Kinetis系列設(shè)計(jì)(shj)軟件開發(fā)套件KSDK V1.2,Kinetis軟件開發(fā)套件由強(qiáng)大的外設(shè)驅(qū)動(dòng)、堆棧、中間件和示例應(yīng)用組成,旨在簡化和加速基于所有Kinetis MCU的應(yīng)用開發(fā)。隨MAPS-K64開發(fā)套件發(fā)布的是V1
23、.1,兩個(gè)版本在程序接口上不兼容,應(yīng)用支持層則調(diào)用的是KSDK提供的編程接口,用戶應(yīng)用層則使用應(yīng)用支持層的編程接口,使得這三者保持獨(dú)立性,便于用戶應(yīng)用層程序無縫移植到其它廠家的MCU上運(yùn)行,而僅需移植應(yīng)用支持層即可。6.2 中間層中間層由FreeRTOS、LwIP和emWin構(gòu)成,除emWin外,其余兩者均為開源代碼,emWin為MDK自帶的圖形用戶接口,鑒于工業(yè)應(yīng)用安全可靠要求目前暫未找到具備掉電保存(bocn),支持磨損平衡特性的開源嵌入式文件系統(tǒng),開源軟件easyFlash是后續(xù)理想的替代方案。FreeRTOS是Real Time Engineers Ltd.推出的市場領(lǐng)先實(shí)時(shí)操作系統(tǒng),
24、支持30多種架構(gòu)。它擁有專業(yè)的開發(fā)、嚴(yán)格的質(zhì)量控制、穩(wěn)定可靠的特點(diǎn)和完善的支持,可免費(fèi)在商用產(chǎn)品中使用。LwIP是瑞典計(jì)算機(jī)科學(xué)院(SICS)的Adam Dunkels 開發(fā)的一個(gè)小型開源的 HYPERLINK /view/7729.htm t /_blank TCP/IP協(xié)議棧。主要應(yīng)用于嵌入式領(lǐng)域的開源TCP/IP協(xié)議棧,它的實(shí)現(xiàn)同BSD的實(shí)現(xiàn)有很大的相似性,可以作為TCP/IP協(xié)議的典型代表,它的功能完備,除了實(shí)現(xiàn)TCP/IP的基本通信功能外,還支持DNS、SNMP、DHCP、IGMP等高級(jí)功能應(yīng)用。LwIP實(shí)現(xiàn)的重點(diǎn)是保證在嵌入式設(shè)備RAM、ROM資源有限的情況下實(shí)現(xiàn)TCP協(xié)議的主要功
25、能,因此它具有自己獨(dú)到的一套數(shù)據(jù)包和內(nèi)存管理機(jī)制,使之更適合于在代端的嵌入式系統(tǒng)中使用。emWin是市場上最有效、最全面的GUI產(chǎn)品之一,它和國內(nèi)流行的uCGUI類似,它以ANSI C語言編寫,支持(zhch)任何顯示控制器、顯示器和CPU,本平臺(tái)已成功移植emWin用于驅(qū)動(dòng)彩色LCD,后期做用戶圖形界面開發(fā)。6.3 應(yīng)用(yngyng)支持層應(yīng)用支持層相當(dāng)于板級(jí)驅(qū)動(dòng)包(BSP),統(tǒng)一向上為應(yīng)用層提供支持服務(wù),故叫應(yīng)用支持層,是對(duì)片上及板上外設(shè)資源進(jìn)行訪問接口的實(shí)現(xiàn),使應(yīng)用層更為便利地訪問片上及板上的資源,把應(yīng)用層與DRV層完全隔離,增強(qiáng)整個(gè)工程程序地可移植(yzh)性,若移植工程到不同廠家的
26、芯片時(shí),僅需重新實(shí)現(xiàn)ASP層的函數(shù)接口即可,APP層的程序可實(shí)現(xiàn)無縫移植,與此同時(shí)按照現(xiàn)代方法的C語言程序設(shè)計(jì),可兼容應(yīng)用于不用的編譯器,如ARMCC, IAR, GCC等。6.4 通用接口層通用接口層是用戶應(yīng)用層公共通用的功能函數(shù)集,主要包含工程通用頭文件定義,仿printf標(biāo)準(zhǔn)格式字符串轉(zhuǎn)換,累加計(jì)數(shù)式算法的軟時(shí)鐘日歷實(shí)現(xiàn)等。6.5 用戶應(yīng)用層用戶應(yīng)用層主要包含與RTOS相關(guān)功能整體實(shí)現(xiàn),各個(gè)功能模塊的模塊化程序設(shè)計(jì)等,下文一一詳述。7 應(yīng)用支持層(ASPs) 應(yīng)用(yngyng)支持層結(jié)構(gòu)圖UNIX具有標(biāo)準(zhǔn)API模型open-read-write-close,Linux受益于該模型使得它
27、的應(yīng)用程序無障礙地與Unix程序友好共存,因而程序設(shè)計(jì)分為應(yīng)用程序設(shè)計(jì)與驅(qū)動(dòng)程序程序,驅(qū)動(dòng)程序設(shè)計(jì)與芯片硬件資源配置較為緊密,需要更為高效的程序執(zhí)行效率。在微控制器程序設(shè)計(jì)中則極少嚴(yán)格(yng)劃分驅(qū)動(dòng)程序和應(yīng)用程序,這就造成了應(yīng)用程序設(shè)計(jì)與芯片完全綁定的惡果,導(dǎo)致應(yīng)用程序無法移植應(yīng)用于其他廠家的芯片上,最為悲的情況是按芯片應(yīng)用程序得重寫。ARM公司(n s)推出ARM Cortex的同時(shí)還有一個(gè)與之配套的標(biāo)準(zhǔn)-CMSIS(微控制器軟件接口標(biāo)準(zhǔn)),是Cortex-M處理器系列的芯片與供應(yīng)商無關(guān)的硬件抽象層。使用CMSIS,可以為處理器和外設(shè)實(shí)現(xiàn)一致且簡單的軟件接口,從而簡化軟件的重用、縮短微控
28、制器新開發(fā)人員的學(xué)習(xí)過程,并縮短新設(shè)備的上市時(shí)間,同時(shí)方便將現(xiàn)有軟件遷移到新設(shè)備。這個(gè)標(biāo)準(zhǔn)為供應(yīng)商設(shè)計(jì)硬件抽象層軟件接口提供了更為權(quán)威的依據(jù),但到目前為止只能說各廠家的軟件接口逐漸趨于統(tǒng)一,但還無法達(dá)到無縫銜接的地步。為此在本工程中參照上述思想,結(jié)合微控制器的通用處理過程形成了Init-Read-Write的應(yīng)用支持層總體設(shè)計(jì)思想。按此思路設(shè)計(jì)各個(gè)功能模塊(m kui),在init中是根據(jù)各功能模塊的屬性配置表進(jìn)行初始化配置,在系統(tǒng)上電復(fù)位后統(tǒng)一進(jìn)行各模塊初始化,然后就可以為用戶應(yīng)用層各模塊提供友好地Read/Write服務(wù)。雖然無法與CMSIS相比較,但經(jīng)過這樣層次劃分后,應(yīng)用程序與各廠家的
29、硬件抽象層完全隔離,具備良好的移植性,非常有利于在各個(gè)廠家的芯片中進(jìn)行評(píng)估。注:鑒于大多數(shù)編程語言都是基于英語的,而且要求很多程序中用英語注釋,文件的函數(shù)名及變量定義禁止一切形式(xngsh)的簡拼,流行的開源軟件也都是清一色的英文doc,所以程序員學(xué)好英語也是很有必要的,因?yàn)榭炊甦atasheet,用好User Guide是非常重要的技能。為了與世界接軌,筆者英文水準(zhǔn)雖然很蹩腳,但抱著多用多學(xué)不斷提升的愿憬常用英文,下文中注釋語法或用詞可能不正確,但是關(guān)鍵信息已經(jīng)裝在變量名及函數(shù)名中,看函數(shù)名不用猜測就知道其功能,這已經(jīng)是可讀代碼的藝術(shù)了,函數(shù)頭注釋那只是使格式更為規(guī)范而已了。此外用英文注釋
30、的程序在哪個(gè)瀏覽器都不會(huì)在在亂碼,不存在UTF-8或GBK編碼導(dǎo)致顯示亂碼問題。7.1 ExterRam模塊(m kui)ExterRam模塊為片外擴(kuò)展RAM的初始化配置及應(yīng)用訪問接口實(shí)現(xiàn),主要提供如下訪問接口函數(shù):/!=/!brief Initializes the SDRAM device./!param void./!retval None./!note ./!=extern void vExterRamInit(void);/!=/!brief Reads an mount of data from the SDRAM memory in polling mode./!param Iu
31、lAddr - Read start address./!param O*pulData - Pointe to the read data buffer./!param IulSize - Size of read data from the memory./!retval API_NULL / API_SUCC./!note 僅測試使用,在應(yīng)用中使用地址自動(dòng)定位技術(shù)(jsh)將變量定義于片外內(nèi)存中./!=extern int16_t iExterRamReadData(uint32_t ulAddr, uint16_t *puiData, uint32_t ulSize);/!=/!bri
32、ef Writes an mount of data to the SDRAM memory in polling mode./!param IulAddr - Write start address./!param I*pulData - Pointer to data to be written./!param IulSize - Size of written data from the memory./!retval API_NULL / API_SUCC./!note 僅測試使用,在應(yīng)用(yngyng)中使用地址自動(dòng)定位技術(shù)將變量定義于片外內(nèi)存中./!=extern int16_t
33、iExterRamWriteData(uint32_t ulAddr, uint16_t *puiData, uint32_t ulSize);7.2 FlexBus模塊(m kui)FlexBus模塊為片外護(hù)展總線的初始化配置的實(shí)現(xiàn),以及可訪問地址空間的定義,主要提供初始化配置接口函數(shù):/!=/!brief Flex Bus Initial./!param void./!retval None./!note ./!=extern void vFlexBusInit(void);/!=/!brief Wrtie data to NorFlash./!param ulAddr - FlexBus
34、 Address./!param bIncr - the address increase or not./!param *puiData - pointer on the write data buffer./!param ulWordNum - the num of word data buffer./!retval API_NULL / API_FAIL / API_SUCC./!note ./!=extern int16_t iFlexBusWrite(uint32_t ulAddr, uint8_t bIncr, uint16_t *puiData, uint32_t ulWordN
35、um);/!=/!brief Read data from FlexBus./!param ulAddr - FlexBus Fix Address./!param bIncr - the address increase or not./!param *puiData - pointer on the read data buffer./!param ulWordNum - the num of word data that expect to read./!retval API_NULL / API_FAIL / API_SUCC./!note ./!=extern int16_t iFl
36、exBusRead(uint32_t ulAddr, uint8_t bIncr, uint16_t *puiData, uint32_t ulWordNum);7.3 FramFlash模塊(m kui)FramFlash模塊為鐵電Flash,EEROM等無需擦除即可直接寫入的Falsh提供驅(qū)動(dòng)初始(ch sh)配置,以及讀寫訪問接口函數(shù),提供的接口函數(shù):/!=/!brief FramFlash Initial./!param void./!retval None./!note ./!=extern void vFramFlashInit(void);/!=/!brief Read data
37、 form FramFlash./!param I uiAddr - address of FramFlash./!param O *pucBuff - point to the output data buffer./!param IO*puiLen - input the expect to read datas lenght, /! output the real read lenght./!retval API_NULL / API_SUCC./!note ./!=extern int16_t iFramFlashRead(uint16_t uiAddr, uint8_t *pucBu
38、ff, uint16_t *puiLen); /!=/!brief Wrtie data to FramFlash./!param I uiAddr - address of FramFlash./!param O *pucBuff - point to the write data buffer./!param IO*puiLen - input the expect to write datas lenght, /! output the real write lenght./!retval API_NULL / API_FAIL / API_SUCC./!note ./!=extern
39、int16_t iFramFlashWrite(uint16_t uiAddr, uint8_t *pucBuff, uint16_t *puiLen);7.4 HwTicker模塊(m kui)HwTicker模塊主要功能是為應(yīng)用程序提供周期性定時(shí)中斷服務(wù),主要基于片上的定時(shí)器實(shí)現(xiàn),為了有區(qū)別于曾被廣泛應(yīng)用的HwTimer而取名HwTicker,寓意滴答時(shí)鐘。基于可配置程序設(shè)計(jì)思想,HwTicker的定時(shí)屬性是可配置的,在不同的使用場合,僅需要更改其中的配置即可達(dá)到所需的定時(shí)周期服務(wù),而無需進(jìn)行其他的同步更正。提供(tgng)的訪問接口如下:typedef enum _HwTickerLog
40、icNoDef kHwTickerNo0 = 0, /* 1ms計(jì)時(shí). */ kHwTickerNo1, /* AD采樣(ci yn)計(jì)時(shí). */ HwTickerNo_t;/!=/!brief Hardware ticker initial./!param void./!retval None./!note ./!=extern void vHwTickerInit(void);/!=/!brief Starts the hardware ticker counting./!param ucTickerNo - logitc ticker No./!retval API_FAIL / API
41、_SUCC./!note ./!=extern int16_t iHwTickerStart(uint8_t ucTickerNo);/!=/!brief Stops the hardware ticker counting./!param ucTickerNo - logitc ticker No./!retval API_FAIL / API_SUCC./!note ./!=extern int16_t iHwTickerStop(uint8_t ucTickerNo);/!=/!brief get hardware ticker count value./!param void./!re
42、tval ticker count value./!note 0毫秒起累加計(jì)時(shí)./!=extern inline uint32_t ulHwTickerCountGet(void);/!=/!brief Reads the hardware ticker current counting value./!param IucTickerNo - logitc ticker No./!param O*pulCount - pointer to the output valeue./!retval API_NULL / API_SUCC./!note ./!=extern int16_t iHwTi
43、ckerCountGet(uint8_t ucTickerNo, uint32_t *pulCount);/!=/!brief Read the hardware ticker period in units of count./!param IucTickerNo - logitc ticker No./!param O*pulPeriod - pointer to the output value./!retval API_NULL / API_SUCC./!note us = (*pulPeriod + 1) / Fre./!=extern int16_t iHwTickerPeriod
44、Get(uint8_t ucTickerNo, uint32_t *pulPeriod);/!=/!brief Sets the hardware ticker period in units of count./!param ucTickerNo - logitc ticker No./!param ulSetCount - period count value./!retval API_NULL / API_SUCC./!note ulPeriod = (us * Fre / 1000000 - 1)./!=extern int16_t iHwTickerPeriodSet(uint8_t
45、 ucTickerNo, uint32_t ulSetCount);/!=/!brief Read the hardware ticker source frequence./!param IucTickerNo - logitc ticker No./!param O*pulFre - pointer to the output value./!retval API_NULL / API_SUCC./!note ./!=extern int16_t iHwTimerFreGet(uint8_t ucTickerNo, uint32_t *pulFre);/!=/!brief Hardware
46、 timer initialization./!param void./!retval None./!note Use for RTOS Run Time Statistics./!=extern void vHwTickerTimeStampInit(void);/!=/!brief Get hardware time counter value./!param void./!retval None./!note Use for RTOS Run Time Statistics./!=extern uint32_t ulHwTickerTimeStampGet(void);/!=/!brie
47、f CPU Time Stamp Initial./!param void./!retval None./!note ./!=extern void vCPU_TimeStampInit(void);/!=/!brief Get CPU Time Stamp./!param void./!retval None./!note 以系統(tǒng)(xtng)時(shí)鐘為時(shí)鐘源的32位計(jì)數(shù)器,可作為應(yīng)用層高精計(jì)時(shí)測量用./!=extern inline uint32_t ulCPU_TimeStampGet(void);7.5 I2cBus模塊(m kui)I2cBus為片上I2C外設(shè)總線進(jìn)行統(tǒng)一配置和訪問管理,主
48、要提供(tgng)初始化配置及發(fā)送、接收接口,在此主要作為主機(jī)解色使用。typedef enum _I2CBusNoDef kI2cBusEprom = 0, / EPROM kI2cBusTemp, / 溫度傳感器 I2cBusNo_t;/!=/!brief I2C bus initial./!param void./!retval None./!note ./!=extern void vI2cBusInit(void);/!=/!brief Send data to I2C bus./!param I ucBusNo - I2C Bus No./!param I *pucCmdTxBuf
49、f - pointer on the send buffer,/! include cmd and Tx data./!param I uiCmdLen - the length of commad data./!param IO*puiTextLen - input the length of data hope to send,/! ouput real send lenght./!retval API_NULL / API_FAIL / API_SUCC./!note ./!=extern int16_t iI2cBusMasterSend(uint8_t ucBusNo, uint8_
50、t *pucCmdTxBuff, uint16_t uiCmdLen, uint8_t *puiTextLen);/!=/!brief Send data to I2C bus./!param I ucBusNo - I2C Bus No./!param I *pucCmdTxBuff - pointer on the send buffer,/! include cmd and Rx data./!param I uiCmdLen - the length of commad data./!param IO*puiTextLen - input the length of data hope
51、 to receive,/! ouput real receive lenght./!retval API_NULL / API_FAIL / API_SUCC./!note ./!=extern int16_t iI2cBusMasterReceive(uint8_t ucBusNo, uint8_t* *pucCmdRxBuff, uint16_t uiCmdLen, uint8_t *puiRxLen);7.6 LcmDisp模塊(m kui)LcmDisp模塊為液晶顯示模塊驅(qū)動(dòng),SNT為點(diǎn)陣式液晶顯示模塊,TFT為彩色式液晶顯示模塊。分別提供了初始化配置,中英文顯示,畫線等接口。ASC
52、II字符以8*16字模顯示,簡體中文以16*16字模完全顯示GB2312定義的所有可顯示字符,其中(qzhng)一級(jí)漢字3755個(gè),二級(jí)漢字3008個(gè),還包括拉丁字母、希臘字母、日文平假名及片假名字母、俄語西里爾字母在內(nèi)的682個(gè)全角字符。無部分為無需專業(yè)的GUI軟件即可進(jìn)行字符及描點(diǎn)繪線操作,若移植了GUI則以調(diào)用GUI接口函數(shù)顯示(xinsh),此部分則僅需要執(zhí)行初化而已。提供的訪問接口函數(shù)如下:/!=/!brief Single Color LCM initial./!param void./!retval None./!note ./!=extern void vSntLcmInit(
53、void);/!=/!brief Single Color LCM Clear screen./!param void./!retval None./!note ./!=extern void vSntLcmClearScreen(void);/!=/!brief Renew LCD Screen./!param void./!retval None./!note ./!=extern void vSntLcmRenew(void);/!=/!brief Single Color LCM display character at special position./!param uiChar
54、- character encode./!param uiAxisX - position of X axis./!param uiAxisY - position of Y axis./!retval API_NULL / API_SUCC./!note ./!=extern int16_t iSntLcmDispCharAt(uint16_t uiChar, uint16_t uiAxisX, uint16_t uiAxisY);/!=/!brief Single Color LCM display string at special position./!param pcStr - st
55、ring character encode./!param uiLen - the length of display space./!param uiAxisX - position of X axis./!param uiAxisY - position of Y axis./!retval API_NULL / API_FAIL / API_SUCC./!note ./!=extern int16_t iSntLcmDispStringAt(const char *pcStr, uint16_t uiLen, uint16_t uiAxisX, uint16_t uiAxisY);/!=
56、/!brief Single Color LCM display decimal data at special position./!param lValue - character encode./!param uiLen - the length of display space./!param uiAxisX - position of X axis./!param uiAxisY - position of Y axis./!retval API_NULL / API_SUCC./!note ./!=extern int16_t iSntLcmDispDecAt(int32_t lV
57、alue, uint16_t uiLen, uint16_t uiAxisX, uint16_t uiAxisY);/!=/!brief Single Color LCM display float data at special position./!param fValue - float data value./!param uiLenDec - the length of display space with the length of decimal./!param uiAxisX - position of X axis./!param uiAxisY - position of
58、Y axis./!retval API_NULL / API_SUCC./!note ./!=extern int16_t iSntLcmDispFloatAt(float fValue, uint16_t uiLenDec, uint16_t uiAxisX, uint16_t uiAxisY);/!=/!brief Single Color LCM display binary data at special position./!param fValue - integrate data value./!param uiLenDec - the length of display spa
59、ce with the length of decimal./!param uiAxisX - position of X axis./!param uiAxisY - position of Y axis./!retval API_NULL / API_SUCC./!note ./!=extern int16_t iSntLcmDispBinAt(uint32_t ulValue, uint16_t uiLen, uint16_t uiAxisX, uint16_t uiAxisY);/!=/!brief Single Color LCM display hex data at specia
60、l position./!param fValue - character encode./!param uiLenDec - the length of display space with the length of decimal./!param uiAxisX - position of X axis./!param uiAxisY - position of Y axis./!retval API_NULL / API_SUCC./!note ./!=extern int16_t iSntLcmDispHexAt(uint32_t ulValue, uint16_t uiLen, u
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年貴州工商職業(yè)學(xué)院單招職業(yè)傾向性考試題庫參考答案
- 2025至2030年扣壓式標(biāo)準(zhǔn)管接頭項(xiàng)目投資價(jià)值分析報(bào)告
- 2024年農(nóng)藝師考試技巧提升試題及答案
- 2024年輔導(dǎo)員崗位考試團(tuán)隊(duì)建設(shè)能力試題及答案
- 農(nóng)藝師中的應(yīng)用技巧試題及答案
- 農(nóng)藝師考試各大模塊的系統(tǒng)性學(xué)習(xí)技巧試題及答案
- 2025至2030年強(qiáng)循環(huán)水冷卻器項(xiàng)目投資價(jià)值分析報(bào)告
- 2024年農(nóng)藝師考試復(fù)習(xí)中的智慧運(yùn)用試題及答案
- 運(yùn)用思維導(dǎo)圖福建事業(yè)單位考試試題及答案
- 2025至2030年山東省智能制造產(chǎn)業(yè)投資環(huán)境評(píng)估報(bào)告
- 福建省廈門市湖里區(qū)2023-2024學(xué)年五年級(jí)下學(xué)期期中數(shù)學(xué)試卷
- 5月8日世界微笑日微笑的力量生活中保持微笑宣傳課件
- 泛血管疾病抗栓治療中國專家共識(shí)解讀
- 基于深度學(xué)習(xí)的圖像分割
- 班級(jí)管理交流《班主任帶班育人方略》課件
- 分布式光伏電站安全運(yùn)維
- 校服采購?fù)稑?biāo)方案投標(biāo)文件
- 奔騰B50汽車說明書
- 華為QSA審核報(bào)告
- 鋼筋籠(螺旋箍筋)工程量自動(dòng)計(jì)算表
- 標(biāo)準(zhǔn)入庫授權(quán)委托書
評(píng)論
0/150
提交評(píng)論