在TMS320F2812上实现从flash拷贝整个程序到RAM上运行的方法探讨.docx
- 文档编号:9322874
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:23
- 大小:64.73KB
在TMS320F2812上实现从flash拷贝整个程序到RAM上运行的方法探讨.docx
《在TMS320F2812上实现从flash拷贝整个程序到RAM上运行的方法探讨.docx》由会员分享,可在线阅读,更多相关《在TMS320F2812上实现从flash拷贝整个程序到RAM上运行的方法探讨.docx(23页珍藏版)》请在冰豆网上搜索。
在TMS320F2812上实现从flash拷贝整个程序到RAM上运行的方法探讨
在TMS320F2812上实现从flash拷贝整个程序到RAM上运行的方法探讨
1. 前言
TMS320F2812DSP 里,代码从内部flash里运行,比从内部RAM里运行要慢30%左右,所以对运行时间苛刻的程序直接在flash里运行,往往不能满足要求。
故而,需要将代码拷贝到RAM以提高运行速度。
TI文档只提供了部分代码从flash拷贝到RAM中的方法。
然而,在一些应用中,需要将整个代码段都拷贝到RAM中执行,以提高整体运行速度。
本文通过对TMS320F2812 的启动代码研究,来探讨如何在从FLASH启动后将整个代码段拷贝到RAM中,然后在RAM中运行的方法。
2. TMS320F2812 启动过程
TMS320F2812的内部存储器中,0x3F F000 ----0x3FFFC0是4K*16的BootROM。
图1 2812内部BootRom地址图
CPU向量表位于北部ROM的底端(0x3FFFC0----0x3FFFF)。
当VMAP=1,ENPIE=0 ,MPNMC=0时,该向量表被激活。
复位向量出厂时被编程指向函数InitBoot。
这个函数开始启动过程。
当然,启动过程完成之后,我们需要初始化PIE中断向量表,同时使能PIEblock。
初始化PIE中断向量表之后,除了复位,所有中断向量均从PIE获得。
TMS320F2812启动代码固化在该内部ROM中。
当TMS320F2812上电或者热复位后,首先由芯片本身将一些寄存器初始化:
PIEdisabled(ENPIE=0,VMAP=1,OBJMDE=0,AMODE=0,MOM1MAP=1),
然后dsp芯片会对XMPNMC管脚采样,根据采样值的高低,来决定启动模式是“微处理器模式”还是“微计算机模式”。
当XMPNMC=0时,为“微计算机模式”,此时,启动ROM存储器被使能而XINTFZone7被禁止。
复位向量从内部启动ROM获取,启动ROM在复位期间一直被使能。
启动ROM里的复位向量(位于0x3FFFC0)指向InitBoot函数(位于0x3FFC00)。
在完成器件初始化(InitBoot)之后,Bootloader将检查GPIO管脚的状态,然后再决定选用的启动模式。
启动模式有4种:
跳转到flash,跳转到H0SARAM,跳转到OTP或者调用片上启动程序。
InitBootFunction 所做工作有:
1.初始化状态寄存器;2.将堆栈指针设为0x400(0x400-0x44F作为启动过程中的堆栈);3.读CSM密码保护部分;4.调用SelectBootMode;5.调用ExitBoot
在完成选择启动模式过程之后,根据选择的启动模式,dsp会跳到相应的启动入口。
也可以自己选择启动入口。
这些入口地址都在这之前已经被dsp定义好的。
如果从flash启动,那么我们的管脚状态应该是
GPIOF4
GPIOF12
GPIOF3
GPIOF2
(SCITXDA)
(MDXA)
(SPISTEA)
(SPICLK)
内部上拉
无内部上拉
无内部上拉
无内部上拉
ModeSelected
1
x
x
x
JumptoFlashaddress0x3F 7FF6
下图为BootROM 函数的流程图
图2 BootROM 函数的流程图
对于内部flash启动,如图
图3跳转到Flash启动的流程图
在0x3F7FF6必须放置一个跳转指令,该指令跳转到你自己的启动代码或者应用程序。
3. 搬移思路
根据上节2的启动过程,flash启动过后,跳到0x3F7FF6,然后根据其内容再跳转到应用程序。
我们在这里稍微修改一下,就可以将PC指针跳到RAM首地址,程序就能在RAM里运行了。
将“搬移程序”烧在flash上,从flash启动之后,“搬移程序”会被执行。
“搬移程序”做的工作就是将“应用主程序”代码拷贝到内部RAM,然后经过初始化环境(InitBoot,ExitBoot),将PC指针指向RAM里代码首地址。
这样,你的程序就在RAM中运行起来了。
也就是说,我们需要一个“搬移程序”,启动时运行,用来拷贝flash上的代码到RAM中;当然,还需要一个你的“应用主程序”,该主程序被“搬移程序”从flash里“挪”到RAM后在RAM中运行。
我们还要做的工作就是,把“应用主程序”烧写到flash里的某一块,这个块又不会影响flash启动时运行“搬移程序”。
完成这个烧写过程的程序,我们称之为flash烧写程序。
总结一下,完成整个搬移过程,一共需要三个程序。
“搬移程序”和“应用主程序”被固化到flash里“烧写flash程序”将“应用主程序”烧入flash中指定的块中。
TI的烧写flash插件用来烧写“搬移程序”。
4. 搬移方法
1)首先你要用的主程序必须编译通过,并且通过仿真器在RAM里运行无问题。
将主程序的CMD文件进行改写,保证程序段(.text段)分配在连续的存储空间。
程序从flash启动,所有初始化段链接在非易失存储器里,而非初始化段必须链接在易失存储器。
我们可以把初始化段都放在一个连续的内部RAM空间,而非初始化段放在另一个内部RAM空间。
如果你的代码不是很大,也可以都放在连续的RAM空间。
但在实际项目中,通常你会遇到存储空间不够的问题。
这时就要考虑将无关紧要的段放在另外的非程序空间了。
.cinit
Flash
.cio
RAM
.const
Flash
.econst
Flash
.pinit
Flash
.switch
Flash
.text
Flash
.bss
RAM
.ebss
RAM
.stack
Lower64KwRAM
.sysmem
RAM
.esysmem
RAM
.reset
RAM1
例如:
viewplaincopytoclipboardprint?
1.MEMORY
2.
3.{
4.
5.PAGE 0 :
6.
7. RAMH0 :
origin = 0x3F8000, length = 0x002000
8.
9.
10.
11.PAGE 1 :
12.
13. /* SARAM */
14.
15. RAMM0M1 :
origin = 0x000000, length = 0x000800
16.
17. RAML0L1 :
origin = 0x008000, length = 0x002000
18.
19.}
20.
21.
22.
23.
24.
25.SECTIONS
26.
27.{
28.
29. /* Allocate program areas:
*/
30.
31. .reset :
> RAMH0 PAGE = 0
32.
33. vectors :
> RAMH0 PAGE = 0
34.
35. .cinit :
> RAMH0 PAGE = 0
36.
37. .text :
> RAMH0 PAGE = 0
38.
39. .const :
> RAMH0 PAGE = 0
40.
41. .econst :
> RAMH0 PAGE = 0
42.
43. .switch :
> RAMH0 PAGE = 0
44.
45.
46.
47. /* Allocate data areas:
*/
48.
49. .stack :
> RAMM0M1 PAGE = 1
50.
51. .bss :
> RAML0L1 PAGE = 1
52.
53. .ebss :
> RAML0L1 PAGE = 1
54.
55. .sysmem :
> RAML0L1 PAGE = 1
56.
57.}
从上面的CMD可知,主程序代码均放在RAMH0中,长度为0x2000。
2)其次,将该工程编译成功后,加载到内部ram,仿真器自动完成必要的初始化环境之后,pc指针应该指向_c_init00,记下现在PC指针的位置,在Boot.asm中会用到。
3)自制一个flash烧写程序,或者从网上下载其他网友的flash烧写程序,将目标地址放在除flashJ块以外的块中。
烧写的长度不能小于被烧写的主程序长度。
该烧写程序在RAM中运行。
其代码段不能和被烧写的主程序用的代码段存储区域相同,否则会破坏主程序在ram中的代码。
烧写之后,可以用CCS的Savedata功能,来查看flash中的数值是否和ram里主程序空间数值一致。
4) 用TI的烧写插件烧写“搬移程序”。
注意,该“搬移程序”要能在dsp启动后执行。
并且,烧写的时候,不能将上一步烧到flash上的主程序代码擦除。
“搬移程序”具体见下节。
5. “搬移程序”具体实现方法
Boot.asm文件内容:
viewplaincopytoclipboardprint?
1. .def _InitBoot
2.
3. .ref _EntryAddr_H
4.
5. .ref _EntryAddr_L
6.
7.
8.
9. .sect ".InitBoot"
10.
11.;
12.
13.; _InitBoot
14.
15.;
16.
17.; 1) Initalizes the stack pointer
18.
19.; 2) Sets the device for C28x operating mode
20.
21.; 3) Calls the main boot functions
22.
23.; 4) Calls an exit routine
24.
25.;
26.
27._InitBoot:
28.
29.; Initalize the stack pointer.
30.
31. MOV SP, #0 ; Initalize the stack pointer
32.
33.; Initalize the device for running in C28x mode.
34.
35. C28OBJ ; Select C28x object mode
36.
37. C28ADDR ; Select C27x/C28x addressing
38.
39. C28MAP ; Set blocks M0/M1 for C28x mode
40.
41. CLRC PAGE0 ; Always use stack addressing mode
42.
43. MOVW DP,#0 ; Initialize DP to point to the low 64 K
44.
45. CLRC OVM
46.
47.; Set PM shift of 0
48.
49. SPM 0
50.
51.; Read the password locations – this will unlock the
52.
53.; CSM only if the passwords are erased. Otherwise it
54.
55.; will not have an effect.
56.
57. MOVL XAR1,#0x3F7FF8;
58.
59. MOVL XAR0,*XAR1++
60.
61. MOVL XAR0,*XAR1++
62.
63. MOVL XAR0,*XAR1++
64.
65. MOVL XAR0,*XAR1
66.
67.; Cleanup and exit. At this point the EntryAddr
68.
69.; is located in the ACC register
70.
71. BF _ExitBoot,UNC
72.
73.;
74.
75.; _ExitBoot
76.
77.;
78.
79.;
80.
81.;This module cleans up after the boot loader
82.
83.;
84.
85.; 1) Make sure the stack is deallocated.
86.
87.; SP = 0x400 after exiting the boot
88.
89.; loader
90.
91.; 2) Push 0 onto the stack so RPC will be
92.
93.; 0 after using LRETR to jump to the
94.
95.; entry point
96.
97.; 2) Load RPC with the entry point
98.
99.; 3) Clear all XARn registers
100.
101.; 4) Clear ACC, P and XT registers
102.
103.; 5) LRETR – this will also clear the RPC
104.
105.; register since 0 was on the stack
106.
107.;
108.
109._ExitBoot:
110.
111.;
112.
113.; Insure that the stack is deallocated
114.
115.;
116.
117. MOV SP,#0
118.
119.;
120.
121.; Clear the bottom of the stack. This will endup
122.
123.; in RPC when we are finished
124.
125.;
126.
127. MOV *SP++,#0
128.
129. MOV *SP++,#0
130.
131.
132.
133. NOP
134.
135. NOP
136.
137. NOP
138.
139. NOP
140.
141. NOP
142.
143. NOP
144.
145. NOP
146.
147. NOP
148.
149. NOP
150.
151.;
152.
153.; Load RPC with the entry point as determined
154.
155.; by the boot mode. This address will be returned
156.
157.; in the ACC register.
158.
159.;向堆栈中压入0x3f8000,该地址即为主程序在ram中运行的首地址。
160.
161. MOV *SP++, #0x8000
162.
163. MOV *SP++, #0x3F
164.
165.
166.
167. NOP
168.
169. NOP
170.
171. NOP
172.
173. NOP
174.
175. NOP
176.
177. NOP
178.
179. NOP
180.
181. NOP
182.
183. NOP
184.
185.
186.
187. POP RPC
188.
189.
190.
191. NOP
192.
193. NOP
194.
195. NOP
196.
197. NOP
198.
199. NOP
200.
201. NOP
202.
203. NOP
204.
205. NOP
206.
207. NOP
208.
209.;
210.
211.; Put registers back in their reset state.
212.
213.;
214.
215.; Clear all the XARn, ACC, XT, and P and DP
216.
217.; registers
218.
219.;
220.
221.; NOTE:
Leave the device in C28x operating mode
222.
223.; (OBJMODE = 1, AMODE = 0)
224.
225.;
226.
227. ZAPA
228.
229. MOVL XT,ACC
230.
231. MOVZ AR0,AL
232.
233. MOVZ AR1,AL
234.
235. MOVZ AR2,AL
236.
237. MOVZ AR3,AL
238.
239. MOVZ AR4,AL
240.
241. MOVZ AR5,AL
242.
243. MOVZ AR6,AL
244.
245. MOVZ AR7,AL
246.
247. MOVW DP, #0
248.
249.;
250.
251.; Restore ST0 and ST1. Note OBJMODE is
252.
253.; the only bit not restored to its reset state.
254.
255.; OBJMODE is left set for C28x object operating
256.
257.; mode.
258.
259.;
260.
261.; ST0 = 0x0000 ST1 = 0x0A0B
262.
263.; 15:
10 OVC = 0 15:
13 ARP = 0
264.
265.; 9:
7 PM = 0 12 XF = 0
266.
267.; 6 V = 0 11 M0M1MAP = 1
268.
269.; 5 N = 0 10 reserved
270.
271.; 4 Z = 0 9 OBJMODE = 1
272.
273.; 3 C = 0 8 AMODE = 0
274.
275.; 2 TC = 0 7 IDLESTAT = 0
276.
277.; 1 OVM = 0 6 EALLOW = 0
278.
279.; 0 SXM = 0 5 LOOP = 0
280.
281.; 4 SPA = 0
282.
283.; 3 VMAP = 1
284.
285.; 2 PAGE0 = 0
286.
287.; 1 DBGM = 1
288.
289.; 0 INTM = 1
290.
291.;
292.
293. MOV *SP++,#0
294.
295. MOV *SP++,#0x0A0B
296.
297.
298.
299. NOP
300.
301. NOP
302.
303. NOP
304.
305. NOP
306.
307. NOP
308.
309. NOP
310.
311. NOP
312.
313. NOP
314.
315. NOP
316.
317.
318.
319. POP ST1
320.
321. POP ST0
322.
323.
324.
325. NOP
326.
327. NOP
328.
329. NOP
330.
331. NOP
332
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- TMS320F2812 实现 flash 拷贝 整个 程序 RAM 运行 方法 探讨