打印

TMS320C6000系列DSP的Flash启动设计

[复制链接]
993|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qaz098xsw|  楼主 | 2017-11-9 10:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
TMS320C6000系列DSP的Flash启动设计


引 言
        随着近年来数字信号处理器(DSP)技术的迅猛发展,其越来越广泛地应用于国民经济的各个领域中。其中,TI公司推出的TMS320C6000系列DSP器件更是在许多需要进行大量数字信号处理运算并兼顾高实时性要求的场合得以应用。TMS320C6000系列DSP的系统设计过程中,DSP器件的启动加载设计是较难解决的问题之一。
        C6000系列DSP的启动加载方式包括不加载、主机加载和EMIF加载3种。
        3种加载方式的比较:不加载方式仅限于存储器0地址不是必须映射到RAM空间的器件,否则在RAM空间初始化之前CPU会读取无效的代码而导致错误;主机加载方式则要求必须有一外部主机控制DSP的初始化,这将增加系统的成本和复杂度,在很多实际场合是难以实现的;EMIF加载方式的DSP与外部ROM/Flash接口较为自由,但片上Bootloader工具自动搬移的代码量有限(1 KB/64 KB)。本文主要讨论常用的EMIF加载方式。
        1 EMIF加载分析
        实际应用中,通常采用的是EMIF加载方式,把代码和数据表存放在外部的非易失性存储器里(常采用Flash器件)。
        下面以TMS320C6000系列中最新的浮点CPU——TMS320C6713(简称“C6713”)为例,详细分析其EMIF加载的软硬件实现。
        硬件方面,其与16位宽度的Flash器件的接口如图1所示。


        对于不同的DSP器件,加载方式的配置引脚稍有不同。C6713的配置引脚及其定义如表1所列。



        应用程序的大小决定了片上的Bootloadet工具是否足够把所有的代码都搬移到内部RAM里。对于C6713,片上的Bootloader工具只能将1 KB的代码搬入内部RAM。通常情况下,用户应用程序的大小都会超过这个限制。所以,需要在外部Flash的前1 KB范围内预先存放一小段程序,待片上Bootloader工具把此段代码搬移入内部并开始执行后,由这段代码实现将Flash中剩余的用户应用程序搬移入内部RAM中。此段代码可以被称作一个简单的二级Bootloader。
        通常采用的Flash烧写程序是单独建立一个工程的办法:先把用户应用程序(包含二级Bootloader)编译生成的.out文件装载到目标DSP系统的RAM中,再把烧写Flash的工程编译生成的.out文件装载到目标DSP系统RAM的另一地址范围,执行Flash烧写程序,完成对Flash的烧写。这个办法要注意避免两次装载可能产生的地址覆盖,防止第2次装载修改了应该写入Flash的第1次装载的内容。
        实际上,可以将Flash烧写程序嵌入到用户主程序代码中去,比单独建立一个烧写Flash的工程更为方便。Flash芯片的烧写程序段如下:


      
  ProgramFlashArray函数的第1个参数是源地址指针(指向内部Ram),第2个参数是目标地址指针(指向外部Flash),第3个参数是要写入的数据长度(单位为字)。

        编写Flash烧写函数时有3点需要注意:
        ① 指向Flash地址的指针。由于C6713的低两位地址用于译码作字节选择,地址总线的最低位是EA2,所以,逻辑地址需要适当的移位才能正确地指向日标。
        对8位存储器而言,应该左移2位;对16位存储器而言,应该左移1位;对于32位存储器,则不需要移位。例如要从(往)Flash的0x00000003地址读(写)一个字,其逻辑地址应该是0x90000000+(0x0003<<1),而非0x90000003。
        ② map文件中各内存区间被实际占用的尺寸大小是以字节为单位的,而ProgramFlashArray函数写入Flash的数据单位为字,所以需要将map文件中得到的尺寸大小的一半作为ProgramFlashArray函数的参数。
        ③ 烧写函数中使用了flash_burned常量作为判断是否需要对Flash操作的依据,且将其初始化为1。这是为了避免Flash加载之后会执行对Flash的操作。此变量应在烧写Flash时手动修改为0。
        在仿真加载方式下,可以在CCS里的watchwindow窗口手动修改flash_burned常量为0,强迫CPU进入对Flash编程的程序段。实验证明,在仿真加载方式下手动修改flash_burned并不影响写入到Flash中的flash_burn-ed的值(仍为1),所以,写入Flash的flash_burned的值仍然是1。在系统Flash加载之后,CPU就会跳过此段代码,实现正确运行。
        4 结 论
        本Flash加载方案以C6713为例,稍加修改即可适用于TMS320C6000系列的其他DSP器件。经过在研制的伺服测试平台中的应用,证明本方法切实可行且易于实现,避免了目标文件格式的转换,比通常采用的FlashBurn工具使用起来更灵活方便,用户可以通过简单修改Flash烧写函数使之适应自己的硬件情况。对于Flash器件接口与TI的DSP不一致的情况,本方案是一个很好的选择。


