F28335上电复位后会首先进入复位中断的服务函数的地址。
BROM中断向量表地址是0x3FFFC0-0x3FFFFF,其中0x3FFFC0处保存的就是复位中断跳转的程序地址。
Boot ROM(BROM) 是固化在DSP 只读Flash里的一段程序,其地址是0x3FE000-0x3FFFFF,BROM Vector就是其中的一部分,上面也可以看出BROM保存的内容,如Bootload、版本号、复位中断向量、错误中断向量、测试中断向量、Iqmath计算表、FPU计算表。复位后即PC指向复位中断向量里的地址。
0x3FFFC0处的ISR是跳转到InitBoot程序(保存在BROM中),该程序会首先检查GPIO84-87的引脚状态,然后根据其选择BOOT模式。
这里以常见的Flash启动和SRAM启动为例
当BOOT模式为Flash启动时,PC=0x33FFF6;当BOOT模式为SARAM启动时,PC=0x000000;
首先假设Boot模式是Flash启动时
由官方提供的CMD文件可知0x33FFF6-0x33FFF7保存的是我们BEGIN段程序
该BEGIN段只有2*16Bit 即只有2个字的代码,该代码就是codestart程序(上图)
可以看到codestart就一句条件跳转的代码,刚好占用两个字。没关看门狗就去关看门狗,关了看门狗就去执行_c_int00程序。
可以看到关完看门狗后,还是会跳转到_c_int00程序。
c_int00 是rts2800_ml.lib中的一个重要函数,TI c2000编译器默认会将rts2800_ml.lib加入编译。
c_int00主要干了以下事情
初始化了C语言的运行环境,并且跳转到main函数开始运行C程序。
再假设Boot模式是SRAM启动时,PC=0x000000
可以看到此时CMD文件BEGIN段被保存在了0x000000,,BEGIN里的codestrat还是一个占用2个字的条件跳转,之后运行c_int00。
这里多说一句,可以BOOTMODE固定选择从FLASH启动,但是通过更改CMD文件达到选择SRAM、FLASH运行程序。
假设BOOTMODE选择从FLASH启动,但是选择SRAM启动的CMD文件
0x33FF80+0x000076=0x33FFF6 Size:0x000002
0x33FFF6就是FLASH启动的地址,可以看到FLASH启动跳转代码没有被擦除,因此选择SRAM启动的CMD文件依旧可以从FLASH启动。但是反过就不行了,即CMD选flash,bootmode选SRAM,因为SRAM掉电丢失数据,即BEGIN段的codestart程序丢失了。