TMS320F28xxDSP中內(nèi)部Flash的應(yīng)用研究_第1頁
TMS320F28xxDSP中內(nèi)部Flash的應(yīng)用研究_第2頁
TMS320F28xxDSP中內(nèi)部Flash的應(yīng)用研究_第3頁
TMS320F28xxDSP中內(nèi)部Flash的應(yīng)用研究_第4頁
TMS320F28xxDSP中內(nèi)部Flash的應(yīng)用研究_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、TMS320F28xx DSP中內(nèi)部Flash的應(yīng)用研究專業(yè)知識2021-07-05 22:22閱讀14評論0字號: 大大 中中 小小1前言TMS320F28xx DSP片內(nèi)有128 KX 16 bit字的Flash、兩塊4 K x16bit字的單周期訪問RAM(SARAM)LO和L1、一塊8 Kxl6 bit字的單周期訪問RAM(SARAM)HO、 兩塊1 Kxl6 bit字的單周期訪問RAM(SARAM)M0和M1。 由于存儲器種類多、容量大, 所以從系統(tǒng)的高度來配置各個存儲器必須有適宜的方法,而這些方法一般都與片內(nèi)Flash有關(guān)。另外,TMS320F28xx DSP片內(nèi)有看門狗定時器模塊

2、(WDT)、引導ROM(ROM bootloader)模塊、代碼平安模塊(CSM),要合理地使用這些模塊為整個系統(tǒng)效勞,必定也要用到Flash。由此可以看出,F(xiàn)lash的地位和作用比擬顯著所以本文就Flash的幾種用法作了研究。2從Flash拷貝段到RAM21拷貝中斷向量在TMS320F28xx器件中,外設(shè)擴展中斷(PIE)模塊管理中斷請求。上電時,所有中斷向量必 須位于非易失性存儲器(如Flash)中,但是要把中斷向量拷貝到PIEVECT RAM中,這是用戶代碼中器件初始化程序的一局部。PIEVECT RAM是一個特定的RAM塊,它在當前TMS320F28xx器件中是一個256X 16的塊.

3、在數(shù)據(jù)空間中的起始地址為Ox000D00。把中斷向量連接到Flash,然后在運行時把中斷向量拷貝到PIEVECT RAM中,有許多方法可以實現(xiàn)。一個方法是創(chuàng)立包含函數(shù)指針的常量C結(jié)構(gòu)體,該結(jié)構(gòu)體包括128個32-bit向量。如果使用DSP281x或者DSP280 x夕卜設(shè)的結(jié)構(gòu)體.這個結(jié)構(gòu)體叫做PieVectTableInit,它已經(jīng)在DSP281x_PieVectc或者DSP280 x_PieVect.c創(chuàng)立(參看TI提供的例程)。因為這個結(jié)構(gòu)體使用const類型關(guān)鍵詞,所以它將會被編譯器放置在.econst段中。運行時只需要把這個結(jié)構(gòu)體拷貝到PIEVECT RAM中。C編譯器運行時支持庫包

4、含名為memcpy的存儲器拷貝函數(shù),該函數(shù)可以被用來完成拷貝任務(wù),其用法如下所示:#includevoid main() /Initialize the pie_ramPieCtrlRegs.PIECTRL.bit.ENPIE=0;/disable the PIEasm( EALLOW); /enable the eallow protected register accessmemcpy(void*)0 x00D00,&PieVectTableInit,256);asm(EDIS); /disable the eallow protected register access以上這個例

