在TMS320F2812上實(shí)現(xiàn)從flash拷貝整個(gè)程序到RAM上運(yùn)行的方法探討_第1頁
在TMS320F2812上實(shí)現(xiàn)從flash拷貝整個(gè)程序到RAM上運(yùn)行的方法探討_第2頁
在TMS320F2812上實(shí)現(xiàn)從flash拷貝整個(gè)程序到RAM上運(yùn)行的方法探討_第3頁
在TMS320F2812上實(shí)現(xiàn)從flash拷貝整個(gè)程序到RAM上運(yùn)行的方法探討_第4頁
在TMS320F2812上實(shí)現(xiàn)從flash拷貝整個(gè)程序到RAM上運(yùn)行的方法探討_第5頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、在TMS320F2812上實(shí)現(xiàn)從flash拷貝整個(gè)程序到 RAM上運(yùn)行的方法探討1. 刖言TMS320F2812 DSP里,代碼從內(nèi)部flash里運(yùn)行,比從內(nèi)部 RAM里運(yùn)行 要慢30%左右,所以對(duì)運(yùn)行時(shí)間苛刻的程序直接在 flash里運(yùn)行,往往不能滿 足要求。故而,需要將代碼拷貝到 RAM以提高運(yùn)行速度。TI文檔只提供了部 分代碼從flash拷貝到RAM中的方法。然而,在一些應(yīng)用中,需要將整個(gè)代碼 段都拷貝到RAM中執(zhí)行,以提高整體運(yùn)行速度。本文通過對(duì)TMS320F2812的 啟動(dòng)代碼研究,來探討如何在從FLASH啟動(dòng)后將整個(gè)代碼段拷貝到 RAM中, 然后在RAM中運(yùn)行的方法。2. TMS3

2、20F2812 啟動(dòng)過程TMS320F2812的內(nèi)部存儲(chǔ)器中,0x3F F000 -0x3FFFC0 是 4K*16 的 Boot ROM。KMth laijles andMutt uptfM&S < 妹x 16IKx 16 <Orvchip bool ROMSects start0w3F FQQO0K3F F5C?0x3F F7t2X3F F3340x3F F9E&0x3F FB5O0x3F FCCO0k3F FFCOOx3F FFFF圖1 2812內(nèi)部BootRom地址圖CPU向量表位于北部 ROM的底端(0x3FFFC0 - 0x3FFFF)。當(dāng)VMAP=1,

3、ENPIE=0 ,MPNMC=0時(shí),該向量表被激活。復(fù)位向量出廠時(shí)被編 程指向函數(shù)InitBoot。這個(gè)函數(shù)開始啟動(dòng)過程。當(dāng)然,啟動(dòng)過程完成之后, 我們需要初始化PIE中斷向量表,同時(shí)使能PIE block。初始化PIE中斷向量 表之后,除了復(fù)位,所有中斷向量均從 PIE獲得。TMS320F2812啟動(dòng)代碼固化在該內(nèi)部 ROM中。當(dāng)TMS320F2812上電或者熱復(fù)位后,首先由芯片本身將一些寄存器初始化:PIE disabled(ENPIE=0,VMAP=1,0BJMDE=0,AM0DE=0,M0M1MAP=1), 然后dsp芯片會(huì)對(duì)XMPNMC管腳采樣,根據(jù)采樣值的高低,來決定啟動(dòng)模 式是“

4、微處理器模式”還是“微計(jì)算機(jī)模式”。當(dāng) XMPNMC=0時(shí),為“微 計(jì)算機(jī)模式”,此時(shí),啟動(dòng)ROM存儲(chǔ)器被使能而XINTF Zone 7被禁止。復(fù) 位向量從內(nèi)部啟動(dòng)ROM獲取,啟動(dòng)ROM在復(fù)位期間一直被使能。啟動(dòng)ROM里的復(fù)位向量(位于 0x3FFFC0)指向InitBoot函數(shù)(位于 0x3FFC00)。在完成器件初始化(InitBoot)之后,Boot loader將檢查GPIO管 腳的狀態(tài),然后再?zèng)Q定選用的啟動(dòng)模式。啟動(dòng)模式有4種:跳轉(zhuǎn)到flash,跳轉(zhuǎn)到H0 SARAM,跳轉(zhuǎn)到OTP或者調(diào)用片上啟動(dòng)程序。Ini tBoot Fu ncti on所做工作有:1.初始化狀態(tài)寄存器;2.將堆