相关帖子

沙发
zhangmangui| | 2017-11-29 23:22 | 只看该作者
6713比较经典      很多控制类板卡在使用

使用特权

评论回复
板凳
gygp| | 2017-11-30 19:44 | 只看该作者
先把用户应用程序(包含二级Bootloader)编译生成的.out文件装载到目标DSP系统的RAM中,再把烧写Flash的工程编译生成的.out文件装载到目标DSP系统RAM的另一地址范围,执行Flash烧写程序,完成对Flash的烧写。

使用特权

评论回复
地板
chenci2013| | 2017-11-30 19:44 | 只看该作者
从内部flash启动的详细流程说明:

a) 程序硬件复位或者软件复位

b) 判断mp/mc是否为0,为0则从boot rom启动,否则从外部启动(见附录1)

c) 到boot rom的0x3FFFC0处取出复位向量,跳到boot函数

d) 采集IO管脚状态,根据IO状态选择boot方式(见附录2)

e) 如果是flash,程序退出boot函数,跳转到0x3F7FF6

f) 取出跳转指令,跳转到自己的指定地址或者C初始化的入口_C_INT00处

g)  在C初始化的入口_C_INT00对一些变量,堆栈和寄存器进行必要的设置,该函数在c的库函数内

h) 进入main函数

使用特权

评论回复
5
biechedan| | 2017-11-30 19:44 | 只看该作者
nt00

这个函数在运行支持库(rts.lib)中,_c_int00函数为建立C运行环境,需完成以下工作:

1.为系统堆栈产生.stack块,并初始化堆栈指针;

2.从.cinit块将初始化数据拷贝到.bss块中相应的变量;

3.对寄存器进行必要的配置,调用main函数开始运行C程序;

使用特权

评论回复
6
wangdezhi| | 2017-11-30 19:45 | 只看该作者
需要修改cmd文件吗

使用特权

评论回复
7
isseed| | 2017-11-30 19:45 | 只看该作者
DSP内部FLASH不能用于存放用户代码,所以为了使DSP在掉电后能够正常运行,必须将程序存储在外部非易失存储器中。

使用特权

评论回复
8
suzhanhua| | 2017-11-30 19:46 | 只看该作者
为了使得DSP充分发挥其高速执行指令的功能,需要将程序和数据都存储在高速内存中

使用特权

评论回复
9
mituzu| | 2017-11-30 19:46 | 只看该作者
要下载到FLASH运行程序,先将ram链接换成flash链接

使用特权

评论回复
10
hellosdc| | 2017-11-30 19:47 | 只看该作者
BootROM User Guide里面写的很明确

使用特权

评论回复
11
uiint| | 2017-11-30 19:53 | 只看该作者
一般情况是从片内FLSAH启动,然后复制到片内RAM中运行

使用特权

评论回复
12
kmzuaz| | 2017-11-30 19:53 | 只看该作者
正确的设置从FLASH启动的Bootmode就把DSP开发板上的拨码开关都拨到ON的位置即可

使用特权

评论回复
13
gygp| | 2017-11-30 19:54 | 只看该作者
这个办法要注意避免两次装载可能产生的地址覆盖,防止第2次装载修改了应该写入Flash的第1次装载的内容。

使用特权

评论回复
14
chenci2013| | 2017-11-30 19:54 | 只看该作者
复位向量是指向片内Flash的0x3FFFC0

使用特权

评论回复
15
biechedan| | 2017-11-30 19:54 | 只看该作者
这个正常都是Flash启动。

使用特权

评论回复
16
wangdezhi| | 2017-11-30 19:54 | 只看该作者
正常的代码分配是怎么实现的

使用特权

评论回复
17
isseed| | 2017-11-30 19:54 | 只看该作者
一般的FLASH读取比较慢

使用特权

评论回复
18
suzhanhua| | 2017-11-30 19:54 | 只看该作者
修改好BootLoader

使用特权

评论回复
19
mituzu| | 2017-11-30 19:54 | 只看该作者
memcopy函数可以实现。

使用特权

评论回复
20
hellosdc| | 2017-11-30 19:54 | 只看该作者
EGIN  : origin = 0x100000, length = 0x000002     /*Use for codestart*/

  XFLASH6_S0   : origin = 0x100002, length = 0x007FFE

这个是flashcmd文件。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

632

主题

842

帖子

3

粉丝