<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>
關(guān) 閉

新聞中心

EEPW首頁(yè) > 工控自動(dòng)化 > 設計應用 > TMS320F28xx DSP中內部Flash的應用研究

TMS320F28xx DSP中內部Flash的應用研究

作者: 時(shí)間:2007-02-02 來(lái)源:網(wǎng)絡(luò ) 收藏
1 前言

F28xx DSP片內有128 K16 bit字的、兩塊4 K x16bit字的單周期訪(fǎng)問(wèn)RAM(SARAM)LO和L1、一塊8 Kxl6 bit字的單周期訪(fǎng)問(wèn)RAM(SARAM)HO、兩塊1 Kxl6 bit字的單周期訪(fǎng)問(wèn)RAM(SARAM)M0和M1。由于存儲器種類(lèi)多、容量大,所以從系統的高度來(lái)配置各個(gè)存儲器必須有合適的方法,而這些方法一般都與片內有關(guān)。另外,F28xx DSP片內有看門(mén)狗定時(shí)器模塊(WDT)、引導ROM(ROM bootloader)模塊、代碼安全模塊(CSM),要合理地使用這些模塊為整個(gè)系統服務(wù),必定也要用到。

由此可以看出,Flash的地位和作用比較顯著(zhù).所以本文就Flash的幾種用法作了研究。

2 從Flash拷貝段到RAM

2.1拷貝中斷向量

F28xx器件中,外設擴展中斷(PIE)模塊管理中斷請求。上電時(shí),所有中斷向量必須位于非易失性存儲器(如Flash)中,但是要把中斷向量拷貝到PIEVECT RAM中,這是用戶(hù)代碼中器件初始化程序的一部分。PIEVECT RAM是一個(gè)特定的RAM塊,它在當前TMS320F28xx器件中是一個(gè)25616的塊.在數據空間中的起始地址為Ox000D00。

把中斷向量連接到Flash,然后在運行時(shí)把中斷向量拷貝到PIEVECT RAM中,有許多方法可以實(shí)現。一個(gè)方法是創(chuàng )建包含函數指針的常量C結構體,該結構體包括128個(gè)32-bit向量。如果使用DSP281x或者DSP280x外設的結構體.這個(gè)結構體叫做PieVectTableInit,它已經(jīng)在DSP281x_PieVect.c或者DSP280x_PieVect.c創(chuàng )建(參看TI提供的例程)。因為這個(gè)結構體使用const類(lèi)型關(guān)鍵詞,所以它將會(huì )被編譯器放置在.econst段中。運行時(shí)只需要把這個(gè)結構體拷貝到PIEVECT RAM中。C編譯器運行時(shí)支持庫包含名為memcpy的存儲器拷貝函數,該函數可以被用來(lái)完成拷貝任務(wù),其用法如下所示:

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

memcpy(PieVectTable,PieVectTableInit,256);

注意拷貝長(cháng)度是256個(gè)16-bit字.對應為128個(gè)32-bit字。

2.2初始化Flash控制寄存器

Flash控制寄存器FOPT、FPWR、:FSTDBY-WAIT、FACTIVEWAIT、FBANKWAIT、FOTPWAIT的初始化代碼不能從Flash存儲器當中運行.否則就會(huì )有不可預料的結果出現。所以,Flash控制寄存器的初始化函數在運行時(shí)必須從Flash(它的裝載地址)拷貝到RAM(它的運行地址)。

Flash控制寄存器由Code Security Module(CSM)保護。如果CSM被保護起來(lái)了,那么必須從被保護的RAM(例如:L0或者L1 SARAM)運行Flash控制寄存器的初始化代碼,否則Flash控制寄存器的初始化代碼無(wú)法訪(fǎng)問(wèn)Flash控制寄存器。要注意的是,當器件復位的時(shí)候CSM一般都是被保護起來(lái)的,雖然使用假密碼0xFFFF時(shí)ROM BOOTLOAD-ER會(huì )把它解鎖。

