TMS320C6000系列二次Bootloader的设计与实现

发布者:huijiazi5210最新更新时间:2007-07-25 来源: 电子工程师关键字:程序  中断  指令  存储 手机看文章 扫描二维码
随时随地手机看文章

引 言

随着DSP(数字信号处理器)系统的广泛应用,其程序规模也随之不断扩大,使用芯片本身自带的Boot-loader通过Flash存储器来引导DSP程序,往往受到程序大小和结构的制约,比如程序很大超过厂商固化boot的范围,再如中断向量表的不同位置对程序boot跳转的影响,等等,因此越来越需要更加灵活的引导方式。

系统上电后,由引导程序将DSP的应用程序从该存储器引导到DSP应用板上的高速存储器(如内部SRAM、SDRAM等)中。由于Flash存储器具有电信号删除功能,且删除速度快,集成度高,因此已成为此种存储器的首选。由于Flash存储器的存取速度较慢,写入Flash存储器的程序将在系统上电时被DSP装载到快速的存储器中运行,这个过程称为Boot loader。不同的DSP有不同的引导方式。以TI公司TMS320C6000系列芯片为例,自举方式有3种:无自举(No Boot),CPU直接开始执行地址0处的指令;主机自举(Host Boot),系统复位后主机通过CPU的HPI(主程序设计接口)初始化DSP的存储空间;ROM自举(ROM Boot),DMA控制器从CEl空间复制固定长度程序的地址0处,然后从地址0处开始执行。对于620x/670x DMA,复制64 kB数据从CEl到地址0;而对于621x/671x EDMA,复制1 kB数据从CEl地址开始到地址0。

关于TI公司的C6000芯片二次Bootloader在许多文献都介绍过,包括二次Bootloader的PLL、EMIF的设置和搬移表的设置和Flash存储器的烧写过程,但是对于有中断向量表的二次Bootloader实现的文献很少。本文以TI公司高性能DSP的代表作TMS320C6000系列芯片为例,介绍了一种带中断向量表的二次Bootloader的新途径,从而为TMS320C6000系列DSP的开发提供了一种新的思路。该方法在实际中得到具体应用,系统运行稳定可靠。

1 二次Bootload的过程

TMS320C6713是TI公司推出的TMS320C67xx系列浮点DSP中最新的一种芯片。TMS320C6713每周期可以执行8条32位指令;支持32/64位数据;具有最高225 MHz的运行速度和1800 MIPs(百万次运算每秒)或1350 MFLOPS(百万次浮点运算每秒)的处理能力;同时是有强大的外设支持能力;EMIP(外部存储器接口)可以很方便地与SDRAM、SBSRAM、Flash存储器、SRAM等同步和异步存储器相连,16位EHPI接口可以与各种处理器接口;另外,还有优化的多通道缓存串口和多通道音频串口,这些外部接口使设计人员可以很容易实现自己的应用系统。

在选择ROMBoot方式时,RESET由低变高后,C6713的CPU内核处于复位状态,而C6713的其他部分则开始工作,此时EMIF的CEl空间根据ROM Boot的方式自动地配置为8/16/32位异步存储器接口,并且CEl空间读/写时序自动地配置为最大,随后将CEl空间的前1 kB复制到0x0000 0000地址处。通过这1 kB的数据实现对其他程序的引导。对于中断向量表设在0x0000 0000~0x0000 0400处的程序来说,1 kB数据中处包含EMIF设置代码和搬移程序外,必然也包含中断向量表。本文重点叙述带中断向量表的Bootloader的过程,中断向量表起始地址为0x00000000。如果程序长度小于1 kB,那么就不需要二次bootloader,但是往往程序长度都会大于1 kB,所以二次bootloader是必然的过程。

二次Bootloader的实现需要引入EMIF设置和搬移的程序,即编写boot_c671x_2.s62、c6713_emif.s62,lnk2.cmd和boot.cmd3个文件。本文以实现多通道缓冲串口的程序进行说明,实现二次Bootload的过程框图如图1所示。

