DSP C6713 EMIF FLASH 启动

  • 1. 启动流程
  • 2.程序设计
  • 3.BOOTMODE
  • 4.程序编码
    • 4.1 BootLoader工程
    • 4.2 App工程
    • 4.3 FLASH烧写工程
  • 5. 生成image文件
  • 6.烧录工具

本文只是粗略描述6713的FLASH启动流程,如果想要探究其中细节,可以参考我的另一篇文章 DSP芯片TMS320C6678的emif挂载norflash启动

1. 启动流程

参考《tms320c6713b》page 98。
6713默认从EMIF片选为CE1的存储器中读取1K-Byte的代码运行。代码必须是大端模式。

2.程序设计

为了避免程序大于1K-Byte,导致无法正常启动。需要建立两个工程,将程序分为两部分。
1)BootLoader
为了使程序小于1K-Byte,使用汇编来初始化6713芯片,并将APP代码拷贝到指定内存区域中运行。
2)APP
在BootLoader之后进一步初始化6713各个功能,并执行相应的任务。

3.BOOTMODE

参考《TMS320C6713B》page 33。

由上图可知,HD[4:3]用于配置启动模式,根据自己的实际情况配置。我配置的是 10 。

4.程序编码

为了实现emif启动,我创建了3个工程:BootLoader工程,APP工程,还有一个FLASH烧写工程。

4.1 BootLoader工程

BootLoader工程需要的.cmd文件如下,因为没有C语言,因此很多段都不需要定义。当仿真器下载调试使用时,打开上面的注释,当编写镜像文件时需要打开下面的注释。在BootLoader中,使用GPIO点亮了一个led灯,以此判断BootLoader是否正常启动运行。

MEMORY
{BOOTRAM:       o = 00000000h   l = 00000800hFLASH_BOOT:    o = 0x90000000  l = 00000800h}SECTIONS
{/*挂载仿真器使用*/.boot_load : > BOOTRAM/*编写镜像文件使用*///.boot_load : load = FLASH_BOOT, run = BOOTRAM
}

下面是boot_c671x.s62,先是拉低GPIO15来点亮一个led,然后copy App代码并跳转。


;  ======== boot_c671x.s62 ========
;.title  "Flash bootup utility".option D,T.length 102.width  140; global EMIF symbols defined for the c671x family.include        boot_c671x.h62COPY_TABLE    .set        90030000h.sect ".boot_load".global _boot.global _text_size.global _text_ld_start.global _text_rn_start;.ref _c_int00      _boot:
;************************************************************************
;* DEBUG LOOP -  COMMENT OUT B FOR NORMAL OPERATION
;************************************************************************; configure GPIO 15 low to light ledmvkl  GPIO_EN,A4||    mvkl  GPIO_EN_V,B4mvkh  GPIO_EN,A4||    mvkh  GPIO_EN_V,B4stw   B4,*A4mvkl  GPIO_DIR,A4    ||    mvkl  GPIO_DIR_V,B4mvkh  GPIO_DIR,A4||    mvkh  GPIO_DIR_V,B4stw   B4,*A4mvkl  GPIO_VAL,A4    ||    mvkl  GPIO_VAL_V,B4mvkh  GPIO_VAL,A4||    mvkh  GPIO_VAL_V,B4stw   B4,*A4;************************************************************************
;* CONFIGURE EMIF
;************************************************************************;****************************************************************; *EMIF_GCTL = EMIF_GCTL_V;;****************************************************************mvkl  EMIF_GCTL,A4    ||    mvkl  EMIF_GCTL_V,B4mvkh  EMIF_GCTL,A4||    mvkh  EMIF_GCTL_V,B4stw   B4,*A4;****************************************************************; *EMIF_CE0 = EMIF_CE0_V;****************************************************************mvkl  EMIF_CE0,A4       ||    mvkl  EMIF_CE0_V,B4     mvkh  EMIF_CE0,A4||    mvkh  EMIF_CE0_V,B4stw   B4,*A4;****************************************************************; *EMIF_CE1 = EMIF_CE1_V (setup for 8-bit async);****************************************************************mvkl  EMIF_CE1,A4       ||    mvkl  EMIF_CE1_V,B4mvkh  EMIF_CE1,A4||    mvkh  EMIF_CE1_V,B4stw   B4,*A4;****************************************************************; *EMIF_CE2 = EMIF_CE2_V (setup for 32-bit async);****************************************************************;****************************************************************; *EMIF_CE3 = EMIF_CE3_V (setup for 32-bit async);****************************************************************;****************************************************************; *EMIF_SDRAMCTL = EMIF_SDRAMCTL_V;****************************************************************;****************************************************************; *EMIF_SDRAMTIM = EMIF_SDRAMTIM_V;****************************************************************;****************************************************************; *EMIF_SDRAMEXT = EMIF_SDRAMEXT_V;****************************************************************;****************************************************************************
; copy sections
;****************************************************************************;; Copy sectionsmvkl   COPY_TABLE, A3mvkh  COPY_TABLE, A3;; B3 = entry_point, such as _c_init00ldw        *A3++, B3copy_section_top:ldw   *a3++, b0     ; byte count ;ldw   *a3++, b4     ; load flash start (load) address ldw   *a3++, a4     ; ram start addressnop   3             [!b0]  b copy_done         ; have we copied all sections?nop   5copy_loop:;ldb   *b4++,b5      ldb     *A3++, B5sub   b0,1,b0       ; decrement counter[ b0]  b     copy_loop     ; setup branch if not done[!b0]  b     copy_section_topzero  a1[!b0]  and   3,a3,a1stb   b5,*a4++[!b0]  and   -4,a3,a5      ; round address up to next multiple of 4[ a1]  add   4,a5,a3       ; round address up to next multiple of 4;****************************************************************************
; jump to entry point
;****************************************************************************
copy_done:b    .S2 B3nop   5

