打印

DSP的TMS320C6000系列关于Flash启动设计

[复制链接]
408|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
FCCdsp|  楼主 | 2017-9-13 11:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
DSP的TMS320C6000系列关于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芯片的烧写程序段如下:






        ChipErase函数和ProgramFlashArray函数的编写可参照用户使用的Flash芯片的Datasheet以及参考文献[1]。
        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就会跳过此段代码,实现正确运行。
     

相关帖子

沙发
zhangmangui| | 2017-9-13 22:48 | 只看该作者
很全面

使用特权

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

本版积分规则

967

主题

1447

帖子

9

粉丝