首先调入调试好的用户程序工程文件MeBSP_test.pjt工程作为例程,然后在此工程文件中引入3个文件。

程序编写好后,要引入3个很重要的文件;EMIF的值定义文件(c6713_emif.s62);关于EMIF的设置和数据搬移的程序(boot_c67lx_2.s62);cmd配置文件(lnk2.cmd)。同时,其原来的mcbsp.cmd文件要去掉。图2做了一个对比。图2(a)为原程序,图2(b)为生成要烧写的数据的程序,图2(b)中加入了3个文件,原有的mcbsp.cmd去掉了。其中boot_c67lx_2.s62是通用的,c6713_emif.s62要根据具体实际的芯片配置EMIF的参数。

其中boot_c671x_2.s62包含了.boot_load的函数,这个函数包含几个过程,如图3所示。c6713_emif.s62文件包括EMIF的几个参数配置。Ink2.cmd文件位COFF的配置。

其次,就是把生成的*.out文件首先使用CCS开发环境自带的工具Hex6x.exe把工程生成的*.out文件转化成hex格式,在DOS环境下指令为>Hex6x.exeboot.cmd。

最后根据Flash存储器芯片的要求把hex文件烧写到Flash存储器中指定的地址即可。本例采用的AM29LV800BB-70ecFlash存储器芯片,采用3.3 V供电,完全兼容JEDEC标准,并支持在系统编程,用户只需向其内部的命令寄存器写入命令序列即可实现部分擦除、全部擦除、数据写人等功能;同时可提供硬件和软件方法来检查Flash存储器的操作执行情况。首先需要对芯片进行擦除全部变为0xFFFF,然后再进行烧写。由于Flash存储器是以16位进行访问的,所以对Flash存储器而言其物理地址以16位为单位进行编址,而程序中使用的逻辑地址是以字节为单位进行编址的,二者之间的关系如下:逻辑地址=物理地址<<1,所以程序中有地址偏移。下面给出烧写的程序。

2 带有中断向量表的二次Bootloader的实现

第1节介绍了一般的二次Bootload过程,但当需要boot带中断向量表的程序时,需要仔细考虑3个重要文件的编程,否则将会遇到意想不到的后果。

2.1 配置文件Ink2.cmd

Ink2.cmd有了细微差别,此时有中断向量表,所以在分配时要考虑vectors的分配空间。在配置文件中差异主要在Memory中,section的部分如下:

SECTIONS

MEMORY的差别具体如下:

a) 没有考虑中断向量表配置的部分程序:

b) 考虑中断向量表配置的部分程序:

.vectors为中断向量表,其有0x200的长度的数据,必须放在0x90000000的地址处,.boot_load紧接着放置。

2.2 中断向量表文件vec.asm

还有一个很重要的一点是图2中vec.asm文件的变化。在调试程序时,中断向量表开始会直接跳到c_int00处,但是待烧写的前1 kB数据,首先要进行EMIF设置和搬移过程,所以其指向要发生变化。

vecter.asm部分程序如下:

a) 原程序的vecter.asm部分程序:

b) 产生Bootload数据的程序的vecter.asm部分程序:

以上程序中,程序a)开始是指向c_int00,程序b)为指向_boot,即.boot_load()的人口。这是因为在1 kB的程序复制完成后,程序即开始执行。首先应执行二次boot程序,即入口点_boot,完成二次boot后,再执行正常的初始化C语言环境代码,进而跳转到用户main函数。此时生成的.out的文件,通过hex6x.exe转化成可烧写的数据。

2.3 转换数据的配置文件boot.cmd

通过hex6x.exe可以把boot.out文件转化成boot.hex形式,方便烧写到Flash存储器中。此时Boot.cmd的也要做相应的变化,把中断向量表的程序同.boot_load程序,程序段,数据段一样转化过来。

boot.cmd配置程序如下:

a) 没有考虑中断向量表的boot.cmd配置:


b) 考虑中断向量表boot.cmd配置:

以上程序中len可以根据实际程序的长度进行修改,如果用hex6x.exe boot.cmd进行转化,程序长度过短时,会产生警告提示。此时可以查看map文件,看看程序和数据占用的空间来定len的大小,只要len大于实际的程序长度即可。Romwidth根据所用的Flash存储器的位数来定,如果是8位的就写8,如果是16位的就换成16。以上程序中,程序b)与程序a)不同的是加入了.vectors,使得生成的boot.hex文件中0x0000 0000地址就为vectors的程序。此时生成的*.hex的文件可以烧写到Flash中。

3 结束语

本文以TI公司高性能DSP TMS320C6000系列芯片为例,介绍了从Flash存储器进行引导,带中断向量表的二次Bootloader的新途径,其中对Bootloader的程序需要改写的部分详细叙述了具体的差别,从而为TMS320C6000系列DSP的开发提供了一种新的思路。该方法简单可行,在TI公司提供的文档上,只要稍做修改就可以得到正确的结果,该方法已在实际工程中得到具体应用,系统性能稳定。一般情况下中断向量表的首地址都为0x0000 0000,如果中断向量表没有设在0x0000 0000地址时,要对boot_c671x_2.s62文件中ISTP进行设置,此时vectors就不需要放在1 kB的数据中,而是在1 kB的程序空间中指向vectors的初地址。

关键字:程序  中断  指令  存储 引用地址:TMS320C6000系列二次Bootloader的设计与实现

上一篇:ADSP-TS201的系统设计及外部总线接口技术
下一篇:TMS320C6000系列二次Bootloader的设计与实现

推荐阅读最新更新时间:2024-05-02 20:37

i2c总线AT24C02存储器读写程序
#include reg52.h #define uint unsigned int //定义unsigned int 为uint #define uchar unsigned char //定义unsigned char 为uchar #define uchar unsigned char //定义unsigned char 为uchar #define uint unsigned int //定义unsigned int 为uint sbit sda=P3^3;//定义I2C数据线 sbit scl=P3^2;//定义I2C时钟线 void delay2()//延迟6us函数 {;;;} void start()//I2C开始
[单片机]
51单片机执行指令的过程
51单片机执行指令的过程 单片机执行程序的过程,实际上就是执行我们所编制程序的过程。即逐条指令的过程。计算机每执行一条指令都可分为三个阶段进行。即取指令-----分析指令-----执行指令。 取指令的任务是:根据程序计数器PC中的值从程序存储器读出现行指令,送到指令寄存器。 分析指令阶段的任务是:将指令寄存器中的指令操作码取出后进行译码,分析其指令性质。如指令要求操作数,则寻找操作数地址。 计算机执行程序的过程实际上就是逐条指令地重复上述操作过程,直至遇到停机指令可循环等待指令。 一般计算机进行工作时,首先要通过外部设备把程序和数据通过输入接口电路和数据总线送入到存储器,然后逐条取出执行。但单片机中的程序一般事先我们都已通过写入器
[单片机]
STM8 自带 BootLoader 串口烧录程序
一、进入BootLoader模式 根据STM8的资料可以知道,进入BootLoader的方法只有两种: 空芯片(Flash首地址内容不是0x82或0xAC),上电后即可进入BootLoader模式。 OPTION配置参数地址 487Eh = 0x55 , 787Fh = 0xAA,复位后会进入BootLoader模式。 二、写入OPTION配置参数 通过Flash写入的方式将地址 487Eh 和 787Fh写入0x55和0xAA即可,通过MCU执行一次Flash写入。 1、使用库函数 此方法只适用于可以使用库函数的MCU,记得引用库的头文件 stm8s_flash.h,若MCU不能使用库函数可以使用寄存器方法。 /
[单片机]
STM8 自带 BootLoader 串口烧录<font color='red'>程序</font>
STM32F030 中断太频繁导致死机
最近在忙一个项目,使用了STM32F030的单片机,定时器用系统定时器,每10us中断一次。在程序少的时候,没有发现死机情况,但是随着功能的丰富,经常出现死机问题,具体表现为while(1)循环无法执行,但是中断函数正常或者按键不起作用,程序直接跑分。这时我认为是死机,即程序跑分,但是有时中断正常,这就证明程序依然正常运行,可能是其它原因造成。 首先,我怀疑是I2C读写DSP出错,于是屏蔽掉DSP初始化,刚开始正常,多开机几次就又不正常了,所以排除写DSP。 接着,我怀疑读Flash出错,也发现仿真时,有时读Flash,就假死在那儿,于是就又把读Flash屏蔽掉,发现程序又正常了许多,但是多开机几次就又出现假死,所以又排除写Fla
[单片机]
具无痕迹存储器和篡改检测功能的低功耗安全管理器
      Maxim推出安全管理器MAX36051。器件具有128字节无痕迹存储器,可安全存储敏感数据,待机模式下消耗极低的电池电流(1.5µA)。内部篡改监视电路和篡改检测输入连接至外部传感器,为终端用户提供极高的系统安全等级。该器件具有超低功耗,可理想用于小容量电池供电系统。MAX36051非常适合需要篡改检测、安全存储数据并且要求超低功耗的应用,例如安全USB、电表和销售终端(POS)。       MAX36051能够以超低功耗提供篡改检测功能,与电源无关。片内电池备份控制器持续监测主电源(VCC),当主电源电压过低或未连接主电源时,自动切换至电池(VBAT)供电。为进一步降低电池损耗,该款安全管理器还具有多种
