DSP C6713 EMIF FLASH 启动
本文只是粗略描述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 = 00000800h
FLASH_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.h62
COPY_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 led
mvkl GPIO_EN,A4
|| mvkl GPIO_EN_V,B4
mvkh GPIO_EN,A4
|| mvkh GPIO_EN_V,B4
stw B4,*A4
mvkl GPIO_DIR,A4
|| mvkl GPIO_DIR_V,B4
mvkh GPIO_DIR,A4
|| mvkh GPIO_DIR_V,B4
stw B4,*A4
mvkl GPIO_VAL,A4
|| mvkl GPIO_VAL_V,B4
mvkh GPIO_VAL,A4
|| mvkh GPIO_VAL_V,B4
stw B4,*A4
;************************************************************************
;* CONFIGURE EMIF
;************************************************************************
;****************************************************************
; *EMIF_GCTL = EMIF_GCTL_V;
;****************************************************************
mvkl EMIF_GCTL,A4
|| mvkl EMIF_GCTL_V,B4
mvkh EMIF_GCTL,A4
|| mvkh EMIF_GCTL_V,B4
stw B4,*A4
;****************************************************************
; *EMIF_CE0 = EMIF_CE0_V
;****************************************************************
mvkl EMIF_CE0,A4
|| mvkl EMIF_CE0_V,B4
mvkh EMIF_CE0,A4
|| mvkh EMIF_CE0_V,B4
stw B4,*A4
;****************************************************************
; *EMIF_CE1 = EMIF_CE1_V (setup for 8-bit async)
;****************************************************************
mvkl EMIF_CE1,A4
|| mvkl EMIF_CE1_V,B4
mvkh EMIF_CE1,A4
|| mvkh EMIF_CE1_V,B4
stw 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 sections
mvkl COPY_TABLE, A3
mvkh COPY_TABLE, A3
;; B3 = entry_point, such as _c_init00
ldw *A3++, B3
copy_section_top:
ldw *a3++, b0 ; byte count
;ldw *a3++, b4 ; load flash start (load) address
ldw *a3++, a4 ; ram start address
nop 3
[!b0] b copy_done ; have we copied all sections?
nop 5
copy_loop:
;ldb *b4++,b5
ldb *A3++, B5
sub b0,1,b0 ; decrement counter
[ b0] b copy_loop ; setup branch if not done
[!b0] b copy_section_top
zero a1
[!b0] and 3,a3,a1
stb 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 B3
nop 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 = 0x00000800
L2SRAM : o = 0x00001000 l = 0x0002F000
L2CACHE : o = 0x00030000 l = 0x00010000
FLASH_BOOT : o = 0x90000000 l = 0x00000400
FLASH_REST : o = 0x90000400 l = 0x000FFB00
SRAM : 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启动。