5、子為PIE RAM起始地址使用的硬編碼地址(hard coded address),明確指定為0 x000D00。 但是硬編碼地址并不是較好的編程方式,用戶可以使用DATA_SECTION指令創(chuàng)建一個非初始化的假變量(dummy variable),并把這個變量連接到PIE RAM然后用這個假變量的名字來代替硬編碼地址。例如,當使用DSP281x或者DSP280 x外設(shè)結(jié)構(gòu)體時,創(chuàng)立一個名為PieVectTable的非初始化結(jié)構(gòu)體,并把該結(jié)構(gòu)體連接到PIEVECT RAM。前面例子中的memcpy()函數(shù)可以被替換為:memcpy(&PieVectTable,&PieVectT

6、ableInit,256);注意拷貝長度是256個16-bit字對應(yīng)為128個32-bit字。22初始化Flash控制存放器Flash控制存放器FOPT、FPWR、 :FSTDBY-WAIT、FACTIVEWAIT、FBANKWAIT、FOTPWAIT的初始化代碼不能從Flash存儲器當中運行否那么就會有不可預(yù)料的結(jié)果出現(xiàn)。所以,F(xiàn)lash控制存放器的初始化函數(shù)在運行時必須從Flash(它的裝載地址)拷貝到RAM(它的運行地址)。Flash控制存放器由Code Security Module(CSM)保護。如果CSM被保護起來了,那么必須從被保護的RAM(例如:L0或者L1 SARAM)運行F

7、lash控制存放器的初始化代碼,否那么Flash控制存放器的初始化代碼無法訪問Flash控制存放器。 要注意的是,當器件復(fù)位的時候CSM一般都是被保護起來的,雖然使用假密碼0 xFFFF時ROM BOOTLOAD-ER會把它解鎖。C編譯器的CODE_SECTION指令可以用來為Flash控制存放器的初始化函數(shù)創(chuàng)立獨立的可連接段。例如:假定Flash控制存放器的配置在C函數(shù)InitFlash()中實現(xiàn),并且想把這個函數(shù)放置在名為secureRamFuncs的可連接段當中。以下的C代碼例程顯示了CODE_SECTION命令在Flash存儲器配置中的正確用法:#pragma CODE_SECTION

8、(InitFlash,secureRamFuncs)void InitFlash(void)asm(EALLOW);/Enable EALLOW protected register asscessFlashRegs.FPWR.bit.PWR=3;/Flash set to active modeFlashRegs.FSTATUS.bit.V3STA T=1;/Clear the 3VSTAT bitFlashRegs.FSTDBYWAIT.bit.STDYYW AIT=0 x01FF;/Sleep to standy cyclesFlashRegs.FACTIVEW AIT.bit.ACIT

9、IVEW AIT=0 x01FF;/Standby to active cyclesFlashRegs.FBANKWAIT.bit.RANDW AIT=3;/F280 x Random access wait statesFlashRegs.FBANKWAIT.bit.PAGEW AIT=3;/F280 x Paged access wait statesFlashRegs.FOTPWAIT.bit.OTPW AIT=5;/F280 x OTP wait statesFlashRegs.FOTP.bit.ENPIPE=1;/Enable the Flash pipelineasm(EDIS);

10、/Disable EALLOW protected register accessasm(RTP #6 | NOP);/end of InitFlash()secureRamFuncs段可以使用用戶連接命令文件(d)進行連接。這個段需要獨立的裝載和運行地址。另外, 還想讓連接器生成一些全局符號,這些全局符號可以用來決定裝載地址、運行地址、 段長度。 在實現(xiàn)把這個段從裝載地址拷貝到它的運行地址時需要這些信息。用戶連接命令文件如下所示:*Users linker command fileSETIONSsecureRamFuncs:LOAD=FLASH,PAGE=0RUN=SECURE_RAM,PA

11、GE=0RUN_START(_secureRamFuncs_runstart),LOAD_START(_secureRamFuncs_loadstart),LOAD_END(_secureRamFuncs_loadend)在這個例子中,假定存儲器Flash和SECURE_RAM都已經(jīng)在用戶連接命令文件中的MEMORY段中定義。這些存儲器的PAGE標識符要與它們的存儲器定義相匹配。在上面的例程中假定兩個存儲空間都已經(jīng)在PAGE 0(程序存儲空間)中聲明過了。RUN_START、LOAD_START、LOAD_END指令將生成全局符號,這些全局符號有特定的名稱,對應(yīng)著相應(yīng)的地址。最后,這個段必須在

12、運行時從Flash拷貝到RAM,可以用到編譯器運行支持庫里面的函數(shù)memcpy()。*Users C_source file#includeextern unsigned int secureRamFuncs_loadstart;extern unsigned int secureRamFuncs_loadend;extern unsigned int secureRamFuncs_runstart;void main(void)memcpy(&secureRamFuncs_runstart&secureRamFuncs_loadstart&secureRamFuncs

13、_loadend-&secureRamFuncs_loadstart);InitFlash();23性能最優(yōu)化常數(shù)是那些用C語言的const類型關(guān)鍵詞聲明的數(shù)據(jù)結(jié)構(gòu)。編譯器把所有的常數(shù)放置在.econst段中(假定為大存儲模式)。當前TMS320F28xx器件上的特殊管道(special pipelining)提高Flash上運行代碼的性能時每次訪問位于片上Flash中的數(shù)據(jù)常數(shù)會占用許多周期。特別是在150 MHz TMS320F281x DSP上Flash等待狀態(tài)要到達5個周期100 MHzTMS320F280 x DSP到達3個周期。所以,訪問片上RAM中的常數(shù)與常數(shù)表那么成為沉