5、棧指針設(shè)為 0x400( 0x400 - 0x44F作為啟動(dòng)過程中的堆棧);3.讀CSM密碼保護(hù)部分; 4.調(diào)用 SelectBootMode; 5調(diào)用 ExitBoot在完成選擇啟動(dòng)模式過程之后,根據(jù)選擇的啟動(dòng)模式,dsp會(huì)跳到相應(yīng)的啟動(dòng)入口。也可以自己選擇啟動(dòng)入口。這些入口地址都在這之前已經(jīng)被 dsp 定義好的。如果從flash啟動(dòng),那么我們的管腳狀態(tài)應(yīng)該是GPIOF4GPIOF12GPIOF3GPIOF2(SCITXDA)(MDXA)(SPISTEA)(SPICLK)內(nèi)部上拉無內(nèi)部上拉無內(nèi)部上拉無內(nèi)部上拉Mode Selected1xxxJump to Flash address 0x3

6、F 7FF6下圖為BootROM函數(shù)的流程圖Reset圖2 BootROM函數(shù)的流程圖對(duì)于內(nèi)部flash啟動(dòng),如圖I U»r I programmed H branch to desirfrtf foattlon圖3跳轉(zhuǎn)到Flash啟動(dòng)的流程圖 在0x3F7FF6必須放置一個(gè)跳轉(zhuǎn)指令,該指令跳轉(zhuǎn)到你自己的啟動(dòng)代碼或者 應(yīng)用程序。3. 搬移思路根據(jù)上節(jié)2的啟動(dòng)過程,flash啟動(dòng)過后,跳到0x3F7FF6,然后根據(jù)其 內(nèi)容再跳轉(zhuǎn)到應(yīng)用程序。我們?cè)谶@里稍微修改一下,就可以將 PC指針跳到 RAM首地址,程序就能在 RAM里運(yùn)行了。將“搬移程序”燒在flash上,從flash啟動(dòng)之后,“搬

7、移程序”會(huì)被執(zhí) 行?!鞍嵋瞥绦颉弊龅墓ぷ骶褪菍ⅰ皯?yīng)用主程序”代碼拷貝到內(nèi)部RAM,然后經(jīng)過初始化環(huán)境(InitBoot,ExitBoot),將PC指針指向RAM里代碼首地 址。這樣,你的程序就在RAM中運(yùn)行起來了。也就是說,我們需要一個(gè)“搬 移程序”,啟動(dòng)時(shí)運(yùn)行,用來拷貝flash上的代碼到RAM中;當(dāng)然,還需要 一個(gè)你的“應(yīng)用主程序”,該主程序被“搬移程序”從flash里“挪”到RAM 后在RAM中運(yùn)行。我們還要做的工作就是,把“應(yīng)用主程序”燒寫到 flash 里的某一塊,這個(gè)塊又不會(huì)影響flash啟動(dòng)時(shí)運(yùn)行“搬移程序”。完成這個(gè) 燒寫過程的程序,我們稱之為flash燒寫程序??偨Y(jié)一下,完成

8、整個(gè)搬移過程,一共需要三個(gè)程序?!鞍嵋瞥绦颉焙汀皯?yīng) 用主程序”被固化到flash里“燒寫flash程序”將“應(yīng)用主程序”燒入flash 中指定的塊中。TI的燒寫flash插件用來燒寫“搬移程序”。4. 搬移方法1)首先你要用的主程序必須編譯通過,并且通過仿真器在RAM里運(yùn)行無問題。將主程序的CMD文件進(jìn)行改寫,保證程序段(.text 段)分配在連續(xù) 的存儲(chǔ)空間。程序從flash啟動(dòng),所有初始化段鏈接在非易失存儲(chǔ)器里,而 非初始化段必須鏈接在易失存儲(chǔ)器。我們可以把初始化段都放在一個(gè)連續(xù)的內(nèi)部RAM空間,而非初始化段放在另一個(gè)內(nèi)部 RAM空間。如果你的代碼 不是很大,也可以都放在連續(xù)的 RAM空間

9、。但在實(shí)際項(xiàng)目中,通常你會(huì)遇 到存儲(chǔ)空間不夠的問題。這時(shí)就要考慮將無關(guān)緊要的段放在另外的非程序空 間了。.c in itFlash.cioRAM.con stFlash.eco nstFlash.p in itFlash.switchFlash.textFlash.bssRAM.ebssRAM.stackLower 64Kw RAM.sysmemRAM.esysmemRAM.resetRAM1例如:view pla inc opy to clipboardpri nt?1. MEMORY2.2. 4.3. PAGE 0 :6.4. RAMHO : origin = 0x3F8000, leng

10、th = 0x0020008.9.10.5. PAGE 1 :12.6. /* SARAM*/14.7. RAMM0M1 : origin = 0x000000, length = 0x00080016.8. RAML0L1 : origin = 0x008000, length = 0x00200018.9. 20.21.22.23.24.25. SECTIONS26.27. 28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.49.50.51.52.53.54.55.56.57./* Allocate program

11、 areas: */.reset: > RAMHO PAGE = 0vectors: > RAMH0 PAGE = 0.cinit: > RAMH0 PAGE = 0.text: > RAMH0 PAGE = 0const: > RAMH0 PAGE = 0.econst: > RAMH0 PAGE = 0switch: > RAMH0 PAGE = 0/* Allocate data areas: */.stack: > RAMM0M1 PAGE = 1.bss: > RAML0L1 PAGE = 1.ebss: > RAML0L1

12、 PAGE = 1.sysmem: > RAML0L1 PAGE = 1從上面的CMD可知,主程序代碼均放在 RAMH0中,長度為0x2000。2) 其次,將該工程編譯成功后,加載到內(nèi)部ram,仿真器自動(dòng)完成必要的初始 化環(huán)境之后,pc指針應(yīng)該指向_c_init00,記下現(xiàn)在PC指針的位置,在Boot.asm 中會(huì)用到。3) 自制一個(gè)flash燒寫程序,或者從網(wǎng)上下載其他網(wǎng)友的flash燒寫程序,將目 標(biāo)地址放在除flashJ塊以外的塊中。燒寫的長度不能小于被燒寫的主程序長度。 該燒寫程序在RAM中運(yùn)行。,其代碼段不能和被燒寫的主程序用的代碼段存儲(chǔ)區(qū) 域相同,否則會(huì)破壞主程序在ram中的

13、代碼。燒寫之后,可以用CCS的Save data功能,來查看flash中的數(shù)值是否和ram 里主程序空間數(shù)值一致。4) 用TI的燒寫插件燒寫“搬移程序”。注意,該“搬移程序”要能在 dsp啟動(dòng) 后執(zhí)行。并且,燒寫的時(shí)候,不能將上一步燒到flash上的主程序代碼擦除?!鞍?移程序”具體見下節(jié)。5. “搬移程序”具體實(shí)現(xiàn)方法Boot.asm文件內(nèi)容:view pla inc opy to clipboardpri nt?1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.

14、34.35.def _lnitBootref _EntryAddr_Href _EntryAddr_L.sect ".InitBoot"InitBoot;1) Initalizes the stack pointer;2) Sets the devicefor C28x operating mode;3) Calls the main boot functions;4) Calls an exit routineInitBoot:;Initalize the stack pointer.MOV SP, #0 ; Initalize the stack pointer;Ini

15、talize the devicefor running in C28x mode.C28OBJ ; Select C28xobject mode36.37.38.39.40.41.42.43.44.45.46.47.48.49.50.51.52.53.54.55.56.57.58.59.60.61.62.63.64.65.66.67.68.69.70.71.72.73.74.75.76.77.78.79.C28ADDR ; Select C27x/C28x addressingC28MAP ; Set blocks M0/M1for C28x modeCLRC PAGE0 ; Always

16、use stack addressing modeMOVW DP,#0 ; Initialize DP to point to the low 64 KCLRC OVM;Set PM shift of 0SPM 0;Read the password locations- this will unlock the;CSM only if the passwords are erased. Otherwise it;will not have an effect.MOVL XAR1,#0x3F7FF8;MOVL XAR0,*XAR1+MOVL XAR0,*XAR1+MOVL XAR0,*XAR1

17、+MOVL XAR0,*XAR1;Cleanup and exit. Atthis point the EntryAddr;is located in the ACC registerBF _ExitBoot,UNCJ;ExitBoot80.81.82.83.84.85.86.87.88.89.90.91.92.93.94.95.96.97.98.99.100.101.102.103.104.105.106.107.108.109.110.111.112.113.114.115.116.117.118.119.120.121.122.123.;This module cleans up aft

18、er the boot loader;1) Make sure the stackis deallocated.;SP = 0x400 after exiting the boot;loader;2) Push 0 onto the stack so RPC will be;0 after using LRETR to jump to the;entry point;2) Load RPC with the entry point;3) Clear all XARn registers;4) Clear ACC, P and XT registers;5) LRETR - this will

19、also clear the RPC;register since 0 was on the stackExitBoot:;Insure that the stackis deallocatedMOV SP,#0;Clear the bottom of the stack. This will endup;in RPC when we are finished124.125.126.127.128.129.130.131.132.133.134.135.136.137.138.139.140.141.142.143.144.145.146.147.148.149.150.151.152.153

20、.154.155.156.157.158.159.160.161.162.163.164.165.166.167.MOV *SP+,#OMOV *SP+,#0NOPNOPNOPNOPNOPNOPNOPNOPNOP;Load RPC with the entry pointas determined;by the boot mode. This address will be returned;in the ACC register.;向堆棧中壓入0x3f8000,該地址即為主程序在 ram中運(yùn)行的首地址MOV *SP+, #0x8000MOV *SP+, #0x3FNOPNOPNOPNOPNO

21、PNOPNOPNOPNOPPOP RPCNOPNOPNOPNOPNOPNOPNOPNOP168.169.170.171.172.173.174.175.176.177.178.179.180.181.182.183.184.185.186.187.188.189.190.191.192.193.194.195.196.197.198.199.200.201.202.203.204.205.206.207.208.209.210.211.NOP;Put registers back in their reset state.212.213.214.215.216.217.218.219.220.

22、221.222.223.224.225.226.227.228.229.230.231.232.233.234.235.236.237.238.239.240.241.242.243.244.245.246.247.248.249.250.251.252.253.254.255.;Clear all the XARn, ACC, XT, and P and DP;registers;NOTE: Leave the devicein C28x operating mode;(OBJMODE = 1, AMODE = 0)ZAPAMOVL XT,ACCMOVZ AR0,ALMOVZ AR1,ALM

23、OVZ AR2,ALMOVZ AR3,ALMOVZ AR4,ALMOVZ AR5,ALMOVZ AR6,ALMOVZ AR7,ALMOVW DP, #0;Restore ST0 and ST1. Note OBJMODEis;the only bit not restored to its reset state.;OBJMODE is left set for C28x object operating256.257.258.259.260.261.262.263.264.265.266.267.268.269.270.271.272.273.274.275.276.277.278.279.

24、280.281.282.283.284.285.286.287.288.289.290.291.292.293.294.295.296.297.298.299.;mode.;STO = 0x0000 ST1 = OxOAOB;15:10 OVC = 0 15:13 ARP = 0;9: 7 PM = 0 12 XF = 0;6 V = 0 11 M0M1MAP = 1;5 N = 0 10 reserved;4 Z = 0 9 OBJMODE = 1;3 C = 0 8 AMODE = 0;2 TC = 0 7 IDLESTAT = 0;1 OVM = 0 6 EALLOW = 0;0 SXM = 0 5 LOOP = 0;4 SPA = 0;3VMAP = 1;2 PAGE0 = 0;1DBGM = 1;0 INTM = 1MOV *SP+,#0MOV *SP+,#0x0A0BNOP300.301.302.303.304.305.306.307.308.309.310.311.312.313.314.315.316.317.318.319.320.321.322.323.324.325.326.327.328.329.33

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論