一种新的基于TMS320C6000 DSP的Flash引导自启动方法

2011-06-25 03:30:34刘远峰陈志华
电视技术 2011年21期
关键词:程序代码执行程序中断

刘远峰,陈志华

(暨南大学 信息技术研究所,广东 广州 510075)

0 引言

C6000系列没有自带的Flash,一般程序要烧写到外扩的Flash中,再由Flash引导自启动。由于Flash的读取速度比较慢,一般在上电复位之后,通过Boot⁃loader程序把Flash中的应用程序代码引导到DSP的内部RAM中去执行,实现系统高速运行。在C6000系列的DSP上电复位之后,DSP会直接由EDMA模块采用默认的ROM读/写时序从CE1空间起始地址上拷贝1 kbyte的代码到DSP的内部RAM起始地址0x00,然后DSP的CPU才开始运行,CPU从地址0x00开始执行程序,这是DSP的Flash引导自启动的基础,也是Bootloader程序能够被复制进入DSP内部RAM起始地址运行的关键。传统的Flash引导自启动往往用两个项目文件,一个用来调试应用程序,一个用来把应用程序烧写到Flash中去,这样比较繁琐。本文只用一个项目文件完成应用程序的调试和烧写,方便可靠。

1 DSP6713B的Flash自启动原理

1.1 DSP6713B自启动的基本原理

在上电复位之后,DSP6713B会自动去搬移Flash起始地址开始的1 kbyte内容,这1 kbyte内容搬移到DSP6713B的内部RAM起始地址开始的1kbyte内存中,当DSP开始执行程序时,首先从内部RAM的起始地址开始执行程序,这样就等于开始执行Flash起始地址开始的1 kbyte的内容,这就是存放DSP的启动程序Bootloader。Bootloader是一个复制程序,主要功能是把Flash中存放的应用程序代码复制到DSP的RAM中去执行。首先,Bootloader程序编写时是存放在DSP的起始地址开始的1 kbyte RAM中,然后再和应用程序代码一起烧写到Flash中去,Bootloader程序代码是被指定烧写到Flash起始地址开始的1 kbyte空间中,应用程序代码则被烧写到Flash起始地址开始的1 kbyte空间之外,通常是紧跟在这1 kbyte地址空间之后,这样就把Bootloader程序烧写到Flash起始地址开始的1 kbyte空间中去,同时,应用程序代码也被烧写到Flash中。

由于DSP上电复位之后,自动加载Flash起始地址开始的1 kbyte内容,而这1 kbyte内容存放的就是Bootload⁃er程序,这样就把Bootloader程序加载到DSP起始地址开始的1 kbyte空间中去,DSP开始执行Bootloader程序,而Bootloader的功能就是把Flash中存放的应用程序代码复制到DSP的RAM中,当Bootloader程序在DSP的RAM中执行完成后,所有的应用程序也就从Flash中复制到DSP的RAM中,然后DSP跳到c_int00()复位中断去执行,开始执行应用程序,这样就实现了DSP的Flash引导自启动。

1.2 DSP6713B的Flash自启动程序设计的改进方案

传统DSP6713B的Flash自启动往往需要把应用程序加载和程序烧写到Flash中去,分别用两个项目文件去完成,这样很不方便。为了避免覆盖已经下载到DSP的RAM中的应用程序和Bootloader程序,烧写Flash程序的项目文件的cmd文件配置还要进行重新设置。设计方案进行了改进,开始地址0x00的1 kbyte空间用来存放Bootloader程序,考虑到应用程序和烧写程序都是存放在DSP的程序代码.text中,如果编写在同一个项目文件中,在项目文件下载时,DSP会自动分给应用程序和Flash烧写程序在.text地址空间分配地址,两者并不会相互影响和相互覆盖。

首先,调试应用程序,完成之后,在应用程序项目文件中再加入烧写程序,烧写程序放在DSP初始化,并在DSP编译,运行之后,就直接执行了烧写程序,烧写程序只运行一次,这样就把Bootloader程序和应用程序同时烧写入Flash中。由于Flash有烧写次数寿命限制,因此,该设计只让Flash烧写一次,通过在烧写程序中加入一个标志位就可以控制Flash烧写一次。当DSP第一次运行烧写程序时,改变标志位,通过判别标志位,可以控制烧写程序在运行第一次之后就不再运行了。其次,在上电复位之后,Bootloader程序把烧写程序和应用程序都拷贝进入DSP的RAM中运行,由于烧写程序标志位改变,所以被直接跳过,执行应用程序,避免了多次烧写程序,这样就完成应用程序的Flash自启动。本设计可以避免烧写程序另外建立一个项目文件的麻烦,只要在调试好应用程序之后,直接在本项目文件加入烧写程序,编译运行,就把程序下载到Flash中。