14、重的負擔。然而,分立式嵌入式系統(tǒng)要求所有的初始化數(shù)據(jù)(如常數(shù))最初都是位于非易失性存儲器中, 所以,必須為想訪問的RAM中的常數(shù)建立獨立的裝載和運行地址在運行時把這些常數(shù)從片上Flash中拷貝到RAM中。這里介紹兩種不同的實現(xiàn)方法。方法一:在RAM中運行所有的常數(shù)陣列。這種方法是為整個.econst段指定獨立的裝載和運行地址。其好處是容易使用,而害處是RAM的使用量非常大(可能只有少量常數(shù)需要快速訪問,但是用這種方法所有的常數(shù)都位于RAM)。在用戶連接命令文件中簡單地為整個.econst段指定獨立的裝載和運行地址,然后在運行時通過拷貝整個.econst段的方式往工程中添加代碼。例如:/User

15、s linker command fileSECTIONS.econst: LOAD=Flash, PAGE=0RUN=RAM,PAGE=1RUN_STAR(_econst_runstart),LOAD_START(_econst_loadstart),LOAD_END(_econst_loadend)/Users C-source file#include extern unsigned int secureRamFuncs_loadstart;extern unsigned int secureRamFuncs_loadend;extern unsigned int secureRamFu

16、ncs_runstart;void main(void)memcpy(&econst_runstart,&econst_loadstart,&econst_loadend-&econst_loadstart();方法二:在RAM中運行特定的常數(shù)陣列。這種方法是在運行時有選擇性地從Flash拷貝常數(shù)到RAM。與方法一相似,這個流程能夠完成預(yù)期功能,不同點是只有在命名段中被選擇了的常數(shù)才會被拷貝到RAM中(而不是把所有的常數(shù)都拷貝到RAM中)。假定想創(chuàng)立在RAM中運行的5個字的常數(shù)陣列,并命名為table。DATA_SECTION指令用來把table口放置在名為ra

17、mconsts的用戶自定義段中。相應(yīng)的C源程序如下所示:#pragma DATA_SECTION(table,ramconsts)const int table5=1,2,3,4,5;void main()使用用戶連接命令文件連接ramconsts段,裝載到Flash而從RAM中運行,生成全局符號來幫助存儲器拷貝。用戶連接命令文件如下所示:SECTIONSramconsts: LOAD=Flash, PAGE=0;RUN=RAM,PAGE=1LOAD_START_ramconsts_loadstart,LOAD_END_ramconsts_loadend,RUN_START(_ramconst

18、s_runstart)最后,在運行時必須把table口從裝載地址拷貝到運行地址:#include extern unsigned int ramconsts_loadstart;extern unsigned int ramconsts_loadend;extern unsigned int ramconsts_runstart;void mainvoidmemcpy&ramconsts_runstart,&ramconsts_loadstart,&ramconsts_loadend-&ramconsts_loadstart;3 CSM密碼的編程TMS320F2

