[经验] 【感恩TI】学习TI的28335启动过程以及代码搬运

elvike   2015-11-26 22:15 楼主

       学习版主的一个精华帖,学习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,不同芯片大小不一样,比如28124Kx16,而283358Kx16


对的,就是它,这里看得还不够清楚,用两个指头滑动放大一些看看里面是什么东西。

 


这下看到了吧,里面有一些我英文不好,但是我看懂了两个: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.
;//===========================================================================
 

提示词:如果您需要查看本帖隐藏内容,请登录或者注册
作为一个水军,就是尽量的多回帖,因为懂的技术少,所以回帖水分大,见谅! EEWORLD开发板置换群:309018200,——电工们免费装β的天堂,商家勿入!加群暗号:喵

回复评论 (11)

水军来冲
真牛逼
So TM what......?
点赞  2015-11-26 22:21
LZ的帖子写的很好!建议给楼主加个精!
加一点细节。ramfunc和flashfunc的区别在于实际速度不同。 CI%2N@XZ%O64IMPXB8R)GI5.png
该段来自于TI的spra958文档。大概就是说150M的时钟频率下。放在ram里的程序可以跑到150M的速度。但是在flash里的速度就要打个六折了。有一些实时性要求高的反馈或者要求速度快的蛋疼的计算就得预先搬运到ram里面跑了。
而RAM的大小有限。这边是速度与空间之前的取舍了。
点赞  2015-11-27 00:01
这就是本活动我想产生的帖子
点赞  2015-11-27 08:04
有学习、有借鉴、有总结、有经验,赞一个。
加油!在电子行业默默贡献自己的力量!:)
点赞  2015-11-27 09:27
引用: ljj3166 发表于 2015-11-26 22:21
水军来冲
真牛逼

欢迎水军来水
作为一个水军,就是尽量的多回帖,因为懂的技术少,所以回帖水分大,见谅! EEWORLD开发板置换群:309018200,——电工们免费装β的天堂,商家勿入!加群暗号:喵
点赞  2015-11-27 09:47
引用: a828378 发表于 2015-11-27 00:01
LZ的帖子写的很好!建议给楼主加个精!
加一点细节。ramfunc和flashfunc的区别在于实际速度不同。
该段来 ...

谢谢补充内容,没关注两者速度到底差多少
作为一个水军,就是尽量的多回帖,因为懂的技术少,所以回帖水分大,见谅! EEWORLD开发板置换群:309018200,——电工们免费装β的天堂,商家勿入!加群暗号:喵
点赞  2015-11-27 09:49
引用: maylove 发表于 2015-11-27 08:04
这就是本活动我想产生的帖子

作为一个水军,就是尽量的多回帖,因为懂的技术少,所以回帖水分大,见谅! EEWORLD开发板置换群:309018200,——电工们免费装β的天堂,商家勿入!加群暗号:喵
点赞  2015-11-27 09:49
引用: soso 发表于 2015-11-27 09:27
有学习、有借鉴、有总结、有经验,赞一个。

谢谢soso姐的赞
作为一个水军,就是尽量的多回帖,因为懂的技术少,所以回帖水分大,见谅! EEWORLD开发板置换群:309018200,——电工们免费装β的天堂,商家勿入!加群暗号:喵
点赞  2015-11-27 09:50
MARK,学习!
点赞  2016-1-22 21:02
感恩TI,感恩楼主的总结
点赞  2017-2-6 09:31
总结的很好,学习了!
点赞  2018-6-29 15:35
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复