C編譯器的CODE_SECTION指令可以用來(lái)為Flash控制寄存器的初始化函數創(chuàng )建獨立的可連接段。例如:假定Flash控制寄存器的配置在C函數InitFlash()中實(shí)現,并且想把這個(gè)函數放置在名為secureRamFuncs的可連接段當中。下列的C代碼例程顯示了CODE_SECTION命令在Flash存儲器配置中的正確用法:

secureRamFuncs段可以使用用戶(hù)連接命令文件(.cmd)進(jìn)行連接。這個(gè)段需要獨立的裝載和運行地址。另外,還想讓連接器生成一些全局符號,這些全局符號可以用來(lái)決定裝載地址、運行地址、段長(cháng)度。在實(shí)現把這個(gè)段從裝載地址拷貝到它的運行地址時(shí)需要這些信息。用戶(hù)連接命令文件如下所示:


在這個(gè)例子中,假定存儲器Flash和SECURE_RAM都已經(jīng)在用戶(hù)連接命令文件中的MEMORY段中定義。這些存儲器的PAGE標識符要與它們的存儲器定義相匹配。在上面的例程中假定兩個(gè)存儲空間都已經(jīng)在PAGE 0(程序存儲空間)中聲明過(guò)了。RUN_START、LOAD_START、LOAD_END指令將生成全局符號,這些全局符號有特定的名稱(chēng),對應著(zhù)相應的地址。最后,這個(gè)段必須在運行時(shí)從Flash拷貝到RAM,可以用到編譯器運行支持庫里面的函數memcpy()。


2.3性能最優(yōu)化

常數是那些用C語(yǔ)言的const類(lèi)型關(guān)鍵詞聲明的數據結構。編譯器把所有的常數放置在.econst段中(假定為大存儲模式)。當前TMS320F28xx器件上的特殊管道(special pipelining)提高Flash上運行代碼的性能時(shí).每次訪(fǎng)問(wèn)位于片上Flash中的數據常數會(huì )占用許多周期。特別是在150 MHz TMS320F281x DSP上Flash等待狀態(tài)要達到5個(gè)周期.100 MHz TMS320F280x DSP達到3個(gè)周期。所以,訪(fǎng)問(wèn)片上RAM中的常數與常數表則成為沉重的負擔。然而,分立式嵌入式系統要求所有的初始化數據(如常數)最初都是位于非易失性存儲器中,所以,必須為想訪(fǎng)問(wèn)的RAM中的常數建立獨立的裝載和運行地址.在運行時(shí)把這些常數從片上Flash中拷貝到RAM中。這里介紹兩種不同的實(shí)現方法。

方法一:在RAM中運行所有的常數陣列。

這種方法是為整個(gè).econst段指定獨立的裝載和運行地址。其好處是容易使用,而壞處是RAM的使用量非常大(可能只有少量常數需要快速訪(fǎng)問(wèn),但是用這種方法所有的常數都位于RAM)。

在用戶(hù)連接命令文件中簡(jiǎn)單地為整個(gè).econst段指定獨立的裝載和運行地址,然后在運行時(shí)通過(guò)拷貝整個(gè).econst段的方式往工程中添加代碼。例如:


方法二:在RAM中運行特定的常數陣列。

這種方法是在運行時(shí)有選擇性地從Flash拷貝常數到RAM。與方法一相似,這個(gè)流程能夠完成預期功能,不同點(diǎn)是只有在命名段中被選擇了的常數才會(huì )被拷貝到RAM中(而不是把所有的常數都拷貝到RAM中)。

假定想創(chuàng )建在RAM中運行的5個(gè)字的常數陣列,并命名為table[]。DATA_SECTION指令用來(lái)把table[]放置在名為ramconsts的用戶(hù)自定義段中。相應的C源程序如下所示:

使用用戶(hù)連接命令文件連接ramconsts段,裝載到Flash而從RAM中運行,生成全局符號來(lái)幫助存儲器拷貝。用戶(hù)連接命令文件如下所示:

最后,在運行時(shí)必須把table[]從裝載地址拷貝到運行地址:


3 CSM密碼的編程


