1 C6455 的引导装载模式介绍
C6455 的引导装载模式由引导模式管脚BOOTMODE[3:0]决定。在DSP 复位时上述四个管脚的不同状态对应着不同的引导装载模式,具体如表1 所示。
对于主I2C 引导装载模式,DSP 作为I2C 总线上的主设备,在复位后引导装载程序会按照引导表的参数从外部I2C EEPROM 或者其它I2C 总线从设备读取数据到相应的目的地址完成引导过程。引导表指定了数据的目的地址和长度。
从I2C 引导装载与主I2C 引导装载类似,只是DSP 在复位后等待外部I2C 总线主设备按照引导表的参数将数据写入指定的地址。对于多DSP 的情况,可以用一个DSP 作为主设备,其它DSP 工作于从I2C 引导装载模式下。
本文使用主I2C 引导装载模式,构建的验证系统连接方式如图1 所示,使用的EEPROM 型号是Atmel 公司的AT24C1024B[3]。为了保证系统能够稳定的工作,SCL 和SDA 信号都需要接上拉电阻。
为了直观地验证引导装载的结果,我们使用一个简单的DSP 程序,通过C6455 的通用输入输出管脚GPIO2 不断输出高低交替的信号驱动一个发光二极管闪烁,相应的DSP 程序代码如下:
main()
{
initial(); // 初始化DSP
for(;;) GPIO2_toggle();//GPIO2 高低变化
}
2 I2C 引导装载的流程[4]
如果在DSP 的复位过程中选择了主I2C 引导装载,也就是引导模式管脚BOOTMODE[3:0]配置为0101,那么DSP 的引导装载程序首先从外部I2C EEPROM 中读取128 个字节的引导参数。引导参数在EEPROM 中的起始偏移地址可由DSP 的配置管脚CFGGP[2:0]设定,即偏移地址为0x80×CFGGP[2:0],本文中CFGGP[2:0]是000 ,也就是引导参数的起始位置在EEPROM 的地址0 处。
引导装载程序根据读到的引导参数判断下一步该如何进行装载。引导参数表的主要内容如表2 所示,每一个参数占用两个字节,表中仅列出了主要的几个参数的定义。
Length 项指定了引导参数表的数据长度,固定为26 个字节。Checksum 项是所有26 个字节的校验和,如果是全0 表示不需要校验。Boot mode 项选择引导模式,本例中是0101, 主I2C 引导模式。
如果引导参数表中的Option 选项为00, 表示在LSW 项中指定的地址是另外一个引导参数表的起始地址。如果Option 选项是01,那么LSW 项中指定的地址是引导表(也就是实际的DSP 程序)的起始地址;如果 Option 选项为10,那么LSW 项中指定的地址是引导配置表的起始地址。
引导装载程序在读取了引导参数后将热启动DSP, 然后根据读到的参数进行相应的操作。如果Option 选项指定下一步要装入的是引导配置表,那么引导装载程序会根据引导配置表中的内容配置相应的寄存器等,同时引导参数中的LSW 项和Option 项也会被更新。然后引导装载程序热启动DSP,根据更新后的LSW 项和Option 项进行下一步的引导配置或者引导参数设置。
如果Option 选项指定下一步要装入的是引导表,那么引导装载程序会根据引导表中的设置从EEPROM 中读取一定长度的数据到指定地址,然后DSP 跳转到程序的入口地址处(一般就是_c_int00 )开始执行。
LSW 项指定下一步需要装载的引导配置表或者引导表的起始地址,Next LSW 项则是在Option 项为10 时指定引导配置完成后下一个引导参数表的起始地址。
2.1 引导配置表的设置
为了在程序引导装载之前初始化一些必须的参数,需要用到引导配置表。例如在引导装载程序要把代码装载到DDR 存储器中执行的时候,就需要在引导装载之前配置一些DDR 的控制寄存器。
配置每一个寄存器(或者写一个存储器地址)需要3 个字(32bit) 的配置过程。第一个字指定了需要配置的寄存器的地址,第二个字指定了该寄存器中需要设置为1 的位,第三个字节指定了该寄存器中需要设置为0 的位。如果第二个字和第三个字有某些数据位同时有效,那么对应的数据位数据翻转。如果第二个字和第三个字同时为0,那么程序跳转到第一个字指定的地址执行。如果三个字全部为0,那么引导配置结束,表3 举出几个例子详细说明上述配置的过程。
可以看出,虽然引导配置表一般只是在引导装载之前配置一些寄存器,但是对于一些很简短的程序,也可以使用引导配置表将程序直接装载到内部存储器中去运行。
在引导配置完成后就需要将引导表(也就是真正需要在DSP 中运行的用户程序)装载到指定地址。
2.2 引导表的生成
引导表包括DSP 程序的代码段、数据段、以及其它一些程序信息,如程序入口地址等。引导表可以根据COFF 文件格式由用户从CCS 工程文件(即*.out 文件)中提取,不过使用TI 提供的转换工具hex6x 更为方便。使用hex6x 生成引导表时需要设置一些参数,这些参数可以用配置文件的形式提供给hex6x 使用[5],一个典型的配置文件如下所示(本例中的配置文件名为led.cmd):
led.out ; 需要转换的文件-boot ; 生成引导表-a; ASCII 格式文件-e _c_int00 ; 程序入口-order L ; 小端模式-memwidth 32 ; 存储器数据宽度-romwidth 32 ; ROM 数据宽度-o led.hex ; 输出文件在DOS 的命令行输入hex6x led.cmd↙ ,就可以生成引导表文件led.hex, 实际的数据结构转换如图所示,可以看出,为了能够正确的进行程序的引导装载,引导表中加入了一些代码的长度、地址等信息。
不过这个引导表文件并不能直接写入EEPROM 中,还需要进一步的格式转换。
2.3 EEPROM 映像文件的生成
写入EEPROM 的映像文件由一个或者多个引导参数表、若干个引导配置表和一个引导表组成。引导表的数据按照包的形式存放,每一个数据包由数据长度、校验和以及程序数据组成,数据包的长度不能超过128 字节。把hex6x 生成的led.hex 文件分割成128 字节的数据包的过程可以使用TI 公司提供的相关工具软件来完成,也可以由用户根据上述格式进行转换。由引导参数表、引导配置表和引导表合成映像文件的过程也可以使用TI 公司提供的相关工具软件来完成。本文中使用的映像文件由一个引导参数表、一个引导配置表和一个引导表组成,在EEPROM 的存放位置如图3 所示。
3 测试结果及小结
使用编程器或者直接使用TI 公司的CCS 软件可以把上面生成的映像文件写入EEPROM。为了验证引导装载过程是否能够正确完成,可以给验证系统重新上电,看到发光二极管闪烁,说明引导装载成功。
创新观点:
上一篇:赛灵思CEO:可编程技术成为企业创新关键平台
下一篇:基于CPLD的并口数据的采集和存储
推荐阅读最新更新时间:2024-05-02 20:49