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启动

6.烧录工具

C6713 EMIF FLASH镜像生成工具

  • 3
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
/********************************************************************************\ \* DEC6713_FLASH.c V2.00 *\ \* Copyright 2004 by SEED Electronic Technology LTD. *\ \* All rights reserved. SEED Electronic Technology LTD. *\ \* Restricted rights to use, duplicate or disclose this code are *\ \* granted through contract. *\ \* Designed by: Hongshuai.Li \* Discription: Erase, write and read the whole chip. \* Date: Modified 05.10.2005 *\ \********************************************************************************/ #include #include #include #include #include #include #include "DEC6713_FLASH.h" #include /********************************************************************************/ Uint32 i; Uint16 TempData; Uint32 Src_StartAdd; Uint32 Dst_StartAdd; extern far void vectors(); /********************************************************************************/ /********************************************************************************/ void main() { Src_StartAdd = 0x90000000; /* Initialize CSL, must when using. */ CSL_init(); /* Initialize DEC6713 board. */ DEC6713_init(); /* Configure interrupt. */ IRQ_setVecs(vectors); IRQ_nmiEnable(); IRQ_globalEnable(); /* Erase flash memory. */ Flash_Erase(0x90000000,0x10); printf("\nErase flash ok."); /* Write flash memory. */ for(i=0;i<0x40000;i++) { Flash_Writes(Src_StartAdd+2*i,fmod(i,0x10000)); } printf("\nWrite flash ok."); /* Read flash memory. */ for(i=0;i<0x40000;i++) { TempData = Flash_Reads(Src_StartAdd+2*i); if(TempData != fmod(i,0x10000)) { printf("\n Testing is Failure!"); printf("\nAddress 0x%x is error!",i); exit(0); } } printf("\nOpereation is success."); } /********************************************************************************\ \* Flash function difine. *\ \********************************************************************************/ /********************************************************************************\ \* Flash erase function. *\ \********************************************************************************/ Uint32 Flash_Erase(Uint32 addr,Uint16 type) { Uint32 i,j; *FLASH_5555 = FLASH_UL1; //first *FLASH_2AAA = FLASH_UL2; //second *FLASH_5555 = FLASH_UL3; //third *FLASH_5555 = FLASH_UL4; *FLASH_2AAA = FLASH_UL5; switch(type) { case 0x50: //block erase *(Uint16 *)addr = type; while((*(Uint16 *)addr & 0x80) != 0x80); for(i = 0; i < BLOCK_SIZE; i++) { if(*(Uint16 *)(addr + i) != 0xffff) { j = 0; break; } } j = 1; break; case 0x30: //sector erase *(Uint16 *)addr = type; while((*(Uint16 *)addr & 0x80) != 0x80); for(i = 0; i < SECTOR_SIZE; i++) { if(*(Uint16 *)(addr + i) != 0xffff) { j = 0; break; } } j = 1; break; case 0x10: //chip erase // for(;;) // { *FLASH_5555 = type; // } while((*FLASH_5555 & 0x80) != 0x80); for(i = 0; i < CHIP_SIZE; i++) { if(*(Uint16 *)(addr + i) != 0xffff) { j = 0; break; } } j = 1; break; default: break; } return (j); } /********************************************************************************\ \* Write a single data. *\ \********************************************************************************/ void Flash_Writes(Uint32 addr,Uint16 data) { //Uint16 TempData=0; *FLASH_5555 = FLASH_UL1; *FLASH_2AAA = FLASH_UL2; *FLASH_5555 = FLASH_PROGRAM; //for(;;) //{ *(Uint16 *)addr = data; //TempData = *(Uint16 *)(addr); //} //TempData = *(Uint16 *)(addr); while(*(Uint16 *)addr != data); } /********************************************************************************\ \* Write the certain length data. *\ \********************************************************************************/ void Flash_Writem(Uint32 addr,Uint16 *ptr,Uint32 length) { Uint32 i; for(i = 0; i < length; i++) { // for(;;) // { Flash_Writes(addr+2*i,*(ptr+i)); // } } } /********************************************************************************\ \* Read a single data. *\ \********************************************************************************/ Uint32 Flash_Reads(Uint32 addr) { return (*(Uint16 *)addr); } /********************************************************************************\ \* Read the certain length data. *\ \********************************************************************************/ void Flash_Readm(Uint32 addr,Uint16 *ptr,Uint32 length) { Uint32 i; for(i = 0; i < length; i++) { *(ptr + i) = Flash_Reads(addr+2*i); } } /********************************************************************************\ \* End of DEC6713_FLASH.C *\ \********************************************************************************/
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值