2 EMIF引导启动DSP

对于TMS320C671X系列的DSP,在芯片复位之后,CPU处于“停转”状态,EDMA模块采用默认的ROM读/写时序从CE空间起始地址拷贝1 kbyte的地址代码到地址0x00,可以根据自己需要片选CE空间的起始地址,当EDMA模块拷贝代码完毕,CPU就会转入“运行”状态,从地址0x00开始执行程序。

DSP的EMIF引导启动是DSP的Flash自启动的基础,EMIF引导启动实现了将Flash中的1 kbyte地址空间复制进入DSP的RAM中,这样就实现了将Bootloader程序复制进入了DSP的RAM中去执行,再通过Bootloader程序复制应用程序,从而实现了应用程序在掉电、上电的重新载入DSP的RAM中去执行,完成了DSP的Flash自启动。

3 系统设计

3.1 DSPC6713与Flash的硬件连接

如图1所示,DSP外扩的是一个16位宽的Flash,DSP的地址输出引脚EA[21~2]与Flash的地址引脚A[20~1]对应,由于C671x系列DSP的最低有效位地址总是从外部地址管脚EA2输出,因此,在对SST36VF1601进行读/写时,DSP的地址位必须左移1位,这样才能与SST36VF1601的地址位对应,正确操作该款Flash的地址命令,从而正确地读/写Flash。

3.2 DSP的cmd文件配置

cmd文件负责DSP的内存分配,配置好DSP的内存才能使应用程序和Bootloader程序合理的分配到DSP的内存空间中去。首先,将Bootloader程序代码分配到DSP的0x00起始地址空间的1 kbyte的RAM空间中,在Flash烧写程序代码时,直接将Bootloader程序烧写进入Flash起始地址开始的1 kbyte地址空间中,这样在上电复位之后就能够由EMIF引导启动,将Bootloader程序重新复制到DSP起始地址开始的1 kbyte空间中执行。其次,将应用程序代码也分配到L2内部RAM地址空间中,应用程序代码存放地址紧跟着Bootloader程序代码存放的地址之后,便于在Flash烧写程序代码时,连续烧写Bootloader程序代码和应用程序代码,同时,这样可以使得Bootload⁃er程序代码和应用程序代码占用最少的L2空间,以免影响到程序运行时的速度和被其他动态分配内存的变量覆盖。

图2是DSP的cmd文件,Bootloader程序被指定存放在0x00000000~0x00000400的1 kbyte的地址空间中,应用程序代码被指定存放在0x00000400的1 kbyte地址空间之后L2(内部RAM)的192 kbyte地址空间中,而一些要分配内存的常量、全局变量和静态变量跟程序代码分配在同一块内存地址空间中,这些都是程序运行时所必须用到的数据,而一些动态分配内存变量数据和堆栈跟程序代码占用的地址空间分开存放,以免影响程序的正常运行和覆盖程序代码。

3.3 Bootloader程序

Bootloader程序一般用汇编编写,这样DSP能够更准确地执行程序代码。Bootloader程序功能就是把烧写在Flash中的程序代码和有用信息全部复制到DSP内部RAM(L2)中去执行,然后指向_c_int00中断去执行程序。可以打开项目文件中的.map文件,观察所有程序用到的地址空间的大小,然后再根据复制.map文件去复制所用到的地址块,也可以直接将整个的L2地址空间中存放程序代码地址空间数据全部复制到DSP的RAM中去执行,这样就避免了每次写程序时改动Bootloader程序需要所要复制的地址块大小。如图2所示,Bootloader程序需要复制的地址块大小就等于BOOT_RAM和PMEM指定的地址块大小,而BMEM是变量存放空间,不必复制和烧写。

3.4 DSP6713B初始化

如图3所示,首先,DSP初始化csl_init,也即初始化TI自带的DSP API库函数。在csl_init初始化之后,用户就可以使用TI公司提供的标准API库函数,直接调用API库函数对DSP的二级缓存L2进行配置,即配置DSP内部Cache L2的大小。接着初始化PLL锁相环时钟模块,这是为了提供DSP的CPU、外部存储器接口EMIF和外部时钟源的工作时钟源,因此,PLL初始化是DSP启动的关键。在PLL时钟配置好之后,初始化EMIF,EMIF是SDRAM和Flash的控制接口,通过EMIF初始化配置就可以配置和启动SDRAM和Flash。最后是中断初始化,主要是开启全局中断和硬件中断,设置好要中断的映射。这样,整个DSP的初始化完成。

