DSP C6713 EMIF FLASH 启动
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 启动相关推荐
- DSP从flash启动
TI的资料上的说明如下: 位于CE1空间的ROM中的代码首先通过DMA/EDMA被搬入地址0处.加载过程在复位信号撤消之后开始,此时CPU内部保持复位状态,由DMA/EDMA执行1个单帧的数据块传输. ...
- DSP no boot模式启动调试
1 JTAG调试ARM/DSP/FPGA芯片简介 在CPU外围,处理器内部包含了JTAG的硬件实现,并且向外界提供接口,即TMS.TCK.TDI.TDO四个引脚. TCK:时钟信号,为TAP的操作提 ...
- DSP的EMIF接口通信FPGA
DSP通过EMIF接口与FPGA通信采集视频 背景 使用FPGA系统进行视频采集,DSP进行视频处理需要了解以下知识: 1. DSP-C6000系列的中断与GPIO系统 2. DSP-C6000系 ...
- DM365视频处理流程/DM368 NAND Flash启动揭秘
DM365的视频处理涉及到三个相关处理器,分别是视频采集芯片.ARM处理器和视频图像协处理器(VICP),整个处理流程由ARM核协调.视频处理主要涉及三个处理流程,分别是视频采集.视频编码和对编码后的 ...
- DSP通过EMIF接口与FPGA通信采集视频
DSP通过EMIF接口与FPGA通信采集视频 背景 使用FPGA系统进行视频采集,DSP进行视频处理需要了解以下知识: 1. DSP-C6000系列的中断与GPIO系统 2. DSP-C6000系 ...
- DM368 NAND Flash启动揭秘
http://ti.eetop.cn/viewnews-4427 DM368 NAND Flash启动揭秘 排行榜 收藏 打印 发给朋友 举报发布者:vipjph 热度180票 浏览1745次 [共 ...
- S3C2440的内存情况在NAND FLASH或者NOR FLASH启动的情况下
1,从NANDFLASH启动时,在ARM上电时,ARM会自动把NANDFLASH前4K的内容拷贝到S3C2440内部SRAM中,同时把SRAM的地址映射到0X00000000.ARM上电后会从SRAM ...
- idea 升级到2020后 无法启动_i.MXRT软复位后无法从32MB Flash启动?
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是i.MXRT上使用16MB以上NOR Flash软复位无法正常启动问题的分析解决经验. 痞子衡这几天在支持一个i.MXRT1050客户项 ...
- nor flash启动与nand flash启动的区别
1)接口区别: NOR FLASH地址线和数据线分开,来了地址和控制信号,数据就出来.类似于memory的随机访问方式,在nor flash上可以直接运行程序, NAND Flash地址线和数据线在一 ...
最新文章
- php在dw中设置按钮圆角,Dreamweaver怎么用CSS制作圆角按钮?
- mysql 5.7 解决 set global slow_query_log=on;报错
- PCA主成分分析以及Python实现(阅读笔记)
- php地图,地图php接口
- WZK的排名(jzoj 1995)
- 计算机专业直接工作简历,2017计算机专业工作简历
- Silverlight Gantt甘特图项目管理解决方案
- oracle报错查询动态视图,oracle基表和动态性能视图
- 蓝桥杯 ALGO-80 算法训练 整数平均值
- php curl exec 返回值,php curl_exec函数返回false的解决方法
- Python socket粘包解决
- ubuntu16.04 Detectron目标检测库配置(包含GPU驱动,Cuda,Caffee2等配置梳理)
- Mathcad tips_学习笔记
- [ 江枫]关于ORA_ROWSCN
- 计算机快捷键大全常见的,电脑快捷键大全_计算机常用技巧
- python列表拆包_python元组拆包
- 基于Transformer的文本情感分析编程实践(Encoder编码器-Decoder解码器框架 + Attention注意力机制 + Positional Encoding位置编码)
- 赛门铁克Symantec SSL证书产品及服务
- 计算机蓝牙快捷键,如何打开Windows10笔记本电脑的蓝牙,快捷键打开笔记本电脑的蓝牙!...
- 耳机插入听不到声音或者对方听不见你说话问题
热门文章
- 谈一谈|创新创业训练营结业思考分享
- JavaScript常用算法(面试)------Sestid
- 一个40岁老程序员的前端学习之路|2021 年中总结
- 关于Ubuntu18.04安装Coreform Cubit出现Segmentation fault (core dumped)问题的解决
- 2009年100款最佳安全工具(图)
- sysctl 之内存释放及磁盘优化
- 如何理解抽样估计中的无偏性、有效性和一致性
- springside showcase mysql_搭建SpringSide示例showcase的eclipse运行环境
- linux ora 00911,ORA-00911: 无效字符
- 《Java异常处理(超级详细)》