19、8xx器件上的代碼平安模塊CSM提供了保護,防止非法的程序拷貝。在當前的TMS320F28xx器件中,整個Flash、OTP存儲器,LO和L1都被CSM保護Flash配置存放器同樣被保護。當器件被保護的時候,只有從被保護的存儲空間運行的代碼可以訪問讀或?qū)懫渌槐Wo存儲空間中的數(shù)據(jù)。從非保護的存儲空間運行的代碼不可以訪問被保護存儲空間中的數(shù)據(jù)。CSM使用128-bit密碼組成8個單獨的16-bit字。在當前的TMS320F28xx器件上,這些密碼被存儲在Flash的最高8個字中如地址:Ox3F7FF8-Ox3F7FFF。在開發(fā)過程中,建議在密碼位置放入假密碼0XFFFF。使用假密碼時,對CSM解

20、保護只需假讀密碼位置。把假密碼放在密碼位置是很容易的因為在Flash編程過程中Flash被去除后這些位置的狀態(tài)將會是0XFFFF。用戶只需要在自己的代碼工程中防止連接任何段到密碼地址,密碼將保持為OXFFFF。在開發(fā)完成以后 可能想把真正的密碼放在密碼位置中。另外, 為了正確地保護CSM模塊,當 前TMS320F28XX器 件 上 的CSM模 塊 需 要 編 寫 值OX0000到Flash的 地 址0X3F7F80-OX3F7FF5。 完成這兩個任務(wù)的最簡單的方法是用少量匯編語言進行編程。下面是一個匯編代碼例子,這個例子指定了想要的密碼值,并且把它們放在一個名為pass-words的初始化段中

21、。另外創(chuàng)立了一個名為csm_rsvd的初始化段,這個段的值全部是0 x0000.并且這個段有適當?shù)拈L度以適合地址OX3F7F80-0X3F7FF5。注意,這個例子顯示的是假密碼值0XFFFF.用戶可以用自己的密碼代替這些假密碼。*File: passwords.asm .sect 0 xFFFF; PWL0(LSW of128-bit password).int 0 xFFFF; PWL1.int 0 xFFFF; PWL2.int 0 xFFFF; PWL3.int 0 xFFFF; PWL4.int 0 xFFFF; PWL5.int 0 xFFFF; PWL6

22、.int 0 xFFFF; PWL7(MSW of128-bit password).sect csm_rsvd.loop(3F7FF5h-3F7F80h+1).int 0 x0000.endloop.end ;end of file passwords.asm在這里必須警告用戶:不要把8個密碼的值全部設(shè)為Ox0000, 這樣做會永久地鎖定CSM模塊!passwords和CSB_rsvd段要由用戶連接命令文件放置在存儲器中。下面的例子適用于當前TMS320F28xx器件(對于其他器件,請參考器件數(shù)據(jù)手冊以確定密碼和CSM保存位置的地址)。MEMORYPAGE 0;/*Program Memor

23、y*/CSM_RSVD; origin=0 x3F7F80, length=0 x000076PASSWORDS: origin=0 x3F7FF8, length=0 x000008PAGE 1:/*Data Memory*/SECTIONSpasswords:PASSWORKS, PAGE=0csm_rsvd:CSM_RSVD,PAGE=04在DSP復(fù)位以后從Flash運行代碼TMS320F28xx具有引導ROMROM bootloader, 器件復(fù)位以后ROM bootloader能把代碼運行轉(zhuǎn)到Flash中。當引導模式選擇引腳被配置為跳轉(zhuǎn)到Flash時.ROM bootloader將跳