3.5 系统流程图

3.5.1 测试程序定时器的流程

如图4所示,在DSP初始化之后,开始初始化定时器和GPIO口,定时器初始化主要是设置计数初始值和周期,GPIO口初始化主要是将GPIO映射为输出口,用来控制LED显示灯的点亮。当定时器开始中断,进入中断子程序,由中断子程序控制GPIO口点亮LED灯,以显示定时器定时效果,在程序被烧写到Flash后,上电重新由Flash自启动时,就可以观察LED灯的显示定时效果,判断整个Flash自启动是否正确。

3.5.2 加入烧写程序的定时器项目文件的流程

如图5所示,在定时器程序调试完成之后,接下来就是把定时器程序和Bootloader程序烧写到Flash对应的地址空间当中去,烧写程序只运行一次,通过判断Flash烧写程序标志位是否等于N来控制,在第一次烧写时,Flash烧写程序标志位等于N,然后改变标志位,以免Flash多次烧写,然后开始把定时器程序和Bootloader程序烧写到Flash对应位置,最后判断在L2中存放的定时器程序和Bootload⁃er程序代码的地址空间数据是否和Flash中烧写的程序代码地址空间数据一致,如果一致,则烧写完成,否则烧写错误,这可能是cmd文件配置内存错误和烧写程序把存放动态变量的地址空间内容也烧录到Flash中。如果是cmd文件配置错误,则重新配置好cmd文件,适当地放大程序代码存放的空间就行了。如果是烧写程序把存放动态变量的地址空间内容也烧录到Flash中,由于动态变量是动态分配内存的,所以在不断的变化中,这时只要根据cmd文件,改变Flash烧写程序中要烧写的程序代码的长度,只要把固定分配内存空间的程序代码存放的空间烧写到Flash中去就可以了。

4 仿真结果与分析

仿真图见图6~图9,存放在内部RAM(L2)起始地址的1 kbyte空间中的Bootloader程序代码已经被烧写到Flash起始地址的1 kbyte地址空间中,存放在内部RAM(L2)起始地址1 kbyte之后的定时器程序代码也被烧写到Flash起始地址1 kbyte之后的地址空间中,程序烧写结果可靠、正确,在DSP上电复位之后,DSP调制到Flash自启动,LED灯能够正确显示定时器程序设定的定时点亮LED显示效果,整个设计方法方便、稳定、可靠。

5 小结

运用DSP在上电复位时会由EMIF引导自动搬移CE1起始地址1 kbyte的程序代码到地址0x00,使用CE1来扩展外部Flash,再将Bootloader引导程序烧写到Flash起始地址1 kbyte空间中,从而实现了DSP上电复位后Bootloader引导程序被直接加载到DSP的地址空间中,再由Bootloader引导程序直接引导加载Flash中的应用程序代码,完成了定时器的Flash引导自启动。该方案设计在一个项目文件中完成应用程序的调试和烧写,比传统方法用两个项目文件去完成更方便、简单,具有很好的实用性。

[1]卞红雨,纪祥春,乔钢.TMS320C6000系列DSP的CPU与外设[M].北京:清华大学出版社,2007.

[2]刘向宇.DSP嵌入式常用模块与综合系统设计实例精讲[M].北京:电子工业出版社,2009.

[3]蒲中奇,张伟,施克仁,等.TI TMS320 C6000系列DSP的BOOT LOAD程序设计[J].工业仪表与自动化装置,2004(6):52-54.

[4]何正军,朱善安.TMS320DM642 DSP二级引导程序的设计与实现[J].电子器件,2006,29(1):260-263.

[5]韦照川,郑展恒,孙希延,等.一种基于DSP的自适应盲均衡器[J].电视技术,2011,35(13):76-78

猜你喜欢
程序代码执行程序中断
执行程序中的法律问题与律师的作用
法制博览(2019年27期)2019-12-13 23:37:40
计算机网络信息安全未来发展趋势
跟踪导练(二)(5)
千里移防,卫勤保障不中断
解放军健康(2017年5期)2017-08-01 06:27:44
基于图元装接模式由程序流程图自动生成源代码
软件工程(2016年11期)2017-01-17 16:56:57
国有划拨土地使用权强制执行问题研究
执行程序与破产程序衔接机制若干问题分析
法制博览(2016年11期)2016-11-14 10:45:46
浅析执行程序中对法定抵销权的审查
AT89C51与中断有关的寄存器功能表解
FPGA内嵌PowerPC的中断响应分析
微处理机(2012年4期)2012-06-13 11:32:24