王璐
(中國科學(xué)院長春光學(xué)精密機(jī)械與物理研究所 吉林省長春市 130000)
數(shù)字控制處理器(DSP)具有高速的數(shù)據(jù)運(yùn)算能力,功能豐富,接口多樣,具有強(qiáng)大的控制能力,而且易于開發(fā)。基于TMS320F28335DSP的嵌入式系統(tǒng),更是廣泛應(yīng)用于電機(jī)控制、通信、醫(yī)療、工業(yè)控制等領(lǐng)域[1]。在伺服控制上,為了提高控制精度往往需要大量復(fù)雜的算法和更高的采樣頻率,這就對(duì)DSP 的運(yùn)算能力提出了更高的要求,雙DSP 并行處理的嵌入式系統(tǒng)是一種解決方案[2][3]。傳統(tǒng)的程序升級(jí)方式依賴于JTAG 接口,通過仿真器連接計(jì)算機(jī)訪問DSP 的存儲(chǔ)空間,進(jìn)行仿真和燒寫。這種連接方式穩(wěn)定,方便操作,但價(jià)格昂貴,使用場(chǎng)所受限,適用于實(shí)驗(yàn)室設(shè)計(jì)開發(fā)階段[4]。嵌入式系統(tǒng)設(shè)備交付后實(shí)際使用環(huán)境往往復(fù)雜多變??赡苊媾R無法插拔仿真器,或者出現(xiàn)JTAG 接口距離過長無法燒寫成功的情況。限制了DSP 的進(jìn)一步應(yīng)用,對(duì)系統(tǒng)的可維護(hù)和易更新等方面提出了進(jìn)一步的要求。所以開發(fā)出穩(wěn)定,并且能夠遠(yuǎn)距離傳輸,不受JTAG 仿真器接口限制的程序升級(jí)方法非常重要。
文獻(xiàn)[5][6]基于TMS320F2812 內(nèi)部FLASН 提出一種在線燒寫技術(shù),提高了系統(tǒng)的可維護(hù)性。文獻(xiàn)[7][8]通過配置GPIO84~GPIO87引腳的電平選擇啟動(dòng)方式,選擇從SCI、SPI或CAN總線等方式啟動(dòng)。燒寫完畢后將GPIO87 重新拉高,重新啟動(dòng)DSP 即可實(shí)現(xiàn)程序的升級(jí)運(yùn)行。文獻(xiàn)[9]通過SCI 串口分別與上位機(jī)和輔助芯片STM32接收指令和用戶程序?qū)崿F(xiàn)燒寫。文獻(xiàn)[10]通過將待升級(jí)程序復(fù)制到FLASН 備份扇區(qū),保證程序完成性,能夠在燒寫意外斷點(diǎn)情況下修復(fù)并運(yùn)行。文獻(xiàn)[11]設(shè)計(jì)一種基于GPRS 通信模塊的系統(tǒng)結(jié)構(gòu)實(shí)現(xiàn)了遠(yuǎn)程無線通訊。文獻(xiàn)[12][13]基于CAN 總線通訊設(shè)計(jì)了一種遠(yuǎn)程程序方案。
本文基于一種雙DSP 伺服控制硬件電路上進(jìn)行遠(yuǎn)程程序升級(jí)的方案設(shè)計(jì)。采用一種基于SCI 通訊的程序升級(jí)方案,無須仿真器,同時(shí)將控制函數(shù)嵌入到用戶程序中,進(jìn)行控制函數(shù)的搬移,實(shí)現(xiàn)程序的升級(jí)。
可通過TI 自帶的Flash API (The Flash Application Program Interface)功能庫可實(shí)現(xiàn)脫離仿真器JTAG 的多種程序升級(jí)方式,無論采用什么方式燒寫都需要用Flash API 庫內(nèi)的算法實(shí)現(xiàn)對(duì)Flash 區(qū)域的操作和編輯[14][15]。API 庫主要由以下幾個(gè)函數(shù)組成:
API 庫的函數(shù)APIVersion 和APIVersionНex 用于確定當(dāng)前API庫文件的版本,前者返回浮點(diǎn)型的數(shù),后者返回Нex 的數(shù),用于判斷當(dāng)前API 庫的版本防止由于版本錯(cuò)誤導(dǎo)致的升級(jí)失敗。
擦除函數(shù)僅對(duì)Flash 區(qū)域進(jìn)行操作,且當(dāng)燒寫進(jìn)行時(shí)無法進(jìn)行擦除操作,擦除操作將Flash 區(qū)域的數(shù)據(jù)全部寫0xFFFF,擦除Flash 時(shí)操作單元時(shí)一個(gè)扇區(qū),不可對(duì)扇區(qū)內(nèi)的某一位再進(jìn)行操作,沒有擦除指令的扇區(qū)內(nèi)容保持不變。Flash28335_Erase(Uint16SectorMask,FLASН_ST*FEraseStat); 函數(shù)中的SectorMask 定義標(biāo)示位來指示擦除的扇區(qū);定義FLASН 結(jié)構(gòu)的狀態(tài)指針FeraseStat,用于確定執(zhí)行擦除操作后狀態(tài)返回值,判斷操作是否成功。
擦除程序后的各個(gè)扇區(qū)數(shù)據(jù)均為0xFFFF,燒寫程序的實(shí)質(zhì)就是對(duì)扇區(qū)內(nèi)的1 進(jìn)行寫0 操作,燒寫程序函數(shù)為:
Flash28335_Program(Uint16*FlashAddr,Uint16*BufAddr, Uint32 Length, FLASН_ST *FProgStatus);
其中*FlashAddr 指向燒寫的數(shù)據(jù)存入Flash 區(qū)域的第一個(gè)地址,*BufAddr 為緩沖區(qū)域指針,Length 為數(shù)據(jù)長度,*FprogStatus 表示為燒寫的狀態(tài)指針。
驗(yàn)證程序?yàn)闊龑懞蟮母郊映绦?。API 庫中有如下定義。
Flash28335_Verify(Uint16 *FlashAddr,
Uint16 *BufAddr, Uint32 Length,
FLASН_ST *FVerifyStat);
其中*FlashAddr 指向燒寫的數(shù)據(jù)存Flash 區(qū)域的第一個(gè)地址,*BufAddr 為緩沖區(qū)域指針,Length 為數(shù)據(jù)長度,*FVerifyStat 表示為驗(yàn)證地址。
由于API 庫函數(shù)需要對(duì)FLASН 區(qū)域進(jìn)行操作,所以不可運(yùn)行于在Flash 區(qū)域,運(yùn)行時(shí)需要將儲(chǔ)存在FLASН 區(qū)域的程序搬移到RAM 中運(yùn)行。幾種搬移方式流程如圖1 所示。
API 程序的搬移方式有三種,一是通過JTAG 引腳,依然需要仿真器。二是通過SCI、SPI 等通訊的A 通道實(shí)現(xiàn)燒寫的控制程序,這種升級(jí)方法需要對(duì)相應(yīng)的引腳進(jìn)行拉高和拉低,并且需要嚴(yán)格用通訊的A 通道進(jìn)行升級(jí),操作相對(duì)較為復(fù)雜,也不靈活。三是API函數(shù)代碼嵌入到FLASН 代碼中,每次程序運(yùn)行都將程序運(yùn)行至RAM 中去。
API 庫函數(shù)搬移到RAM 區(qū)運(yùn)行可通過在.cmd 工程文件的配置實(shí)現(xiàn),程序文件中必須包含以下兩個(gè)工程的語句-lFlash28335_API_V210.lib(.econst) 庫文件源代碼-l Flash28335_API_V210.lib(.text),是API 庫文件的參數(shù)。
圖2:雙DSP 系統(tǒng)嵌入式系統(tǒng)框圖
此段程序定義了API 函數(shù)段裝載在PAGA0 的FLASНA 中,運(yùn)行地址在PAGE0 的RAML0 中。令編譯器創(chuàng)建了變量分別指向該段的首地址、末地址和起始地址。上述.cmd 文件中定義了起始終止和運(yùn)行地址,這些均已在API_Library.h 中進(jìn)行了定義。
在用戶程序.c 文件中,添加代碼進(jìn)行如下調(diào)用和定義。即可實(shí)現(xiàn)API 程序的搬移到RAM 中。
圖3:升級(jí)程序流程圖
隨著精度要求越來越高,為了提高控制精度,需要大量算法,需要一段時(shí)間進(jìn)行計(jì)算,可能出現(xiàn)采樣周期內(nèi)算不完的情況,因此很多嵌入式控制系統(tǒng)需要更為強(qiáng)大的運(yùn)算能力。本系統(tǒng)的硬件電路采用兩個(gè)DSP 并行處理的方式,實(shí)現(xiàn)了性能的拓展。
系統(tǒng)采集信號(hào)為RS422 通信,通過芯片MAX3490 將RS422通信轉(zhuǎn)換為RS232 信號(hào),這些信號(hào)作為高速芯片SC16C654 的輸入,轉(zhuǎn)換為數(shù)據(jù)線被雙DSP 接收,這些信號(hào)均可通過CPLD 配置決定交給主控DSP 處理還是輔助計(jì)算DSP 處理。將雙DSP 的Zone7 映射到ST16C654 和DA 芯片的外部存儲(chǔ)空間,在CPLD 中邏輯進(jìn)行通道的選擇。
雙DSP 均采用TMS320F28335 芯片,在CPLD 中進(jìn)行功能分配使其能合理的并行處理運(yùn)算,通過雙口RAM 型號(hào)IDT70V28 進(jìn)行雙向通信,IDT70V28 可進(jìn)行16 位64k 空間,最大延遲小于25納秒的高速傳輸,最大限度地減少了雙DSP 之間通信的延遲時(shí)間。兩個(gè)DSP 都存在遠(yuǎn)程升級(jí)的問題,將兩個(gè)DSP 的SCIA 通道作為遠(yuǎn)程升級(jí)的串口,連接到CPLD 中。雙DSP 系統(tǒng)嵌入式系統(tǒng)框圖如圖2 所示。
雙DSP 之間采用CPLD 芯片EPM2210F256。雙DSP 的SCI 串口、各種控制信號(hào)以及外部的高速傳感器信號(hào)都連接到CPLD 中。CPLD 中進(jìn)行時(shí)鐘分頻,產(chǎn)生控制信號(hào)進(jìn)行芯片使能,邏輯控制,對(duì)通信通道進(jìn)行靈活配置選擇等。上位機(jī)和兩個(gè)DSP 進(jìn)行通信,由上位機(jī)控制決定待燒寫的DSP 芯片,在CPLD 中建立待升級(jí)DSP 的SCIA 通道。
DSP 在線仿真時(shí),程序直接從page0 的地址0X000000 中運(yùn)行。然后跳轉(zhuǎn)到主函數(shù)中運(yùn)行。程序正常運(yùn)行時(shí),芯片上電后首先直接跳到中斷向量表中0x3FFFC0 處的RESET 處執(zhí)行,在這個(gè)地址下存放一個(gè)指令用于跳轉(zhuǎn)至初始化引導(dǎo)函數(shù)InitBoot,然后調(diào)用引導(dǎo)模式選擇函數(shù)SelectBootMode,用來檢測(cè)配置為輸入的GPIO84~GPIO87 的引腳的狀態(tài),若四個(gè)引腳都為高電平則為FLASН 啟動(dòng)方式,跳轉(zhuǎn)到FLASН 入口地址0X33FFF6,此地址下存放了程序codestart,coderstart 為引導(dǎo)后重定向代碼,在此程序中關(guān)閉看門狗,后跳轉(zhuǎn)到c_int00,_c_int00 的代碼最終會(huì)調(diào)用主函數(shù),后進(jìn)入用戶程序開始執(zhí)行用戶主循環(huán)程序。
.cmd 文件中主要包含PAGE0、PAGE1 和SECTIONS 三個(gè)部分,SECTION 為偽指令塊,將數(shù)據(jù)段裝載到相應(yīng)的儲(chǔ)存空間,PAGE0和PAGE1 為數(shù)據(jù)空間和程序空間,主要為指令MEMORY,將裝載的儲(chǔ)存空間分配到FLASН 區(qū)域中的具體位置。.cmd 為程序代碼和數(shù)據(jù)分配響應(yīng)的存儲(chǔ)空間。
該文件為矢量跳轉(zhuǎn)表文件,通常是匯編文件(.asm)形式,此文件需要準(zhǔn)確的定位在程序的起始地址,其內(nèi)容是匯編語句中的無條件跳轉(zhuǎn)語句“LB”。
首先進(jìn)行鎖相環(huán)、時(shí)鐘初始化、關(guān)閉看門狗。由于API 函數(shù)包含具有軟件延遲循環(huán)的時(shí)間關(guān)鍵型代碼,這些代碼必須執(zhí)行以滿足特定的計(jì)時(shí)要求。因此,在調(diào)用Flash API 函數(shù)之前,設(shè)備必須以正確的CPU 頻率運(yùn)行。如果設(shè)備的輸入時(shí)鐘丟失,PLL 將進(jìn)入所謂的低電平模式,CPU 將以更低的頻率計(jì)時(shí),DSP 將被鎖死。然后將預(yù)留的串口相應(yīng)的GPIO 管腳配置為SCI 通訊模式,并初始化通訊波特率。初始化CPU 中斷并清除中斷標(biāo)志,API 必須保存全局中斷之前的狀態(tài)并在結(jié)束后恢復(fù)中斷如果在擦除、程序在燒寫過程中中斷,F(xiàn)LASН 被鎖死。因此中斷使用的代碼或數(shù)據(jù)不能存儲(chǔ)在flash 或OTP 中。
將API 函數(shù)庫從FLASН 區(qū)域搬移到RAM 區(qū)域中。對(duì)API 函數(shù)進(jìn)行初始化,F(xiàn)lash_CallbackPtr 是全局函數(shù)指針,用于指定API操作時(shí)的函數(shù),在API 算法進(jìn)行程序擦除、燒寫和驗(yàn)證時(shí)都需要進(jìn)行調(diào)用。所以首先進(jìn)行Flash_CallbackPtr 的初始化,將其定義為空。擦除FLASН 將FLASН 區(qū)域所有位置1,擦除前要進(jìn)行預(yù)處理,由于燒寫過程需要對(duì)GPIO 進(jìn)行初始化,引腳將電平都拉高,所以進(jìn)行預(yù)處理將關(guān)掉PWM 等,防止GPIO 電平拉高對(duì)系統(tǒng)產(chǎn)生影響。
最后進(jìn)入程序主循環(huán),檢測(cè)SCI 通訊時(shí)DSP 收到的字符,當(dāng)檢測(cè)到秘鑰指令時(shí)正確時(shí)進(jìn)入燒寫函數(shù)FlashIAP_UpdataKey,此函數(shù)通過指令#pragma CODE_SECTION(FlashIAP_UpdataKey,"ramfuncs")將燒寫函數(shù)搬移到SARAM 中運(yùn)行。燒寫函數(shù)進(jìn)行。升級(jí)程序總體流程圖如圖3 所示。
TI 公司軟件CCS 對(duì)整個(gè)工程文件進(jìn)行編譯和鏈接后格式文件COFF,該數(shù)據(jù)格式復(fù)雜,不僅包含了以段的形式組織的代碼和數(shù)據(jù),而且還包含了文件頭、符號(hào)表、段地址、初始化段入口等信息,程序中的代碼和數(shù)據(jù)在COFF 文件中是以段的形式存在,通過編譯時(shí)配置不同的CMD 文件,將這些段分配到不同的DSP 地址空間。該文件格式的模塊化結(jié)構(gòu)與實(shí)際的內(nèi)存存儲(chǔ)區(qū)間不匹配,不能直接用來加載到RAM 或?qū)懭隖LASН 中,需要將其轉(zhuǎn)換成內(nèi)存能識(shí)別的НEX 數(shù)據(jù)格式[16]。НEX 文件每段的代碼可作如下表示:
:BBAAAATTНННН……НННCC
其中“:”為記錄開始的標(biāo)志;BB 為長度域,站一個(gè)字節(jié)長度,代表該段數(shù)據(jù)的數(shù)據(jù)字節(jié)數(shù),通常數(shù)據(jù)字節(jié)數(shù)為32 個(gè)字節(jié)。AAAA 為地址域代表該段第一個(gè)數(shù)據(jù)的地址,隨后在此地址基礎(chǔ)上增加以儲(chǔ)存數(shù)據(jù)。TT 為類型域,表示該段數(shù)據(jù)的數(shù)據(jù)類型。類型域?yàn)?X04,代表該行數(shù)據(jù)為擴(kuò)展地址,類型域?yàn)?X00 時(shí)代表該行數(shù)據(jù)為程序數(shù)據(jù),類型域?yàn)?X01 時(shí)代表該行數(shù)據(jù)為文件的結(jié)尾。 НН 為數(shù)據(jù)域。CC 該段所有字節(jié)相加將模除256 得到的余數(shù)取補(bǔ)碼作為校驗(yàn)和,占一個(gè)字節(jié)長度。
程序中Boot_LoaderFunc 函數(shù)為接收НEX 文件函數(shù),判斷SCI通訊收數(shù)為“:”則代表接收開始,只要接收字節(jié)數(shù)不為零均開始接收,當(dāng)數(shù)據(jù)類型為0x00 時(shí)進(jìn)行儲(chǔ)存,數(shù)據(jù)類型為04 代表擴(kuò)展地址,接收數(shù)據(jù)類型為01 時(shí)代表接收完畢。
在雙DSP 伺服控制板上與PC 機(jī)的上位機(jī)進(jìn)行實(shí)驗(yàn)。通過上位機(jī)選擇升級(jí)主控DSP 的程序時(shí)將該GPIO 拉高,CPLD 中邏輯進(jìn)行判斷當(dāng)相應(yīng)GPIO 被拉高時(shí),主控DSP 的SCIA 通道和上位機(jī)進(jìn)行交互。設(shè)置上位機(jī)波特率與程序中SCI 配置相同。要升級(jí)時(shí)輸入字符密鑰“u”。將編譯生成的НEX 文件發(fā)送,經(jīng)過擦除、燒寫和校驗(yàn)過程,返回程序燒寫成功。
本實(shí)驗(yàn)中主控DSP的用戶程序?yàn)镚PIO60每經(jīng)過0.1s翻轉(zhuǎn)一次,返回?zé)龑懗晒笾匦律想娺\(yùn)行程序,通過示波器觀測(cè)相應(yīng)GPIO 的輸出波形,可以看出反轉(zhuǎn)周期為0.1s 和預(yù)期一致,證明燒寫成功。實(shí)驗(yàn)測(cè)試升級(jí)過程,燒寫成功標(biāo)志和測(cè)試結(jié)果分別如圖4 到圖6 所示。
采用TMS320F28335 芯片的嵌入式系統(tǒng)在工業(yè)控制上應(yīng)用廣泛。本文在雙DSP 嵌入式系統(tǒng)硬件上開發(fā)了一種基于SCI 的程序升級(jí)方法,解決了遠(yuǎn)距離或者復(fù)雜環(huán)境下程序無法升級(jí)的問題,具有較大的實(shí)用性。本方案通過實(shí)驗(yàn)測(cè)試,運(yùn)行結(jié)果和用戶程序一致,表明程序燒寫到FLASН 區(qū)域,驗(yàn)證了燒寫方法的正確性。
圖4:上位機(jī)確認(rèn)升級(jí)
圖5:上位機(jī)燒寫成功
圖6:程序翻轉(zhuǎn)的GPIO 測(cè)試波形