DM642启动过程分析

供所有C6000系列DSP开发者参考。【TI关于C6000 bootloader 文档

DM642复位后,芯片先从CE1空间读取1K字节的数据到内部SRAM,然后从地址0开始运行。因为一般的程序都远远大于1K字节,所以一般都是有一个二级bootloader,用它来加载主程序。Bootloader运行完后调用c_int00()来进行C运行时刻初始化,如堆栈,静态变量等,之后会调用BIOS_init,最后开始运行main函数,main函数结束后DSP/BIOS的任务管理器开始运行。

具体实现起来时要稍复杂一些,因为有一些实际问题需要考虑。
1.外部存储器一般是NOR Flash,容量较大时,因为DM642的CE1只有1MB空间,需要使用GPIO配合的分页模式。因为GPIO的缺省值是输入,内有上拉电阻,所以bootloader需要写在最高页。DM642复位后采用最慢的读写时序。
2.Bootloader需要在有限的1K字节内完成SDRAM初始化,并将主程序搬运到内存中然后开始运行。TI的例子是用汇编写的,因为此时c的运行环境还没有初始化。其中最关键的是栈指针没有初始化,我们给它赋值后其他部分就可以用c来写,但要注意仍不能使用c库函数。

汇编部分进行栈指针初始化:

_boot_sp:
mvk  .S2 0x0600, B15
mvkl .S2 _boot_loader, B0
mvkh .S2 _boot_loader, B0
b    .S2 B0
nop   5

 

boot.c进行EMIF初始化,并分段将主程序从Flash读入SDRAM

 

#pragma CODE_SECTION(boot_loader, ".boot_load");

void boot_loader(){
    Uint32 program_addr,size;
    Uint8* src,*dest;

    program_addr=0x90000404;//First Entry
 
    //Init the EMIF interface
    EMIFA_GCTL     = 0x00052060; 
    EMIFA_CE0      = 0x00000040; 
    EMIFA_CE1      = 0x21E28E01;  //0x11518a01
    EMIFA_CE2      = 0xffffffd3; 
    EMIFA_CE3      = 0xffffffd3; 
    EMIFA_SDRAMCTL = 0x6b228000; 
    EMIFA_SDRAMTIM = 0x000003A9; 
    EMIFA_SDRAMEXT = 0x000505cd; 
    EMIFA_CE0SECCTL= 0x00000071; 
    EMIFA_CE1SECCTL= 0x00000002; 
    EMIFA_CE2SECCTL= 0x00000002; 
    EMIFA_CE3SECCTL= 0x00000002; 
   
    //Load Second Bootloader to SDRAM
    size=*(Uint32*)program_addr;
    while(size){   
       program_addr+=4;
       dest=(Uint8*)(*(Uint32*)program_addr);
       program_addr+=4;
       src=(Uint8*)program_addr;
       program_addr+=size;
       if(size%4)program_addr+=4-(size%4);
       while(size--){*dest++=*src++;}
       size=*(Uint32*)program_addr;
    }

    c_int00();//Run the Second Bootloader

 

 

3.经常遇到的问题是bootloader调试时运行正常,写到flash就启动不了。这里的区别在于调试时CCS负责将程序装载到内存中,然后程序直接从c_int00()开始运行,而烧到flash就得一切靠自己了。调试这个问题的办法是CCS加载程序后,先查看内存0地址处,是否是bootloader的代码,如果不对就是linker的cmd文件或DSP/BIOS内存设置有问题,需要将bootloader放在片内SRAM中。然后让程序从0地址开始运行,看主程序是否正确地加载到内存中。
.boot_load{
  boot_sp.obj
  boot.obj
}>BOOT_RAM
BOOT_RAM是起始地址为0,长度1K的内部SRAM空间。
4.bootloader调试完毕后就是烧写到flash。先用TI的Hex6x将输出转换成hex文件,然后用flashburn或自己的代码烧写。Flash的头1K字节是bootloader,然后是主程序的代码段。代码的格式可以参见boot.c
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
前段时间做一个基于TITMS320DM642芯片的项目,主要应用是针对视频图像做一些处理和机械控制。后来因为一些原因,项目中止。因为硬件是我一个人独力设计完成(从项目规划、原理图设计、PCB设计到样机焊接、小系统调试),中间投入了很多精力和感情,不想它被抛弃,尤其是其中的设计理念。声明:仅供学习参考使用,请勿用于商业用途! 初学电子的时候总找不到好的学习资料和学习教程,很渴望能有一个完整的项目做学习用却总找不到,即使找到了也是八九十年代的“老”设计,缺乏实用性、完整性和规范性。而这个基于TM320DM642芯片的项目可以说是很适合刚接触电子的人做学习参考用的。 原因如下: 1、DM642是TI公司2002年投入到市场的DSP芯片,被广泛应用于视频处理领域,是民用DSP中最高端的DSP之一。其周边器件应用和系统设计思路可以说具有很强的时代代表性。 2、项目设计过程中先编写了开发方案计划书,然后经过了严谨的计算、原理图仿真、CPLD逻辑仿真和PCB关键信号拓扑仿真,为设计成功提供了有力保障。整个过程能体现出一个完整的产品设计思路和开发流程。 3、设计过程中对PROTEL99SE的功能可以说挖掘的比较充分,对学习PROTEL的工程师来说应当是一份很不错的参考资料,包括层次原理图设计、设计规则的设定及使用、各种自动检测功能的使用及平面分割等PROTEL使用教程里很少见到的应用。(当然,使用PROTEL做DSP项目开发还是很不方便的,如果使用PADS或CADENCE要方便很多。) TMS320DM642开发板设计分析+说明: 我将这个项目稍做了一些修改和整理,做为一个完整的项目共享出来供大家做学习参考用。这个板子小系统及IIC我已经调试成功,并且编写了一些小程序烧到FLASH中实现了自启动。后面的视频输入输出芯片应用因为涉及很多的视频码流协议,需要牵扯很大的精力,所以没有再进一步调试。 虽然只是四层板(DM642开发板为8层板),不过系统很稳定。将单板上的四个钽电容全部拆下(5V供电处钽电容没有拆),DSP内核运行在600M(用的-600的型号)、EMIF时钟超频到150M(SDRAM用的-7后缀芯片,数据手册标名SDRAM和DSP建议应用上限为133M),长时间跑程序很正常,观察SDRAM内容没有发现过错误数据。 如果需要的话可以自己将其中的PCB图直接发给厂商做学习板,毕竟现在DM642开发板的价格还是在万元左右。当然,设计中也存在很多缺陷,比如原理图ERC检测过程中会报很多端口类型连接错误等,这是原理图库建库不规范导致的。这些地方我没有做更改,把它一并发给大家,也让大家有一些意识,而且在里面找错应当也是一件比较有趣的事呵。 后面我将在自己的BLOG里针对这个设计陆续整理登出完整的设计相关资料(大概需要半月到一个月时间吧)。主要是设计思路和步骤以及仿真介绍等整个流程。 另外如果您发现设计中的错误或缺陷,或者能针对这个设计提供相应的程序,还望能网易博客https://blog.163.com/zjd01@126留言,好让其他人也能及早发现其中的错误并学到更多东西。 附件内容截图:

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值