- Bootloader
TI的DSP芯片在出厂时,在片内ROM中固化有引导装载程序(BootLoader),其主要功能就是讲外部的程序装载到片内RAM中运行,以提高系统的运行速度。
- 模式介绍
VC5509A具有Parallel EMIF BOOT mode、EHPI Boot mode、Standard serial boot mode、SPI EEPROM boot mode、IIC EEPROM boot mode、USB boot mode等多种方式自举加载。
- boot模式选择
Boot引导模式选择是通过引脚BOOTM[0:3]配置
BOOTM[0:3] |
BOOT资源 |
|||
IO.0 |
IO.1 |
IO.2 |
IO.3 |
|
0 |
0 |
0 |
0 |
系统保留 |
0 |
0 |
0 |
1 |
串行24位地址EEPROM引导方式、使用MCBSP0 |
0 |
0 |
1 |
0 |
USB引导方式 |
0 |
0 |
1 |
1 |
IIC EEPROM引导模式 |
0 |
1 |
0 |
0 |
系统保留 |
0 |
1 |
0 |
1 |
EHPI(multiplexed mode) BOOT 多路复用 |
0 |
1 |
1 |
0 |
EHPI (non-multiplexed mode)BOOT |
0 |
1 |
1 |
1 |
系统保留 |
1 |
0 |
0 |
0 |
从外部16位异步存储器中引导 |
1 |
0 |
0 |
1 |
串行16位地址EEPROM引导方式,使用MCBSP0 |
1 |
0 |
1 |
0 |
并行EMIF模式引导(8位异步存储器) |
1 |
0 |
1 |
1 |
并行EMIF模式引导(16位异步存储器) |
1 |
1 |
0 |
0 |
系统保留 |
1 |
1 |
0 |
1 |
系统保留 |
1 |
1 |
1 |
0 |
标准串口模式(16位),使用McBSP0 |
1 |
1 |
1 |
1 |
标准串口模式(8位),使用McBSP0 |
- 引导表
BootLoader在引导程序时,程序代码是以引导表格形式加载的,TMS320VC55X的引导表结构中包括了用户程序的代码段和数据段以及相应段在内存中的指定存储位置。此外还包括程序入口地址、部分寄存器的配置值、可编程延时时间等信息,引导表结构如下:
32位程序入口地址 |
|||
32位寄存器配置计数器n |
|||
16位寄存器地址 |
16寄存器内容 |
||
...(REGISTER n addr) |
...(register n contents) |
||
16位延时指示器 |
16位延时计数器 |
||
32位段字节计数器 |
|||
32位段起始位 |
|||
数据(字节) |
数据(字节) |
数据(字节) |
数据(字节) |
数据(字节) |
数据(字节) |
数据(字节) |
数据(字节) |
...(section n) |
|||
32位全0数据(BOOT表结束位) |
其中,程序入口地址是引导表加载结束后,用户程序开始执行的地址;寄存器配置数目决定了后面有多少个寄存器需要配置:只有当延时标志为FFFFh时,延时才被执行;延时长度决定了在寄存器配置后延时多少个CPU周期才进行下一个动作:段长度、段起始地址和数据则为用户程序中定义的各个段的内容;最后以00000000h作为引导表的结束标志
- 执行流程
而该流程中的reset,initboot,call selectbootmode, read i/o state, call boot loader这些步骤都是固化在芯片内的程序自己执行的,也就是说这些代码在出厂的时候已经在TI的芯片内。在28335中是一段的8k*16的read-only的memory,地址位于0x3fe000-0x3fffff,见下图:
根据上面的流程图和rom分布图,详细的解释一下流程:
1、在3f ffc0到3f ffff其实是放了中断向量表的地方:系统一开机当然是处于reset中断,因此直接跳至reset的地方执行(0x3f ffc0)。而这个地方的两个字节只是放了一条指令,就是跳至initboot函数,也就是3f f34c的地址执行boot load。
- 在3f f34c的bootloader操作中会去检测外部GPIO口的状态,从而判断是哪种方式的启动
3、 然后根据相依的启动方式跳至相应的入口地址:比如FLASH启动就是0x33fff6, 内部SARAM启动就是0x0.
- 而这里的入口地址就是cmd文件中定义的begin段。因此对于flash启动和ram启动,begin的定义是不同的,在flash启动时begin就是 0x33fff6 ,而ram启动begin就是0x0. 这个2个字的区间也就是放了我们程序最初执行的第一条指令(通常是code_start).因为CSM_PWL的存放位置是在0x33fff8,因此只有2个words空间来存放跳转指令。而一条长跳转指令LB刚好占两个字节(这摆明着是ti精心设计的)