[电源管理]
具无痕迹<font color='red'>存储</font>器和篡改检测功能的低功耗安全管理器
STM32程序添加printf后无法运行的解决方法
标准库函数的默认输出设备是显示器,要实现在串口或LCD输出,必须重定义标准库函数里调用的与输出设备相关的函数. 例如:printf输出到串口,需要将fputc里面的输出指向串口(重定向),方法如下: #ifdef __GNUC__ /* With GCC/RAISONANCE, small printf (option LD Linker- Libraries- Small printf set to 'Yes') calls __io_putchar() */ #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #else #define PUTCHAR_P
[单片机]
万业企业离子注入机启动12英寸芯片制造与存储器工厂认证
6月16日晚间,万业企业(600641.SH)就上交所年报问询进行了回复,进一步说明公司向集成电路领域转型的实施情况及产品进展等内容。公告显示,国内重要的12英寸晶圆芯片制造厂及存储器芯片设计制造厂已对万业企业旗下凯世通集成电路离子注入设备启动认证程序,万业企业集成电路前道装备业务获得巨大突破。 鉴于目前国际形势,芯片国产化需求日益迫切,在国内集成电路制造厂尽可能采购国内设备的背景下,凯世通的集成电路低能大束流离子注入机在国内市场的需求正逐步放大。凯世通客户的上游企业(国内知名的芯片设计公司)、重要的12英寸晶圆芯片制造厂及存储器芯片设计制造厂正在对凯世通设备进行认证,并尽快投入工厂端的测试验证,助力凯世通尽快完成验证工作。一旦验
[手机便携]
PIC12F508A一个开关控制一个灯的亮灭程序
PIC12F508A一个开关控制一个灯的亮灭程序,默认开机全部不亮。 /* * File: main.c * Author: li fengjun * 开发环境:MPLAB X IDE v4.15 * 操作系统:Windows 10 * NAME:PIC12F509A_LED3_Light * 功能:点亮LED的记忆控制程序,K1控制LED2长亮,再按一下K1控制LED2灭。(锁存) * 日期: 20210701, 09:16 */ #include xc.h #include stdint.h // CONFIG #pragma config OSC = IntRC // Oscillator S
[单片机]
小广播
最新嵌入式文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved