張劍平 黃榮 高偉松


摘要??? 本文介紹在TMS320F28335DSP處理器平臺下,通過串口實現在線升級應用軟件的一種方法。串口通訊遵循Ymodem通訊協議,借助微軟Window操作系統自帶的超級終端,即可實現應用升級。避開了TMS320F28335自帶BootLoader升級軟件需占用GPIO口的弊端;本文論述的方法可避免編寫上位機軟件,是一種便宜的方法。
【關鍵詞】TMS320F28335 串口升級 串口 Ymodem協議
TI公司的TMS320F28335 DSP具有32位TMS320C28XCPU和FPU處理器,片上FLASH、SARAM以及外設相比TMS320F2812有了進一步的擴展和增強,它是目前控制領域中的先進處理器,在電機控制、變頻器、不間斷電源以及電力線通信等系統中應用越來越廣泛。一般而言,DSP系統設計完成后,程序需要固化在片上FLASH。應用升級固化可通過JTGA接口、或利用其量產固化的內置BootLoader程序來實現。但這兩種方式都存在限制:利用前者需要打開產品,這對于產品的量產來說,無論從效率上還是產品的完整性上來說,都不是好的途徑;利用后者,需要配置額外的GPIO口作為啟動選項。然而在系統設計過程中,這些特定的啟動管腳往往有系統設計的需求,被占用后可能無法滿足系統的功能設計。針對上述的問題,本文提出了一種新的應用升級方式:定制啟動程序(IAP),IAP在系統上電之后運行,設置超時后跳轉到應用程序,在超時時間范圍內利用串口Ymodem協議,實現應用程序的升級。本文從系統運行流程開始分析,論述整個原理和實現步驟。
1 系統運行流程分析
1.1 FLASH引導過程分析
在進行IAP設計之前,首先了解TMS320F28335 DSP運行過程。當系統上電復位后,程序到復位向量0x3FFFC0位置開始程序執行,在復位向量處根據向量內容跳轉到片上ROM里面的BootROM位置執行初始化引導函數InitBoot,InitBoot完成對芯片的初始化,并調用模式選擇函數SelectBootMode來確定引導模式,選擇JumptoFLASH模式,程序退出BOOT轉向FLASH中0x33FFF6處執行程序,用戶需要在0x33FFF6開始程序的設計,系統從復位開始到轉向FLASH過程如圖1所示。
1.2 IAP設計思路
TMS320F28335從FLASH引導后,直接跳轉到0x33FFF6這個地址,執行應用程序。為了達到我們的設計目的,在0x33FFF6這個地址插入一個IAP程序。這個程序也是本文所論述的實現串口在線升級程序的產品端固件。插入這個固件之后,TMS320F28335從FLASH引導后不會直接跳轉到應用程序,而是先引導到IAP固件程序。這個固件固化在FLASH中,被執行之后,等待用戶的確認。設計一個3s的超時等待,如果用戶未確認,則超時后跳轉到應用程序。否則執行應用軟件
2 IAP固件原理和實現
2.1 運行過程分析
如圖3所示,IAP固件固化在FLASH中,入口地址為0x33FFF6。TMS320F28335從FLASH引導后,跳轉到UnsecuredFLASH中執行IAP程序。IAP程序必須包含以下幾個功能:
(1)串口通訊功能。接收用戶下發的應用程序;下文論述實現符合YMODEL協議的串口通訊功能。
(2)FLASH讀寫功能;該功能用于將下載的應用程序燒錄到FLASH中。但是TMS320F28335不支持代碼在FLASH中運行的同時操作FLASH,因此需要將FLASH操作的代碼拷貝到RAM中執行。
(3)自我復制功能;該功能即是(2)要求的功能。該功能通過copy_sections例程來實現。如圖2所示。
(4)跳轉到應用程序的功能。
綜合上述,IAP程序在FLASH中開始執行,code_start,wd_disable,Copy_sections例程。Copy_sections例程之后,完成將本身拷貝到UnsecuredRAM中執行。然后跳轉到Unsecured RAM繼續執行IAP程序,完成上述(1)、(2)、(4)功能。
因此,code_start,wd_disable,Copy_sections段例程是加載和運行都在FLASH中的。而c_init00開始的流程,是加載在FLASH中,但是運行在RAM中的。這個功能的實現是通過IAP程序生成時,CMD鏈接文件配置來實現的。下節將對此說明。
2.2 加載和運行配置
IAP程序固化在FLASHA扇區中,拷貝到RAM中執行。
(1)更改DSP2833x_SysCtrl.c文件。#pragmaCODE_SECTION(InitFlash,"ramfuncs");語句。使InitFlash編譯到.text段。
(2)更改DSP2833x_usDelay.asm文件。將函數DSP28x_usDelay的段描述符由.sect"ramfuncs"更改為.text。0
(3)更改DSP2833x_CodeStartBranch.asm文件。code_start函數中,跳轉到LB_c_int00;更改為LBcopy_sections;
(4)更改DSP2833x_CodeStartBranch.asm文件。wd_disable函數中,跳轉到LB_c_int00;更改為LBcopy_sections;
(5)Flash28335_API_V210加入到工程;
(6)將4532.DSP28xxx_SectionCopy_nonBIOS.asm加入到工程;
(7)修改.cmd文件。SECTIONS中加入:wddisable:>FLASHA,PAGE=0wddisable段原來描述在.text段中。
因為.text段被拷貝到RAM中執行。而wddisable需要在FLASH中執行。因此區別.text段單獨描述。
(8)修改.cmd文件。SECTIONS中加入:copysections:>FLASHA,PAGE=0
(9)修改.cmd文件。SECTIONS中加入:Flash28_API:
{
-lFlash28335_API_V210.lib(.econst)-lFlash28335_API_V210.lib(.text)
}
LOAD=FLASHB,
RUN=RAML0,LOAD_START(_Flash28_API_LoadStart),
LOAD_END(_Flash28_API_LoadEnd),RUN_START(_Flash28_API_RunStart),PAGE=0(10)8修改.cmd文件。.text段連接描
述更改為:
.text:LOAD=FLASHB,
RUN=RAML0,PAGE=0LOAD_START(_text_loadstart),RUN_START(_text_runstart),SIZE(_text_size)修改之后,4532.DSP28xxx_SectionCopy_
nonBIOS.asm會將.text的段拷貝到_text_runstart初執行。該部操作在LBcopy_sections中完成。
(11)在main函數中,完成Flash28_API段的拷貝。_Flash28_API_LoadStart拷貝到_Flash28_API_RunStart。單獨拷貝Flash28_API段,是因為Flash28_API段沒有描述成.text段,因此不會在LBcopy_sections中完成拷貝。
2.3 程序的燒錄和跳轉
應用程序固化在FLASHC扇區中。為了實現跳轉。我們需要將應用程序的code_start代碼固化在FLASHC地址0x13E000處。因為需要更改應用程序的cmd文件。
MEMORY
{
...CINT00:origin=0x13E000,length=
0x000050
...
}
SECTION
{
...boot:>CINT00PAGE=0
{-lrts2800_fpu32lib
}
...
}
跳轉程序的實現:
typedefvoid(*pFunction)(void);
pFunctionJump_To_Application=(pFunction)0x13E000;
Jump_To_Application();
3 升級操作
通過JTAG接口將IAP程序固化到TMS28335芯片中。打開超級終端,配置IAP程序中對應的串口波特率,這里為38400bps,無校驗。系統上電,3s之內,輸入IAP程序中約定的升級密碼,這里為(“stop”),選擇傳送,發送文件,將目標代碼bin發送升級。如圖4所示。
4 總結
本文首先論述了TMS320F28335通過串口在線加載程序必要性和優越性。接著從TMS320F28335啟動流程開始分析,討論了固件和應用程序的連接位置。然后討論了固件的實現。通過本文的論述,實現了TMS320F28335固件設計的一種新思路。
參考文獻
[1]TI. TMS320x2833x, 2823x BOOT ROM Reference Guide(Literature Number: SPRU963A), 2007-Revised 2008.
[2]TI. Copying Compiler Sections From Flash to RAM on the TMS320F28xxx DSCs(Literature Number: SPRAAU8), 2008
[3]TI.TMS320F28335,28334,28332 Flash APIs For creating custom programming solutions for the TMS32F28335, 28334,28332 DSPs, Release version,2008.08.