下面是c6713_emif.s62,变量值定义

;
;  ======== c6713_emif.s62 ========
;.title  "Flash bootup utility"; global EMIF symbols defined for the c671x family.include        boot_c671x.h62;EMIF Register Addresses for c671x family
EMIF_GCTL       .equ  0x01800000  ;EMIF global control
EMIF_CE1        .equ  0x01800004  ;address of EMIF CE1 control reg.
EMIF_CE0        .equ  0x01800008  ;EMIF CE0control
EMIF_CE2        .equ  0x01800010  ;EMIF CE2control
EMIF_CE3        .equ  0x01800014  ;EMIF CE3control
EMIF_SDRAMCTL   .equ  0x01800018  ;EMIF SDRAM control
EMIF_SDRAMTIM   .equ  0x0180001c  ;EMIF SDRAM timer
EMIF_SDRAMEXT   .equ  0x01800020  ;EMIF SDRAM extension
GPIO_EN         .equ  0x01b00000
GPIO_DIR        .equ  0x01b00004
GPIO_VAL        .equ  0x01b00008; EMIF Register Values specifically for 6713 DSK
EMIF_GCTL_V     .equ  0x00000078  ;
EMIF_CE0_V      .equ  0x02208822  ;EMIF CE0 SDRAM
EMIF_CE1_V      .equ  0x02208812  ;EMIF CE1 Flash 8-bit
EMIF_CE2_V      .equ  0x22a28a22  ;EMIF CE2 Daughtercard 32-bit async
EMIF_CE3_V      .equ  0x22a28a22  ;EMIF CE3 Daughtercard 32-bit async
EMIF_SDRAMCTL_V .equ  0x47115000  ;EMIF SDRAM control
EMIF_SDRAMTIM_V .equ  0x00000578  ;SDRAM timing (refresh)
EMIF_SDRAMEXT_V .equ  0x000a8529  ;SDRAM extended control
GPIO_EN_V       .equ  0x00008000
GPIO_DIR_V      .equ  0x00008000
GPIO_VAL_V      .equ  0x00000000

下面是boot_c671x.h62,声明了上述变量为外部引用。

