返回首页

TMS320C5509通过外部FLASH实现自引导启动

时间:2012-11-14 00:10来源:知行网www.zhixing123.cn 编辑:麦田守望者

引言
所谓自引导启动(Bootload)就是指由DSP系统上电之后,系统可以在脱离仿真环境之下,通过外部设备,将程序装在入内部存储器之中,实现程序的引导启动。TMS320C5509(以下简称5509)提供了丰富的引导方式,包括直接外部存储器方式引导、主机接口(EHPI)方式引导、标准串行方式引导和USB方式引导等多种方法。这样的好处是:可以将程序存储于非易失的外部存储器之中,而在运行时加载到相对高速的内部存储器之中;同时可以为用户提供多种引导方式,使得DSP的应用更为灵活。这里主要讨论的是采用FLASH存储器方式对程序实现引导。
基于5509采用FLASH的字引导方式主要有两种:一种是将程序写入FALSH之后在FLASH之中直接运行,这种方法速度较慢;另一种方法是在上电之后,将FLASH中的程序写入内部的RAM然后运行,这种方法可以提供更高的速度,因而得到广泛的采用。
传统的自引导启动方法需要用户更具不同的引导方式建立相应的引导表,进而配置相应的.cmd文件,最后通过HEX55工具烧写入FLASH之中。这种方法不仅不利于用户掌握,而且也有一定的局限性,因此这里介绍的方法是通过仿真环境下对FALSH的烧写实现自引导启动。

1. 启动方式的选择
介绍自启动方法之前写说明一下5509提供的FLASH直接引导启动机制。第一步要求确定启动模式为外部存储器模式,5509采用上电之后对通用IO口GPIO0~3的辨认来实现对引导方式的选择。具体的引导可以见表1。

表1 引导方式选择
IO.0 IO.2 IO.2 IO.1 C5509A C5509 引导方式
0 0 0 0 - - 保留
0 0 0 1 有 有 McBSP0 24位串行EEPROM
0 0 1 0 有 有 USB
0 0 1 1 有 - I2C EEPROM
0 1 0 0 - - 保留
0 1 0 1 有 有 EHPI(多种模式)
0 1 1 0 有 有 EHPI(非多种模式)
0 1 1 1 - - 保留
1 0 0 0 有 有 外部16位异步存储器
1 0 0 1 有 有 McBSP0 16位串行EEPROM
1 0 1 0 有 - 8位并行EMIF
1 0 1 1 有 有 16位并行EMIF
1 1 0 0 - - 保留
1 1 0 1 - - 保留
1 1 1 0 有 有 McBSP0 16位标准串行
1 1 1 1 有 有 McBSP0 8位标准串行

因此,如果采用FLASH引导,应当将GPIO0~3设置为1000,这样在上电之后,程序从0x400000的地址开始运行。因此只要在0x400000的位置写入相应的程序就可以实现自启动。这样的启动在硬件上需要通过5509的CE1来选通外部映射到0x400000~0x800000的FLASH来实现,

 

2. FLASH直接运行
先介绍直接将程序在FLASH之中运行。首先由用户编制主程序工程,由于需要在0x400000的位置运行程序,因此需要将主程序的内存配置(.cmd)文件的程序地址设置在0x400000~0x800000之内。可惜的是,在emulator模式下这样的配置将会导致链接出现问题,因此主程序必须在simulator模式下完成。例如将主程序装入0x400010,编译并链接之后,主程序装入虚拟的内存之中,然后使用CCS(Code Composer Studio)环境中自带的data save工具将内存中的数据保留下来。
第二个需要用户编制的工程是烧写FLASH的工程,即建立一个emulator工程,先load上述保存的数据进入内存,然后烧写入FLASH之中,必须注意的是此时的烧写地址应当和上面的simulator所配置的地址一致,这里就是0x400010。值得关注的问题是这样并没有实现自启动,因为上电之后,初始运行地址0x400000的位置并没有有效数据,因此必须在此FLASH烧写工程中,在0x400000的位置写入跳转指令,将程序计数器指针(pc)指向FLASH中主程序的入口地址。跳转指令的汇编代码是B 40xxxx,相应的机器码是6A40xxxx,具体地讲,就是在0x400000和0x400001的地址中烧写入6A40xxxx的数据,具体的40xxxx为主程序的入口地址。
完成了上述工作之后,自启动的工作就完成了。上电之后的运行情况是首先检测启动顺序,确定为外部FLASH引导,然后程序从0x400000执行跳转程序,跳转到已经烧写入FLASH的主程序的入口地址,从而开始执行主程序本身。

 

3. 高速片内RAM运行
然后介绍上电之后将程序从FLASH中装入高速片内RAM运行,这样可以提高程序的
执行速度。首先由用户编制主程序工程,与上面不同的是此程序为emulator模式,装入内存之后,不断电,执行第二个FLASH烧写程序,将内存中的程序烧写进入FLASH之中。
第三个程序在simulator模式下完成,模拟上电运行后将FLASH中的程序读回片内高速RAM,并且在程序的最后需要加上程序计数器指针(pc)跳转指令,跳转到主程序的入口地址。最后需要再次编制一个烧写程序,将此程序写入FLASH相应的位置中。第三个和第四个程序之间通过data save/load来实现数据保存。两次烧写程序的FLASH地址不能混叠。同样要注意的是需要在0x400000的位置烧写入跳转指令的机器码,跳转到程序三的入口地址。具体的方法在上面已经详细描述,这里不再赘述。
上电之后的运行情况是首先检测启动顺序,确定为外部FLASH引导,然后程序从0x400000执行跳转,跳转到保存在低速FLASH里的程序入口地址,接着在FLASH中执行读出程序,写回高速片内RAM中,写完之后执行跳转指令,将程序计数器指针(pc)指向已进入内存中的主程序的入口地址,从而最后开始执行主程序本身。此入口地址即为第一个工程的入口地址。

 

结语
  实现系统自启动并非DSP的关键技术,但是却是脱离仿真环境,实现上电系统自动运行所必需的步骤,也是DSP初学者的难点之一,本文所提供的方法以FLASH读写为核心,可以较为简单地实现系统自启动,希望可以对读者有抛砖引玉的作用。

------分隔线----------------------------
标签(Tag):FLASH FLASH实例教程 flash技巧 flash源代码 flash基础教程
------分隔线----------------------------
推荐内容
猜你感兴趣