时间:2024-05-04
李光学 李超 郭燕红 岳宗帅 宋茜
摘要 本文在基于C6000系列DSP片外Flash的基础上,针对嵌入式设备程序烧写升级困难的问题, 阐述了In-ApplicationProgramming (lAP)的设计方案,详细介绍了二次引导启动及首次烧写方法,给出关键技术的代码实现。采用IAP很好的实现了C6000系列DSP的程序烧写及升级,其不用借助外部工具,可靠便捷,通用性好,具有良好的推广价值。
【关键词】C6000 DSP 片外 Flash IAP
1 概述
C6000系列DSP在产品的开发的过程中,固件程序的升级更新非常频繁,若继续采用传统的JTAG或者ICP等烧写方法,过程繁琐复杂,极大地降低了工作效率,所以开发一种便捷,可靠,通用性好的在应用烧写In-Application Programming (IAP)方法就显得格外重要。06000系列DSP不带片上ROM,脱机运行需要配置外部Flash,不能直接通过JTAG仿真器来烧写程序,与一般自带片上ROM的单片机系统的IAP开发方法不同,本文针对上述问题,详细阐述了C6000系列DSP的IAP实现原理及整个引导启动流程。
2 DSP配置分析
DSP系统上电后,在复位信号的上升沿处,会锁存BOOTMODE引脚信号,借以决定DSP的存储器映射方式,地址为0处的存储器类型及复位后芯片的自举方式。BOOTMODE信号决定了DSP在复位期间所做的工作。C6000系列DSP主要有以下3种自举模式:
(1)不加载(NO BOOT)。DSP直接从地址O处开始执行程序,地址O处的存储器可以是DSP内部存储器或者外部RAM,这种方式适用于仿真器系统下的DSP自举模式。
(2) ROM加载。此种方式适合8位、16位和32位的ROM( -般为Flash)。对于不同型号的C6000系列DSP,需注意Flash的大小端模式存储。
(3)主机引导(HPI Boot)。CPU在复位期间,其硬件保持正常工作状态,外部主机通过HPI接口初始化CPU的存储空间。
复位结束后,无论采用哪种引导方式,DSP芯片都将从地址O处开始执行程序。因该系列DSP不自带Flash,本系统以C6701为例,设计一个脱机运行系统,外部配置16位Flash,加载方式为16bit ROM加载,即自举模式2,存储器映射为MAP1,地址O处为内部存储器,BOOTMODE引脚需配置为Oll01。
3 首次烧写设计
06000系列DSP没有片上ROM,只有片上RAM,脱机运行需配置外部Flash,第一次代码烧写需编写专门的烧写程序来下载应用程序到外部Flash中。这是一种需要加载两次程序的方法,如图1所示,首先用CCS编译软件打开用户应用程序,生成可执行文件(0UT),然后用CCS的file/load program加载应用程序的OUT文件到DSP片上内存空间。再通过map文件,确定应用程序各段数据所对应的空间,将程序段和数据段这两段数据采用file/data/load命令分别导出成dat格式的文件。然后加载Flash烧写程序,利用file/data/load命令,将生成的dat文件加加载到DSP片上RAM的一段未使用的空间中,然后使用专用烧写程序将数据烧写到对应的Flash空间中。
其烧写函数实现如下所示:
ProgramFlash (PRAM, PFlash,Length);//将程序段烧入FLSAH中
ProgramFlash (DRAM, DFlash, Length);//将数据段烧入Flash中
其中函数的定义是:
void ProgramFlash (int *sourcepoint, Uint32Flashpoint;Uint32 int j)第一个参数sourcepoint是待烧写数据在片上RAM首地址;第二个参数Flashpoint是将被烧写Flash的首地址;最后一个参数j是待烧写的32位数据的总长度。
图2所示为首次烧写过程中,代码在片上RAM和片外ROM(Flash)中的变化,首先专用烧写程序通过自举模式1启动,然后手动载入待烧写的用户应用程序,接着运行专用烧写程序将用户应用程序烧入片外ROM中,断电后片上RAM数据消失,只有片外ROM的用户应用程序。
4 应用程序设计
上面介绍了首次如何使用专用烧写程序,借助CCS开发环境将用户应用程序烧写到片外ROM(Flash)中。为了能让DSP脱机运行,一个完整的用户应用程序需包含实际的应用程序数据和二次引导代码数据。DSP芯片在复位时,DMA控制器自动将片外ROM(Flash)自起始地址一定大小的程序(二次引导代码)搬移到片上RAM地址O处,即自引导过程,如图中过程l所示;完成复位后,CPU从地址O处开始执行程序,把应用程序数据从片外ROM搬运到片上RAM的某地址处,即二次引導过程,然后跳转到c int00(mam函数)处运行,如图中过程3所示,最终完成应用程序的启动。
当用户应用程序需要更新的时候,可以采用首次烧写方法进行,但比较繁琐,特别对于一些正式产品来说,那只能返厂更新,本文设计的应用程序包含在线烧写功能,可以通过总线接收数据,烧写进入外部Flash中,如图3 最后一个步骤所示。
下面将分别从CMD连接命令文件配置,二次引导程序设计,向量表设计,在线烧写设计详细介绍IAP的实现。因C6000系列DSP的原理都一致,实例代码是以C6701硬件平台给出。
4.1 CMD连接命令文件配置
CMD文件的作用是实现程序代码和数据在DSP存储空间的定位,在编译连接时由CCS开发环境调用。脱机启动时,自引导就是将片外ROM的向量表和二次引导程序搬到地址0处执行,所以需在CMD文件中明确这两个段的运行空间,CMD文件如下
-heap Ox400
-stack Ox400
MEMORY
{
vecs:
o=OOOOOOOOh l=00000200h//向量表空间
boot_ load:
0 = 00000200h 1=00000200h//二次引导程序空间
IPRAM:
o=00000400h 1=OOOOeOOOh∥程序段空间
IDRAM:
o=80000000h 1=OOOlOOOOh,/数据段空间
)
SEC,TIONS
{
”vectors” >
vecs
//将”vectors”段存储到vecs空间
”.boot_ load”>
boot_ load//将”boot load”段存储到boot load空间
cinit
>
IDRAM
.text
>
IPRAM
.stack > IDRAM
.bss
> IDRAM
const >
IDRAM
data > IDRAM
.far
>IDRAM
.switch > IDRAM
.sysmem >
IDRAM
tables >IDRAM
Cl0 > IDRAM
)
其中vectors和boot load段存储的为向量表和二次引导程序,地址范围为O-Ox3ff,启动时被自动加载到地址0处并执行。
4.2 二次引导程序设计
二次引导程序的作用是将应用程序数据从片外ROM(Flash)搬移到片上RAM存储器中执行。本实例中将二次引导程序保存在DSP内部RAM的Ox200地址开始的Ox200字节空间,由于复位中断向量设置为二次引导程序的入口地址,所以当系统上电复位后,系统转去执行二次引导程序,将应用程序数据段搬移到指定的存储空间,再跳转到DSP主程序的程序入口处(c int00)执行DSP应用程序。主要代码如下:
EMIF GCR
e quOx01800000 11定义EMIF全局控制器GBLCTL
EMIF GCR DATA
equ Ox3779//设置GBLCTL参数
EMIF CEl
e quOx01800004∥定义EMIF CEl控制器CEICTL
EMIF_CEl_DATA .equ Oxffffff03 11设置CEICTL
BOOT SLZE
.equ Ox600 //设置搬运长度,单位为字节
sect”boot load”
∥定义”boot load”段
ref_cint00
//引用全局符号c int00
.global _boot
//定义一个全局符号boot,供外部调用
boot:
mvkl EMIF_GCR,A4
||mvkl EMIF_GCR_DATA, B4
mvkh EMIF_GCR,A4
||mvkh EMIF_GCR_DATA, B4
stw B4, *A4
//设置GBLCTL参数
mvkl EMIF CE1.A4
ll mvkl EMIF_CEl_DATA,B4
mvkh EMIF CE1.A4
|| mvkh EMIF_CEl_DATA,B4
stw B4, *A4
+设置CEICTL参数
mvkl Ox80000000,A4
|| mvkl Ox01410000,B4
mvkh Ox80000000,A4
ll mvkh Ox01410000,B4
//A4为数据段地址指针,B4为Flash地址指针
zero Al
//Al作为计数器,清零Al
_boot_loop:
//循环搬运
ldb*B4++,B5
//DSP读取Flash中的数据到寄存器B5
mvkl BOOT_SIZE,B6
//B6为需要拷贝的字节数
add l,A1,A1
//Al=Al++
|| mvkh BOOT_SIZE,B6
cmplt Al,B6,BO
∥若AI
NOP
stb B5,*A4++
∥将从Flash读出数据搬运到数据空间中
[BO]B _boot_loop
//判断BO值,为1跳转到boot_loop处执行
NOP 5
mvkl .s2_c_int00,BO //循环结束后,跳转到主函数开始执行
mvkh .s2 _c int00, BO //把cint00装载到BO寄存器
B
.s2 BO
∥跳转到主函数
NOP 5
4.3 向量表设计
中断向量表vectors保存在DSP内部RAM的O地址开始的Ox200字节空间,上电或复位后,DSP自动运行复位中断。因此,复位中断响应设置为二次引导程序的入口地址(boot)。中断向量表的复位程序如下:
ref_ boot //调用boot引导程序
sect”vectors”//定义一个段
RESET RST://复位中断向量
mvkl.S2__ boot,BO
mvkh.S2_ boot,BO//装载引导程序地址
B.S2 BO∥跳转到引导程序执行
4.4 在线烧写程序设计
考虑到后续程序升级的需求,利用IAP实现在线升级功能。在应用程序中,有一部分代碼专门用来判断是否需要进行软件更新,若需要更新则进入程序烧写流程,若不需要则继续执行程序。烧写函数同首次烧写程序类似,烧写时需要将OUT文件转化为HEX十六进制文件,有专门的工具,这里不再敖述。
5 结论
本文利用IAP在应用编程设计,解决了C6000系列DSP的首次程序烧写与后续程序更新升级的问题,其不用借助外部工具,方案可靠便捷,通用性好,本系统通过多次测试,性能稳定,具有良好的推广价值。本文详细介绍了首次烧写方法及二次引导设计,给出关键技术的代码实现,脱机运行系统都可以参考。
参考文献
[1]崔旭涛,杨日杰,何又.TMS320C6701 DSP的程序引导方法及编程实现[J].电子工程师,2006,32 (09):36-39.
[2]郑欢欢,穆占杰.基于C6000系列DSP片外Flash自启动方法[J].信息化研究,2011,37 (05): 34-37.
[3]李方慧,王飞,何佩琨等.TMS320C6000系列DSP原理与应用[M].北京:电子工业出版社,2003.
[4]刘伟,魏芹芹,王伟.TMS320C672x系列DSP原理与应用[M],北京:北京航空航天大学出版社,2008.
我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自各大过期杂志,内容仅供学习参考,不准确地方联系删除处理!