;
;  ======== boot_c671x.h62 ========
;.if ($isdefed("BOOT_C671X_") = 0)  ; prevent multiple includes of this file
BOOT_C671X_ .set    1; EMIF Register Addresses for c671x family         .global EMIF_GCTL         ;EMIF global control.global EMIF_CE1          ;address of EMIF CE1 control reg..global EMIF_CE0          ;EMIF CE0control.global EMIF_CE2          ;EMIF CE2control.global EMIF_CE3          ;EMIF CE3control.global EMIF_SDRAMCTL     ;EMIF SDRAM control.global EMIF_SDRAMTIM     ;EMIF SDRAM timer.global EMIF_SDRAMEXT     ;EMIF SDRAM extension.global GPIO_EN.global GPIO_DIR.global GPIO_VAL; EMIF Register Values for c671x family.global EMIF_GCTL_V       ;.global EMIF_CE0_V        ;EMIF CE0 SDRAM.global EMIF_CE1_V        ;EMIF CE1 Flash 8-bit.global EMIF_CE2_V        ;EMIF CE2 Daughtercard 32-bit async.global EMIF_CE3_V        ;EMIF CE3 Daughtercard 32-bit async.global EMIF_SDRAMCTL_V   ;EMIF SDRAM control.global EMIF_SDRAMTIM_V   ;SDRAM timing (refresh).global EMIF_SDRAMEXT_V   ;SDRAM extended control.global GPIO_EN_V.global GPIO_DIR_V.global GPIO_VAL_V.endif     ; if BOOT_C671X_ is not defined

我的BootLoader工程只有上面三个汇编文件和那个.cmd文件。注意要把工程的入口函数 entry-point symbol 改为汇编里的函数 _boot 。

4.2 App工程

App工程烧录在0x9003 0000地址处。下面是.cmd文件。

/** Copyright (C) 2003 Texas Instruments Incorporated* All Rights Reserved*/
/**---------test_c6713.cmd---------**//* Memory Map 0 - the default */
-c
-x
//-l rts6700.lib
-heap   0x400
-stack  0x400
MEMORY
{BOOT_RAM   :   o = 0x00000000 l = 0x00000800L2SRAM       :   o = 0x00001000 l = 0x0002F000L2CACHE      :   o = 0x00030000 l = 0x00010000FLASH_BOOT   :   o = 0x90000000 l = 0x00000400FLASH_REST   :   o = 0x90000400 l = 0x000FFB00SRAM     :   o = 0x80000000 l = 0x100000
}SECTIONS
{    .vector    >    L2SRAM.text       >   L2SRAM.csldata >    L2SRAM.stack    >   L2SRAM.far   >   L2SRAM.switch    >   L2SRAM.tables >   L2SRAM.data   >   L2SRAM.bss >   L2SRAM.sysmem    >   L2SRAM.cinit >   L2SRAM.const >   L2SRAM.cio    >   L2SRAM
}

4.3 FLASH烧写工程

此工程主要用于读取生成的.bin文件烧录到相应的FLASH地址中,并校验是否正确。

5. 生成image文件

工程编译生成的.out文件不能直接烧录到FLASH运行,需要转换成.bin文件烧写。当然,生成image文件不止一种方法,此处只是我使用的方法。
生成image文件需要工具如下:

一般情况下,双击trans.bat即可生成.bin文件和.map文件。更细节方面的问题可以参考我的另一篇文档DSP芯片TMS320C6678的emif挂载norflash启动。

6.烧录工具

C6713 EMIF FLASH镜像生成工具

