TMS320C6713 DSP的Flash烧录与BootLoader程序设计

需积分: 27 13 下载量 88 浏览量 更新于2024-08-23 3 收藏 836KB PDF 举报
"基于TMS320C6713的Flash烧写及BootLoad程序设计" 本文主要探讨的是在基于TMS320C6713 DSP的系统中如何实现Flash烧写和BootLoader程序的设计。TMS320C6713是Texas Instruments(TI)公司的一款高性能数字信号处理器,常用于需要离线运行的应用中。在这样的系统中,BootLoader扮演着至关重要的角色,因为它负责在系统启动时自动将程序代码从外部Flash存储器加载到DSP的内部存储器中执行。 BootLoader是系统启动的第一段软件,它的主要任务包括初始化硬件环境、设置堆栈、检测和校验存储器、以及加载操作系统或应用程序。对于TMS320C6713 DSP来说,BootLoader的设计和实现直接影响系统的可靠性和启动速度。 文章中提到,设计了一种方法,通过主机利用仿真器连接JTAG(Joint Test Action Group)接口来实现对DSP外部配置的Flash存储器(如SST39VF800A)的在线编程。JTAG是一种标准接口,广泛用于芯片测试和调试,它允许主机与目标设备进行通信,进行编程和故障排查。 在实际操作中,该方法涉及到了特定的命令文件和用户引导程序的编写。命令文件包含了对Flash进行操作的各种指令,而用户引导程序则是BootLoader的核心部分,它负责控制代码的加载和执行。文章提供了这些关键组件的示例文件和部分源代码,以便读者理解和实现类似的功能。 此外,文章还提到了“并行自举”这一概念,这可能是指通过并行接口进行的BootLoader过程,它能快速高效地将程序加载到DSP中。并行自举通常比串行加载方式更快,但需要更复杂的硬件支持。 这篇论文深入解析了TMS320C6713 DSP的BootLoader设计和Flash编程过程,为开发者提供了一套实用的技术方案,有助于提高系统的可靠性和性能。对于从事DSP应用开发的工程师来说,理解并掌握这些技术细节至关重要。
2011-02-22 上传
/********************************************************************************\ \* 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 *\ \********************************************************************************/