当前位置:网站首页>TIC2000系列处理器在线升级

TIC2000系列处理器在线升级

2022-08-09 11:16:00 量子力学和生命科学

_c_int00是CPU退出boot ROM 引导代码结束后,通过code_start段的跳转函数引用的库中的一个函数,这个函数是main函数的引用者,也是定义者。其位于rts2800_fpu32.lib中,要实现SBL,APP,kernel之间的顺利跳转,需要修改_c_int00函数里面的内容。

rts2800_fpu32.lib库在C:\ti\ccs1011\ccs\tools\compiler\ti-cgt-c2000_20.2.1.LTS\lib中,

而该库对应的所有源文件在C:\ti\ccs1011\ccs\tools\compiler\ti-cgt-c2000_20.2.1.LTS\lib\src

中,从中可以找到_c_int00所在的位置为:boot28.asm.

我们要修改这个boot28.asm.中的内容。

要完成在线升级需要准备以下几种程序:

1、引导ROM中的引导代码(BootROMCode,BRC)

2、开发人员自己编写的二次引导程序(SecondBootloader,SBL)

3、通信内核及FLASH操作程序(Communication Kernel and FlashAPI,CKFA)

4、主控程序(APP)

5、控制程序升级上位机(TI can flash update PC interface,TI_CFU_PC)

其中1是C2000DSP的ROM中固化好的代码,2、3、4是开发者编写的运行于DSP中的三套代码,5是完成升级要用的上位机程序。

程序2,也叫二次boootloader,通过仿真器或者其他工具在出厂前就烧写好,再也不动他,就类似于boot ROM中的代码。后面无论是开发人员开发应用程序,还是产品在用户哪里升级,都跟仿真器无关了,只用上位机和通信接口,不用拆机。

上面的几个程序之间的跳转的大前提:每个程序都有一个入口地址,准备好C语言的运行环境,CPU的程序计数器PC,被装入那个入口地址,CPU就运行那套程序。

升级过程如图1所示:

图1  C2000DSP在线升级过程框图

在升级在嵌入式开发中属于工具链开发,需要具备大概以下几点基本技能:

1、能使用CAN总线或者串口通信

2、会利用FLSAH API对片上FLASH进行读写操作

3、会点C++,能做上位机界面开发和与下位机的通信程序编写

4、关于TIdsp的使用,TI资源的利用能力在此不赘述,默认应该熟练

下面对每个程序做一定解释和记录。

引导ROM中的引导代码(BootROMCode,BRC)

        DSP上电这个动作被cpu检测到之后,会触发一个中断,叫做复位中断,DSP的程序计数器PC被装入复位向量,即0x3FFFC0,这个地址就是boot ROM引导代码的入口地址,CPU执行这部分代码。boot ROM引导代码检查两个IO口,根据IO口的电平情况决定退出boot ROM代码的时候程序计数器PC装载那个地址。由于硬件设计时,我们已经固定了bootmode select mode,即两个IO口都是1,所以任何时候,boot ROM退出的时候,都有PC =0x80000,即程序开始运行地址0x80000中的内容,进而完成dsp自带的boot 引导。

图2  boot ROM引导代码执行流程

如果不是在线升级的情况,一直用仿真器下载程序,那么这个0x80000开始的地方装载的就是我们的主控程序APP。

但是,我们要搞在线升级,所以就要在0x80000开始的地方写一个二次bootloader程序,SBL。

开发人员自己编写的二次引导程序(SecondBootloader,SBL)

在0x80000开始的一段片上flash区域内,一般是FLASH sector A,编写SBL程序。

在这段程序里面,要使用CAN总线外设与上位机通信,传输APP的bin文件,跳转到app运行等功能。

SBL程序在下载的时候,要指定只擦除sector A,其他区域不能擦除,因为其他区域有可能装载有别的代码。

SBL的CMD文件不用怎么改,主要关注下面这两个地方:

BEGIN               : origin = 0x080000, length = 0x000002

codestart        : > BEGIN                PAGE = 0, ALIGN(4)

SBL 如果检测到有主程序,就跳入主程序运行,如果没检测到,就与上位机通信,下载CKFA,由CKFA完成新的APP的下载,然后CKFA跳入主程序,或者直接重新上电。

从SBL向主程序跳转需要特别注意:

#define  APP_Entry_Point    0x84000   //app程序存放在sector C

Uint32 SBLmian()

{

        ..................

return  APP_Entry_Point;

}

采用上面这种跳转方式,由调用SBLmian函数的一段用汇编编写的代码来完成跳转,过程有点底层,已在其他文档分享中记录。

SBL里面有两个汇编源文件比较关键:

boot28.asm, 这个负责从boot ROM代码 到SBL代码的跳转(_c_int00引用SBLmain()),以及SBL向APP的跳转(SBLmain()带地址返回,以及引用_exit()给PC装载入口地址)。当然这个汇编源文件里面的少量内容是需要修改的。

boot ROM代码退出时运行boot28.asm中的_c_int00:段,这段中要改这个地方:

*  CALL USER'S PROGRAM                                                     *
****************************************************************************
;    LCR     __args_BLmain            ; execute main()
    LCR _BLmain
    LCR      _exit

如何才能跳转到SBLmain运行?  返回时,带着地址APP_Entry_Point   ,跳转到_exit运行,在_exit中完成跳转到app中运行。

上面是有主程序的情况,在没检测到APP的时候,SBL就要与上位机通信下载CKFA。那么CKFA下载后,要运行CKFA,通过CKFA 下载新的APP。

此时就有如何从SBL跳转到CKFA的问题。

SBL下载完CKFA 后,会调用一个函数Jump2CKFA(),这个函数在一个汇编源文件里面,形式跟boot28.asm很相似,其实是根据boot28.asm稍作修改而得,命名为SBLtoCKFA.asm,这个汇编文件里面有函数Jump2CKFA(),

该函数中有下面两句话:

LCR     _CKFAEntryaddr
LCR      _exit2CKFA

上面第一句话,调用一个函数CKFAEntryaddr,该函数什么都不干,只是返回CKFA的入口地址,入口地址存放于ACC寄存器,由下面的函数exit2CKFA处理,最后给了PC指针,即完成SBL 向CKFA的跳转。


   

图3  二次bootloader程序流程 

上图不是标准的流程图,只是程序的运行流程,侧重突出各个程序之间的跳转过程,因为这个跳转过程在在线升级开发过程,在理解上属于一个难点。

3、通信内核及FLASH操作程序(CommunicationKernel and FlashAPI,CKFA)

CKFA是一段运行于RAM中的程序,完成下载APP的任务后就没用了,可以重新上电。也可以不重新上电,直接从CKFA跳转到APP。

有两个地方会下载CKFA,一个是SBL没有检测到APP存在的时候,另一个是APP收到升级指令的时候。APP的下载只会通过CKFA来实现。

CKFA完成APP更新后,要么断掉电让他丢失,要么CKFA跳转到app。

原网站

版权声明
本文为[量子力学和生命科学]所创,转载请带上原文链接,感谢
https://blog.csdn.net/blueoce/article/details/120561932