学习版主的一个精华帖,学习c2000的启动过程和搬运代码过程。[原创文章] 【TI C2000的使用经验】CMD文件解读&从flash里搬运RAM函数
https://bbs.eeworld.com.cn/thread-459167-1-5.html
下面我也说说我自己理解的启动过程和代码搬运过程吧,求勿喷!!!
用到TI的c2000,cmd文件是避不开的一个槛,TI这样干个人感觉有点奇葩,或者说让程序员去参与存储的分配有点奇葩,也或许是我没能理解其真正的意图所在吧。既然是绕不开的行业器件,又是绕不开的技术话题,只能硬着头皮慢慢啃吧。 片子上给用户存储程序和数据的主要是saram和flash,代码既可以在saram里运行,也可以在flash里运行,但是saram高速但容量小,flash刚好相反。c2000主要应用在电机控制和数字电源领域,实时性要求很高,那么怎么办?首先c2000系列产品自带的ram都偏小,通过器件选型不能根本解决问题。外扩ram,是个不错的选择,如果工程足够大,实时性要求足够高,这个是唯一选择。但是针对一般应用,可以考虑代码存储在flash,然后将有实时性要求的代码拷贝到ram进行执行,而实时性要求低的,还可以留在flash里面运行。
怎么搬呢?搬运工程是在片子复位之后的初始化过程,所以我们先从片子上电复位之后的过程开始说起。
芯片上电复位之后,从BOOT ROM开始执行(别问我为什么从这里开始),BOOT ROM是一个片内ROM,不同芯片大小不一样,比如2812是4Kx16,而28335是8Kx16。
对的,就是它,这里看得还不够清楚,用两个指头滑动放大一些看看里面是什么东西。
这下看到了吧,里面有一些我英文不好,但是我看懂了两个:Reset vector(CPU vector table),还有Boot loader functions。查牛津字典第一个是复位矢量,第二个是Boot loader functions。看看Reset vector怎么起作用的。
上面第一个小红框里面说了VMAP=1的时候复位之后从这里开始,下来的那个框的意思是复位的时候VMAP=1,所以复位之后从boot rom开始就可以解释了。接着看。
下面下横红线的那句话,意思是这个复位矢量被编程成指向InitBoot函数。InitBoot的执行是几个GPIO(这个文档说的是2833x,不同的器件在这个GPIO开始有所不同)检测不同的引导模式,有下面这几种
讲得好像有点啰嗦了,上个流程图
到这里出现分支,call boot loader,如果是NO就是从IO的状态检测到入口地址,不需要调用boot loader。那么boot loader是什么?
英文不好,你们自己看吧。在外面这个帖子里,是要选择flash启动的,所以不需要boot loader。
上面是一个flash启动的流程,
这里说明了ADC_cal的作用,偷偷把一些adc的寄存器给校定了。
(以上更详细的介绍可以参照TI的c2000各个型号的boot rom文件,我这一个参照的2833x的)
接下来退出InitBoot,然后跳到了地址0x33 FFF6,这是哪里?赶紧看memory map去
就是这里,跳到了flash的接近末尾2个字节的地方。这里面是什么鬼,这个地方要去cmd里面看看了
在用于flash启动的cmd文件里面(F28335.CMD)看到这个地方,在page0中圈出来一块叫做BEGIN,然后有一个程序包叫codestart指定存放在这个BEGIN里面。好了,现在要去找codestart了。打开DSP2833x_CodeStartBranch.asm(好虚啊,不会汇编)
***********************************************************************
WD_DISABLE .set 1 ;set to 1 to disable WD, else set to 0
.ref _c_int00
.global code_start
***********************************************************************
* Function: codestart section
*
* Description: Branch to code starting point
***********************************************************************
.sect "codestart"
code_start:
.if WD_DISABLE == 1
LB wd_disable ;Branch to watchdog disable code
.else
LB _c_int00 ;Branch to start of boot.asm in RTS library
.endif
;end codestart section
***********************************************************************
* Function: wd_disable
*
* Description: Disables the watchdog timer
***********************************************************************
.if WD_DISABLE == 1
.text
wd_disable:
SETC OBJMODE ;Set OBJMODE for 28x object code
EALLOW ;Enable EALLOW protected register access
MOVZ DP, #7029h>>6 ;Set data page for WDCR register
MOV @7029h, #0068h ;Set WDDIS bit in WDCR to disable WD
EDIS ;Disable EALLOW protected register access
LB _c_int00 ;Branch to start of boot.asm in RTS library
.endif
;end wd_disable
.end
;//===========================================================================
;// End of file.
;//===========================================================================
引用: a828378 发表于 2015-11-27 00:01
LZ的帖子写的很好!建议给楼主加个精!
加一点细节。ramfunc和flashfunc的区别在于实际速度不同。
该段来 ...