祖文祥,丁劲涛
(四川长虹电源有限责任公司,四川 绵阳 621000)
数字信号处理器(DSP)拥有强大的运算能力和丰富的外设,使其成为控制领域的首选控制芯片。当系统需要进行软件升级时,需要将程序代码重新下载到DSP的FLASH中。传统的升级方式是将产品从系统上拆卸下来,打开产品盖板,连上JTAG下载器进行软件烧写升级。使用JTAG下载器进行软件升级虽然实现简单,但存在以下局限性[1]:
(1)由于安装位置的限制,有时装在系统上的产品较难拆卸;
(2)取下产品后,还需要打开产品壳盖才能实施下载,操作非常不便。
为了减少产品的维护成本和提高效率,DSP芯片在线加载功能的实现显得尤为重要。DSP在线加载是指完全脱离下载器,通过通信总线实现对DSP片内FLASH的擦、写,完成软件升级。在线加载利用产品原有的通信接口,无需添加额外的接口设备,具有方便灵活等特点,改善了传统DSP程序下载的局限性。
TMS320F2812存储器空间定义如下[1]。
(1)片内RAM(18K×16)。5个存储块组成,H0(8K×16,0x3F8000~ 0x3F9FFF)、L0和 L1(2×4K×16,0x008000~0x009FFF,受保护,不可用)、M0和 M1(2×1K×16,0x000040 ~ 0x0003FF)。
(2)片内OTP(1K×16 ROM)。0x3D7800~0x 3D7BFF,TI保留空间(1K×16)。
(3)Boot ROM(4K×16 ROM)。0x3FF000~0x3FFFFF,TI限制,不可用。其中,0x3FFC00~0x3FFFBF存放TI公司的引导装载程序,0x3FFFC0~0x3FFFFF存放复位向量。
(4)片内Flash(128K×16 Flash)。①J~B区:0x3D8000~0x3F5FFF,120K×16,用户使用空间;②A区:0x3F6000~0x3F7FF5,16K×16,0x3F7FF6~0x3F7FF7入口地址;③密码区:0x3F7FF8~0x3F7FFF,8×16,CSM安全模块,保密需要时使用。
系统上电复位后,复位向量指向0x3FFFC0,其中是一条跳转指令。如果MP/MC=0,地址跳转至0x3FFC00运行TI固化的引导装载程序(简称一级Boot)。引导装载程序是根据GPIO引脚状态决定启动类型,见表1[2]。
表1 DSP上电启动类型
本系统选择的是Flash引导模式,所以一级Boot引导至地址0x3F7FF6,从中取出一条跳转指令,跳转到至程序初始化入口地址(DSP281x_CodeStartBranch.asm中的_c_int00指定该入口地址,在编译时编译器会自动生成入口地址,具体可通过map文件中的ENTRY POINT SYMBOL:"_c_int00"address:XXXXXXXX查询),然后从主函数开始执行。
为了实现在线加载功能,必须有一段引导程序能够根据需要引导至加载程序或者APP程序,该引导程序简称二级Boot。这里不对上位机的开发进行说明,二级Boot的具体设计见第4章。
分为3个程序模块,分别是二级Boot、加载程序和APP程序[2]。经过一级Boot后,进入二级Boot。在二级Boot中运行程序,根据设定的条件跳转至加载程序或者APP程序。加载程序通过通信总线获取APP目标代码,将其写入到FLASH区段,等待产品下电。APP目标代码是采用TI公司的Code Composer Studio(5.0及以上版本)开发环境直接编译生成.bin文件(对于5.0以下版本则只能生成.out文件,但可通过转换工具如HEX2000.exe转换为.bin文件)。
二级Boot可根据不同的在线加载方法设计程序[3]。运行一级Boot后,地址跳至二级Boot程序的入口地址,通过该入口地址进入运行二级Boot程序。该入口地址的获取与二级Boot程序存放的Flash的位置有关,通过在CMD文件中配置.text确定存放的Flash区段(需手动配置),编译时自动生成进入该区段的入口地址,并自动填写至0x3F7FF6地址中。
二级Boot跳转指令分别如下。
(1)跳至加载程序
(2)跳至APP程序
在加载程序的CMD文件中手动配置.text(SECTIONS段内的所有Flash空间定义都改为所占用的Flash区段),编译时自动生成进入该区段的入口地址0x3f6d2d(该地址不固定,每次编译可能会变化),将该地址手动填写至二级Boot程序中的跳转指令中,作为跳转至加载程序的入口地址。
加载程序接收到APP目标码后,写入到指定Flash的空间[4]。写入的起始地址从0x3E4000开始(该地址在CMD文件中配置,例如APP只占用F~C区段,起始地址就为0x3E4000)。执行过程为:擦除该区段→接收一帧目标码→判断是否超过该区段,超过就擦除下一区段,直到能够容纳该目标码长度为止→写入目标码→接收下一帧目标码。写入完成后,等待手动下电。
对于APP程序的入口地址,在接收到第一帧目标码中获取后就写入到指定空间[5],本案例是0x3F3FF0-0x3F3FFF。
在APP程序的CMD文件中手动配置.text(SECTIONS段内的所有Flash空间定义都改为所占用的Flash区段),编译时自动生成进入该区段的入口地址(该地址不固定,每次编译可能会变化)。该地址通过通信总线下发至加载程序,写入至0x3F3FF0地址。
在代码编写时分别创建3个工程,分别对应BOOT程序、加载程序和APP程序。3个工程中的CMD文件做相应的配置修改,代码编写并通过编译后,按照以下操作灌装至DSP中。
(1)打开Code Composer Studio,导入Boot程序工程和加载程序工程;
(2)分别在两个工程的debug属性中选择Flash setting,在其中选择需要操作的Flash区段;
(3)分别灌装两个程序;
(4)退出CCS,利用上位机通过通信向DSP下载APP目标码,第一帧包含APP入口地址;通过JTAG将二级Boot和加载程序灌装到DSP中,然后通过配套的上位机将APP程序目标代码通过通信总线下发至DSP。图1为灌装BOOT程序和加载程序界面,图2为灌装APP程序界面。
图1 灌装Boot程序和加载程序
图2 上位机通过1394通信灌装APP程序