TMS320F28xx器件上的代碼安全模塊CSM提供了保護,防止非法的程序拷貝。在當前的TMS320F28xx器件中,整個(gè)Flash、OTP存儲器,LO和L1都被CSM保護(Flash配置寄存器同樣被保護)。當器件被保護的時(shí)候,只有從被保護的存儲空間運行的代碼可以訪(fǎng)問(wèn)(讀或寫(xiě))其他被保護存儲空間中的數據。從非保護的存儲空間運行的代碼不可以訪(fǎng)問(wèn)被保護存儲空間中的數據。

CSM使用128-bit密碼組成8個(gè)單獨的16-bit字。在當前的TMS320F28xx器件上,這些密碼被存儲在Flash的最高8個(gè)字中(如地址:Ox3F7FF8-Ox3F7FFF)。在開(kāi)發(fā)過(guò)程中,建議在密碼位置放入假密碼0xFFFF。使用假密碼時(shí),對CSM解保護只需假讀密碼位置。把假密碼放在密碼位置是很容易的.因為在Flash編程過(guò)程中.Flash被清除后這些位置的狀態(tài)將會(huì )是0xFFFF。用戶(hù)只需要在自己的代碼工程中避免連接任何段到密碼地址,密碼將保持為OxFFFF。

在開(kāi)發(fā)完成以后.可能想把真正的密碼放在密碼位置中。另外,為了正確地保護CSM模塊,當前TMS320F28xx器件上的CSM模塊需要編寫(xiě)值Ox0000到Flash的地址0x3F7F80-Ox3F7FF5。完成這兩個(gè)任務(wù)的最簡(jiǎn)單的方法是用少量匯編語(yǔ)言進(jìn)行編程。下面是一個(gè)匯編代碼例子,這個(gè)例子指定了想要的密碼值,并且把它們放在一個(gè)名為pass-words的初始化段中。另外創(chuàng )建了一個(gè)名為csm_rsvd的初始化段,這個(gè)段的值全部是0x0000.并且這個(gè)段有適當的長(cháng)度以適合地址Ox3F7F80-0x3F7FF5。注意,這個(gè)例子顯示的是假密碼值0xFFFF.用戶(hù)可以用自己的密碼代替這些假密碼。


在這里必須警告用戶(hù):不要把8個(gè)密碼的值全部設為Ox0000,這樣做會(huì )永久地鎖定CSM模塊!passwords和CSB_rsvd段要由用戶(hù)連接命令文件放置在存儲器中。下面的例子適用于當前TMS320F28xx器件(對于其他器件,請參考器件數據手冊以確定密碼和CSM保留位置的地址)。


4 在DSP復位以后從Flash運行代碼


TMS320F28xx具有引導ROM(ROM bootloader),器件復位以后ROM bootloader能把代碼運行轉到Flash中。當引導模式選擇引腳被配置為"跳轉到Flash"時(shí).ROM bootloader將跳轉到Flash中位于地址Ox3F7FF6處的指令。用戶(hù)需要在這個(gè)地址上安排一條指令,這條指令跳轉到用戶(hù)代碼。由于CSM密碼從地址Ox3F7FF8開(kāi)始,所以剛好有2個(gè)字可用于存放這個(gè)跳轉指令。并非巧合的是,長(cháng)跳轉指令(在匯編代碼中為L(cháng)B)剛好占用2個(gè)字。

一般情況下,跳轉指令將會(huì )跳轉到C編譯器運行支持庫中C環(huán)境初始化程序的起始位置。這個(gè)程序的人口標號是_c_int00。在這個(gè)程序沒(méi)有運行的時(shí)候C代碼就不能運行。同樣地,有時(shí)候在開(kāi)始運行用戶(hù)的C應用程序之前需要執行少量的匯編代碼(例如:禁止看門(mén)狗時(shí)鐘外設)。這樣,跳轉指令需要跳轉到用戶(hù)匯編代碼的起始位置,需要在Flash中正確定位跳轉指令。能達到這個(gè)目的的最簡(jiǎn)單的方法是使用匯編代碼。在下面的例子中.創(chuàng )建了一個(gè)名為Codestart的已命名初始化段.這個(gè)段包含了一個(gè)長(cháng)跳轉.可以跳轉到C環(huán)境初始化程序。需要用用戶(hù)連接命令文件把codestart段放置在存儲器中。

用戶(hù)須在用戶(hù)連接命令文件MEMORY部分的PAGE 0上定義一個(gè)名為BEGIN_Flash的存儲器塊。Codestart段將被連接到這個(gè)存儲器塊。下面的例子針對當前TMS320F28xx器件.對于其他的器件,參考相應的數據手冊以確認Flash目標地址的引導。


5 C環(huán)境引導時(shí)禁止看門(mén)狗計時(shí)

C編譯器運行時(shí)支持庫中的C環(huán)境初始化函數是_c_int00,它完成全局和靜態(tài)變量的初始化。包括為每個(gè)初始化全局變量把數據從.cinit段(位于片上Flash存儲器)拷貝到.ebss段(位于RAM)。例如,當一個(gè)全局變量在源代碼中聲明為:

int x=5;

"5"被放置在初始化段.cinit,而符號"x"被放置在.ebss段。然后,_c_int00程序在運行時(shí)把"5"拷貝到"x"的位置。當軟件中有初始化全局和靜態(tài)變量的大量數值時(shí)。在C環(huán)境引導程序完成并且調用main()(這里看門(mén)狗可以被配置或被禁止)函數之前看門(mén)狗定時(shí)器會(huì )超時(shí)。在代碼開(kāi)發(fā)的過(guò)程中,這個(gè)問(wèn)題可能不會(huì )在RAM中顯現出來(lái),因為從.cinit段拷貝的數據被連接到RAM后會(huì )非??焖俚剡\行。然而,當.cinit段連接到內部Flash時(shí)??截惷總€(gè)數據將會(huì )耗費大量的周期。因為內部Flash存儲器缺省為最大等待狀態(tài)(等待狀態(tài)僅在用戶(hù)代碼運行到main()后才會(huì )被配置)。另外。代碼從Flash中實(shí)現數據拷貝.這又會(huì )增加完成數據拷貝需要的時(shí)間(代碼取指和數據讀肯定會(huì )訪(fǎng)問(wèn)Flash)??撮T(mén)狗超時(shí)周期缺省到盡可能的最小值.結合這么一個(gè)事實(shí),看門(mén)狗超時(shí)變成真實(shí)的可能性。有一個(gè)簡(jiǎn)單的方法使用CCS來(lái)檢測看門(mén)狗超時(shí),步驟如下:

(1)為已經(jīng)寫(xiě)入Flash的代碼裝載符號(單擊File→Load Symbols→Load Symbols Only)

(2)復位DSP(單擊Debug→Reset CPU)。

(3)重新開(kāi)始DSP(單擊Debug→Restart)。如果bootloader被設置為"Jump to Flash".那么無(wú)需進(jìn)行這一步。

(4)運行到main()(單擊Debug→Go_Main)。如果沒(méi)有到達main(),那么在C環(huán)境初始化程序完成之前看門(mén)狗很有可能已經(jīng)溢出。

解決看門(mén)狗超時(shí)問(wèn)題最簡(jiǎn)單的辦法就是在開(kāi)始C環(huán)境初始化程序之前禁止看門(mén)狗。在main()到達之后重新使能看門(mén)狗,并且開(kāi)始正常的代碼執行流程。通過(guò)將WDCR寄存器中的WDDIS位設置為1來(lái)禁止看門(mén)狗。必須使用匯編代碼(因為C環(huán)境還沒(méi)有建立)。在上文中,Codestart匯編代碼段實(shí)現了能跳轉到C環(huán)境初始化程序_c_int00的跳轉指令。為了禁止看門(mén)狗,這個(gè)跳轉要變?yōu)樘D到看門(mén)狗禁止代碼。此看門(mén)狗代碼然后又跳轉到_c_int00的程序。下面的代碼例子實(shí)現了這些功能:



6 結束語(yǔ)


文中列舉的Flash的這幾種用法,在CCS中編程下載到TMS320F28xx DSP開(kāi)發(fā)板上,并通過(guò)運行程序驗證了其正確性。Flash的這幾種用法可以作為系統開(kāi)發(fā)過(guò)程中的參考,有助于復雜系統開(kāi)發(fā)。



關(guān)鍵詞: Flash 320F TMS 320

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>