DSP C6713 EMIF FLASH 启动相关推荐

  1. DSP从flash启动

    TI的资料上的说明如下: 位于CE1空间的ROM中的代码首先通过DMA/EDMA被搬入地址0处.加载过程在复位信号撤消之后开始,此时CPU内部保持复位状态,由DMA/EDMA执行1个单帧的数据块传输. ...

  2. DSP no boot模式启动调试

    1  JTAG调试ARM/DSP/FPGA芯片简介 在CPU外围,处理器内部包含了JTAG的硬件实现,并且向外界提供接口,即TMS.TCK.TDI.TDO四个引脚. TCK:时钟信号,为TAP的操作提 ...

  3. DSP的EMIF接口通信FPGA

    DSP通过EMIF接口与FPGA通信采集视频 背景 使用FPGA系统进行视频采集,DSP进行视频处理需要了解以下知识: 1.  DSP-C6000系列的中断与GPIO系统 2.  DSP-C6000系 ...

  4. DM365视频处理流程/DM368 NAND Flash启动揭秘

    DM365的视频处理涉及到三个相关处理器,分别是视频采集芯片.ARM处理器和视频图像协处理器(VICP),整个处理流程由ARM核协调.视频处理主要涉及三个处理流程,分别是视频采集.视频编码和对编码后的 ...

  5. DSP通过EMIF接口与FPGA通信采集视频

    DSP通过EMIF接口与FPGA通信采集视频 背景 使用FPGA系统进行视频采集,DSP进行视频处理需要了解以下知识: 1.  DSP-C6000系列的中断与GPIO系统 2.  DSP-C6000系 ...

  6. DM368 NAND Flash启动揭秘

    http://ti.eetop.cn/viewnews-4427 DM368 NAND Flash启动揭秘 排行榜 收藏 打印 发给朋友 举报发布者:vipjph 热度180票  浏览1745次 [共 ...

  7. S3C2440的内存情况在NAND FLASH或者NOR FLASH启动的情况下

    1,从NANDFLASH启动时,在ARM上电时,ARM会自动把NANDFLASH前4K的内容拷贝到S3C2440内部SRAM中,同时把SRAM的地址映射到0X00000000.ARM上电后会从SRAM ...

  8. idea 升级到2020后 无法启动_i.MXRT软复位后无法从32MB Flash启动?

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是i.MXRT上使用16MB以上NOR Flash软复位无法正常启动问题的分析解决经验. 痞子衡这几天在支持一个i.MXRT1050客户项 ...

  9. nor flash启动与nand flash启动的区别

    1)接口区别: NOR FLASH地址线和数据线分开,来了地址和控制信号,数据就出来.类似于memory的随机访问方式,在nor flash上可以直接运行程序, NAND Flash地址线和数据线在一 ...

最新文章

  1. php在dw中设置按钮圆角,Dreamweaver怎么用CSS制作圆角按钮?
  2. mysql 5.7 解决 set global slow_query_log=on;报错
  3. PCA主成分分析以及Python实现(阅读笔记)
  4. php地图,地图php接口
  5. WZK的排名(jzoj 1995)
  6. 计算机专业直接工作简历,2017计算机专业工作简历
  7. Silverlight Gantt甘特图项目管理解决方案
  8. oracle报错查询动态视图,oracle基表和动态性能视图
  9. 蓝桥杯 ALGO-80 算法训练 整数平均值
  10. php curl exec 返回值,php curl_exec函数返回false的解决方法
  11. Python socket粘包解决
  12. ubuntu16.04 Detectron目标检测库配置(包含GPU驱动,Cuda,Caffee2等配置梳理)
  13. Mathcad tips_学习笔记
  14. [ 江枫]关于ORA_ROWSCN
  15. 计算机快捷键大全常见的,电脑快捷键大全_计算机常用技巧
  16. python列表拆包_python元组拆包
  17. 基于Transformer的文本情感分析编程实践(Encoder编码器-Decoder解码器框架 + Attention注意力机制 + Positional Encoding位置编码)
  18. 赛门铁克Symantec SSL证书产品及服务
  19. 计算机蓝牙快捷键,如何打开Windows10笔记本电脑的蓝牙,快捷键打开笔记本电脑的蓝牙!...
  20. 耳机插入听不到声音或者对方听不见你说话问题

热门文章

  1. 谈一谈|创新创业训练营结业思考分享
  2. JavaScript常用算法(面试)------Sestid
  3. 一个40岁老程序员的前端学习之路|2021 年中总结
  4. 关于Ubuntu18.04安装Coreform Cubit出现Segmentation fault (core dumped)问题的解决
  5. 2009年100款最佳安全工具(图)
  6. sysctl 之内存释放及磁盘优化
  7. 如何理解抽样估计中的无偏性、有效性和一致性
  8. springside showcase mysql_搭建SpringSide示例showcase的eclipse运行环境
  9. linux ora 00911,ORA-00911: 无效字符
  10. 《Java异常处理(超级详细)》