24、轉(zhuǎn)到Flash中位于地址Ox3F7FF6處的指令。用戶需要在這個地址上安排一條指令,這條指令跳轉(zhuǎn)到用戶代碼。由于CSM密碼從地址Ox3F7FF8開始,所以剛好有2個字可用于存放這個跳轉(zhuǎn)指令。并非巧合的是,長跳轉(zhuǎn)指令在匯編代碼中為LB剛好占用2個字。一般情況下,跳轉(zhuǎn)指令將會跳轉(zhuǎn)到C編譯器運行支持庫中C環(huán)境初始化程序的起始位置。這個程序的人口標號是_c_int00。在這個程序沒有運行的時候C代碼就不能運行。同樣地,有時候在開始運行用戶的C應(yīng)用程序之前需要執(zhí)行少量的匯編代碼例如:禁止看門狗時鐘外設(shè)。這樣,跳轉(zhuǎn)指令需要跳轉(zhuǎn)到用戶匯編代碼的起始位置,需要在Flash中正確定位跳轉(zhuǎn)指令。能到達這個目的的最

25、簡單的方法是使用匯編代碼。在下面的例子中創(chuàng)立了一個名為Codestart的已命名初始化段這個段包含了一個長跳轉(zhuǎn)可以跳轉(zhuǎn)到C環(huán)境初始化程序。需要用用戶連接命令文件把codestart段放置在存儲器中。*CodeStartBranch.asm.ref_c_int00.sect codestartLB_c_int00 ;branch to start of code.end ; end of file CodeStartBranch.asm用戶須在用戶連接命令文件MEMORY局部的PAGE 0上定義一個名為BEGIN_Flash的存儲器塊。Codestart段將被連接到這個存儲器塊。下面的例子針對當

26、前TMS320F28xx器件.對于其他的器件,參考相應(yīng)的數(shù)據(jù)手冊以確認Flash目標地址的引導。MEMORYPAGE 0:/*Progrm Memory*/BEGIN_Flash: origin=0 x3F7FF6, length=0 x000002PAGE 1:/*Data Memory*/ SECTIONS/*Jump to Flash boot mode entry point*/codestart:BEGIN_Flash, PAGE=05 C環(huán)境引導時禁止看門狗計時C編譯器運行時支持庫中的C環(huán)境初始化函數(shù)是_c_int00, 它完成全局和靜態(tài)變量的初始化。包括為每個初始化全局變量把數(shù)據(jù)

27、從.cinit段位于片上Flash存儲器拷貝到.ebss段位于RAM。例如,當一個全局變量在源代碼中聲明為:int x=5;5被放置在初始化段.cinit,而符號x被放置在.ebss段。然后,_c_int00程序在運行時把5拷貝到x的位置。當軟件中有初始化全局和靜態(tài)變量的大量數(shù)值時。在C環(huán)境引導程序完成并且調(diào)用main這里看門狗可以被配置或被禁止函數(shù)之前看門狗定時器會超時。在代碼開發(fā)的過程中,這個問題可能不會在RAM中顯現(xiàn)出來,因為從cinit段拷貝的數(shù)據(jù)被連接到RAM后會非??焖俚剡\行。然而,當cinit段連接到內(nèi)部Flash時??截惷總€數(shù)據(jù)將會消耗大量的周期。 因為內(nèi)部Flash存儲器缺省

28、為最大等待狀態(tài)等待狀態(tài)僅在用戶代碼運行到main后才會被配置。另外。代碼從Flash中實現(xiàn)數(shù)據(jù)拷貝.這又會增加完成數(shù)據(jù)拷貝需要 的時間代碼取指和數(shù)據(jù)讀肯定會訪問Flasho看門狗超時周期缺省到盡可能的最小值.結(jié)合這么一個事實,看門狗超時變成真實的可能性。有一個簡單的方法使用CCS來檢測看門狗超時,步驟如下:為已經(jīng)寫入Flash的代碼裝載符號單擊File fLoad Symbols fLoad Symbols Only2復(fù)位DSP單擊DebugfReset CPU。3重新開始DSP單擊DebugfRestart。如果bootloader被設(shè)置為Jump to Flash.那么無需進行這一步。(4)運行到main()(單擊

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論