在前面章节那些实验我们都是将程序烧写到芯片 RAM 中运行调试的,我们知道 RAM 中存储的东西在掉电后是会丢失的,也就是说程序烧入到 RAM 中运行,如果系统电源关闭后再开启,之前下载的程序是不会再运行的。如果我们做好的产品给客户不可能还让客户像我们这样使用 DSP 仿真器去烧录程序运行,所以非常有必要学习如何将程序烧入到芯片 FLASH 中,这样即使掉电也不会丢失。

1 配置成 FLASH 模式步骤

①将前面定时器实验章节的程序“Example24_DSP2833x_SCI_echoback”复制一份,重新命名为“Example43_DSP2833x_Flash_led”。

②打开 CCS 软件,导入工程“Example43_DSP2833x_Flash_led”,并将 CCS软件工程名修改为实验名称,这个在最开始实验章节就有介绍。如下所示:

③将工程目录“DSP2833x_Libraries”下的 28335_RAM_lnk.cmd 删除,然后 从 TI 提供 给我 们的 库文件 中把 “ F28335.cmd” 拷贝 到现 在实 验文件 夹 “DSP2833x_Libraries”目录下。如下:

在工程目录下自动将“F28335.cmd”文件更新进来,如下:

该文件是对 FLASH 模式的配置,TI 公司已经给我们配置好了,一般我们不需要更改。

④在 main 函数开始处添加 FLASH 模式配置的必须代码,如下:
//复制对时间敏感代码和 FLASH 配置代码到 RAM 中
// 包括 FLASH 初始化函数 InitFlash();
// 链 接 后 将 产 生 RamfuncsLoadStart, RamfuncsLoadEnd, 和 RamfuncsRunStart
// 参数. 请参考 F28335.cmd 文件
MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);
// 调用 FLASH 初始化函数来设置 flash 等待状态
// 这个函数必须在 RAM 中运行
InitFlash();
上述两条语句是在使用 FLASH 模式必要的,通过这两条语句以及 F28335.cmd文件即可将程序烧入到芯片的 FLASH 中,这样程序断电后也不会丢失。
至此,我们就介绍完了如何将 RAM 调试程序修改成 FLASH 程序,大家只要按照上述步骤完成即可,重点是第 3、4 步。

2 软件设计

(1)F28335.cmd

/*
// TI File $Revision: /main/9 $
// Checkin $Date: August 28, 2007   11:23:38 $
//###########################################################################
//
// FILE:    F28335.cmd
//
// TITLE:   Linker Command File For F28335 Device
//
//###########################################################################
// $TI Release: DSP2833x Header Files V1.01 $
// $Release Date: September 26, 2007 $
//###########################################################################
*//* ======================================================
// For Code Composer Studio V2.2 and later
// ---------------------------------------
// In addition to this memory linker command file,
// add the header linker command file directly to the project.
// The header linker command file is required to link the
// peripheral structures to the proper locations within
// the memory map.
//
// The header linker files are found in <base>\DSP2833x_Headers\cmd
//
// For BIOS applications add:      DSP2833x_Headers_BIOS.cmd
// For nonBIOS applications add:   DSP2833x_Headers_nonBIOS.cmd
========================================================= *//* ======================================================
// For Code Composer Studio prior to V2.2
// --------------------------------------
// 1) Use one of the following -l statements to include the
// header linker command file in the project. The header linker
// file is required to link the peripheral structures to the proper
// locations within the memory map                                    *//* Uncomment this line to include file only for non-BIOS applications */
/* -l DSP2833x_Headers_nonBIOS.cmd *//* Uncomment this line to include file only for BIOS applications */
/* -l DSP2833x_Headers_BIOS.cmd *//* 2) In your project add the path to <base>\DSP2833x_headers\cmd to thelibrary search path under project->build options, linker tab, library search path (-i).
/*========================================================= *//* Define the memory block start/length for the F28335  PAGE 0 will be used to organize program sectionsPAGE 1 will be used to organize data sectionsNotes: Memory blocks on F28335 are uniform (ie samephysical memory) in both PAGE 0 and PAGE 1.  That is the same memory region should not bedefined for both PAGE 0 and PAGE 1.Doing so will result in corruption of program and/or data. L0/L1/L2 and L3 memory blocks are mirrored - that isthey can be accessed in high memory or low memory.For simplicity only one instance is used in thislinker file. Contiguous SARAM memory blocks can be combined if required to create a larger memory block. */MEMORY
{
PAGE 0:    /* Program Memory *//* Memory (RAM/FLASH/OTP) blocks can be moved to PAGE1 for data allocation */ZONE0       : origin = 0x004000, length = 0x001000     /* XINTF zone 0 */RAML0       : origin = 0x008000, length = 0x001000     /* on-chip RAM block L0 */RAML1       : origin = 0x009000, length = 0x001000     /* on-chip RAM block L1 */RAML2       : origin = 0x00A000, length = 0x001000     /* on-chip RAM block L2 */RAML3       : origin = 0x00B000, length = 0x001000     /* on-chip RAM block L3 */ZONE6A      : origin = 0x100000, length = 0x00FC00    /* XINTF zone 6 - program space*/ ZONE7       : origin = 0x200000, length = 0x100000    /* XINTF zone 7  */ FLASHH      : origin = 0x300000, length = 0x008000     /* on-chip FLASH */FLASHG      : origin = 0x308000, length = 0x008000     /* on-chip FLASH */FLASHF      : origin = 0x310000, length = 0x008000     /* on-chip FLASH */FLASHE      : origin = 0x318000, length = 0x008000     /* on-chip FLASH */FLASHD      : origin = 0x320000, length = 0x008000     /* on-chip FLASH */FLASHC      : origin = 0x328000, length = 0x008000     /* on-chip FLASH */FLASHA      : origin = 0x338000, length = 0x007F80     /* on-chip FLASH */CSM_RSVD    : origin = 0x33FF80, length = 0x000076     /* Part of FLASHA.  Program with all 0x0000 when CSM is in use. */BEGIN       : origin = 0x33FFF6, length = 0x000002     /* Part of FLASHA.  Used for "boot to Flash" bootloader mode. */CSM_PWL     : origin = 0x33FFF8, length = 0x000008     /* Part of FLASHA.  CSM password locations in FLASHA */OTP         : origin = 0x380400, length = 0x000400     /* on-chip OTP */ADC_CAL     : origin = 0x380080, length = 0x000009     /* ADC_cal function in Reserved memory */IQTABLES    : origin = 0x3FE000, length = 0x000b50     /* IQ Math Tables in Boot ROM */IQTABLES2   : origin = 0x3FEB50, length = 0x00008c     /* IQ Math Tables in Boot ROM */  FPUTABLES   : origin = 0x3FEBDC, length = 0x0006A0     /* FPU Tables in Boot ROM */ROM         : origin = 0x3FF27C, length = 0x000D44     /* Boot ROM */        RESET       : origin = 0x3FFFC0, length = 0x000002     /* part of boot ROM  */VECTORS     : origin = 0x3FFFC2, length = 0x00003E     /* part of boot ROM  */PAGE 1 :   /* Data Memory *//* Memory (RAM/FLASH/OTP) blocks can be moved to PAGE0 for program allocation *//* Registers remain on PAGE1                                                  */BOOT_RSVD   : origin = 0x000000, length = 0x000050     /* Part of M0, BOOT rom will use this for stack */RAMM0       : origin = 0x000050, length = 0x0003B0     /* on-chip RAM block M0 */RAMM1       : origin = 0x000400, length = 0x000400     /* on-chip RAM block M1 */RAML4       : origin = 0x00C000, length = 0x001000     /* on-chip RAM block L1 */RAML5       : origin = 0x00D000, length = 0x001000     /* on-chip RAM block L1 */RAML6       : origin = 0x00E000, length = 0x001000     /* on-chip RAM block L1 */RAML7       : origin = 0x00F000, length = 0x001000     /* on-chip RAM block L1 */ZONE6B      : origin = 0x10FC00, length = 0x000400     /* XINTF zone 6 - data space */FLASHB      : origin = 0x330000, length = 0x008000     /* on-chip FLASH */
}/* Allocate sections to memory blocks.Note:codestart user defined section in DSP28_CodeStartBranch.asm used to redirect code execution when booting to flashramfuncs  user defined section to store functions that will be copied from Flash into RAM
*/ SECTIONS
{/* Allocate program areas: */.cinit              : > FLASHA      PAGE = 0.pinit              : > FLASHA,     PAGE = 0.text               : > FLASHA      PAGE = 0codestart           : > BEGIN       PAGE = 0ramfuncs            : LOAD = FLASHD, RUN = RAML0, LOAD_START(_RamfuncsLoadStart),LOAD_END(_RamfuncsLoadEnd),RUN_START(_RamfuncsRunStart),PAGE = 0csmpasswds          : > CSM_PWL     PAGE = 0csm_rsvd            : > CSM_RSVD    PAGE = 0/* Allocate uninitalized data sections: */.stack              : > RAMM1       PAGE = 1.ebss               : > RAML4       PAGE = 1.esysmem            : > RAMM1       PAGE = 1/* Initalized sections go in Flash *//* For SDFlash to program these, they must be allocated to page 0 */.econst             : > FLASHA      PAGE = 0.switch             : > FLASHA      PAGE = 0      /* Allocate IQ math areas: */IQmath              : > FLASHC      PAGE = 0                  /* Math Code */IQmathTables     : > IQTABLES,  PAGE = 0, TYPE = NOLOAD IQmathTables2    : > IQTABLES2, PAGE = 0, TYPE = NOLOAD FPUmathTables    : > FPUTABLES, PAGE = 0, TYPE = NOLOAD /* Allocate DMA-accessible RAM sections: */DMARAML4         : > RAML4,     PAGE = 1DMARAML5         : > RAML5,     PAGE = 1DMARAML6         : > RAML6,     PAGE = 1DMARAML7         : > RAML7,     PAGE = 1/* Allocate 0x400 of XINTF Zone 6 to storing data */ZONE6DATA        : > ZONE6B,    PAGE = 1/* .reset is a standard section used by the compiler.  It contains the */ /* the address of the start of _c_int00 for C Code.   /*/* When using the boot ROM this section and the CPU vector *//* table is not needed.  Thus the default type is set here to  *//* DSECT  */ .reset              : > RESET,      PAGE = 0, TYPE = DSECTvectors             : > VECTORS     PAGE = 0, TYPE = DSECT/* Allocate ADC_cal function (pre-programmed by factory into TI reserved memory) */.adc_cal     : load = ADC_CAL,   PAGE = 0, TYPE = NOLOAD}/*
//===========================================================================
// End of file.
//===========================================================================
*/
void MemCopy(Uint16 *SourceAddr, Uint16* SourceEndAddr, Uint16* DestAddr)
{while(SourceAddr < SourceEndAddr){ *DestAddr++ = *SourceAddr++;}return;
}void InitFlash(void)
{EALLOW;//Enable Flash Pipeline mode to improve performance//of code executed from Flash.FlashRegs.FOPT.bit.ENPIPE = 1;//                CAUTION//Minimum waitstates required for the flash operating//at a given CPU rate must be characterized by TI.//Refer to the datasheet for the latest information.
#if CPU_FRQ_150MHZ//Set the Paged Waitstate for the FlashFlashRegs.FBANKWAIT.bit.PAGEWAIT = 5;//Set the Random Waitstate for the FlashFlashRegs.FBANKWAIT.bit.RANDWAIT = 5;//Set the Waitstate for the OTPFlashRegs.FOTPWAIT.bit.OTPWAIT = 8;
#endif#if CPU_FRQ_100MHZ//Set the Paged Waitstate for the FlashFlashRegs.FBANKWAIT.bit.PAGEWAIT = 3;//Set the Random Waitstate for the FlashFlashRegs.FBANKWAIT.bit.RANDWAIT = 3;//Set the Waitstate for the OTPFlashRegs.FOTPWAIT.bit.OTPWAIT = 5;
#endif//                CAUTION//ONLY THE DEFAULT VALUE FOR THESE 2 REGISTERS SHOULD BE USEDFlashRegs.FSTDBYWAIT.bit.STDBYWAIT = 0x01FF;FlashRegs.FACTIVEWAIT.bit.ACTIVEWAIT = 0x01FF;EDIS;//Force a pipeline flush to ensure that the write to//the last register configured occurs before returning.asm(" RPT #7 || NOP");
}void main()
{Uint16 p=0;InitSysCtrl();InitPieCtrl();IER = 0x0000;IFR = 0x0000;InitPieVectTable();//复制对时间敏感代码和FLASH配置代码到RAM中// 包括FLASH初始化函数 InitFlash();// 链接后将产生 RamfuncsLoadStart, RamfuncsLoadEnd, 和RamfuncsRunStart// 参数. 请参考 F28335.cmd 文件MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);// 调用FLASH初始化函数来设置flash等待状态// 这个函数必须在RAM中运行InitFlash();LED_Init();TIM0_Init(150,200000);//200msUARTa_Init(4800);while(1){p++;if((p%2)==0){LED2_TOGGLE;}delay();}
}

DSP Flash运行代码相关推荐

  1. F2812 DSP程序运行在片内RAM和FLASH的区别

    F2812 DSP程序运行在片内RAM和片内FLASH的区别 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 说明:F2812是带有内部Flash的DSP,与 ...

  2. STM32H7使用外部flash运行程序

    STM32H7使用外部flash运行程序 在淘宝上买了一块核心板,使用的STM32H7B0VBT6. 客服很尽责,帮助了我很多. H7系列的功能很强大,但是H7B0他有个问题,只有128k的内部fla ...

  3. Flash使用代码大全

    外部调用swf on (release) { loadMovieNum("service.swf", 1); } 外部调用数据 loadVariablesNum("abo ...

  4. FLASH实用代码大全

    FLASH实用代码大全 外部调用swf on (release) { loadMovieNum("service.swf", 1); } 外部调用数据 loadVariablesN ...

  5. 怎么用python运行代码_python怎么运行代码程序

    一.使用Python的解释器: 1.安装python一般都会有一个交互式解释器,我们可以在这里直接写入运行 2.但如果我们将其关闭,刚才写的代码就会丢失.此时,我们新建一个文本文档,写入print ' ...

  6. AppleWatch开发教程之Watch应用对象新增内容介绍以及编写运行代码

    AppleWatch开发教程之Watch应用对象新增内容介绍以及编写运行代码 添加Watch应用对象时新增内容介绍 Watch应用对象添加到创建的项目中后,会包含两个部分:Watch App 和 Wa ...

  7. python怎么运行代码-python代码如何运行

    交互提示模式下编写代码 安装完Python在Windows 或 Linux中的终端中直接输入python即进入Python 交互会话模式. Python 交互模式有以下几个注意点: 1. 只能够输入P ...

  8. python运行不了程序代码_python怎么运行代码程序

    展开全部 一.使用Python的解释器: 1.安装python一般都会有一个交互式32313133353236313431303231363533e78988e69d8331333433653964解 ...

  9. GitHub 发布了一款重量级产品,可直接运行代码!

    [导读]10月16日,GitHub Universe开发者大会如期举行,并重磅推出GitHub Actions,平台主管Sam Lambert称,这将是GitHub历史上最大的改变.此外,GitHub ...

最新文章

  1. px4原生源码学习二--实时操作系统篇
  2. 最幸福的事就是吃饺子
  3. 为什么俄罗斯不怕芯片卡脖子?
  4. 迁移mysql数据目录
  5. 电话号码正则表达式 (包含电话号码 和 手机号码)
  6. UVa1149 - Bin Packing
  7. 嵌入式系统——流水线处理机执行时间计算
  8. 不负高端商务旗舰之名,金立M2017将搭载高通芯片
  9. uni-app 跨端开发注意事项
  10. win7设置自动开机时间_想要服务器断电后自动开机,怎么设置?
  11. LeetCode——1646. 获取生成数组中的最大值
  12. spring boot check/token Principal 如何注入
  13. Semantic UI 之 对话框 modal
  14. 快递查询方法,一键查询全部快递的物流信息
  15. 一篇来自程序员的日记
  16. 微信小程序主包超2M打包发布成功等相关配置
  17. 苹果系统下载工具Mac Downloader
  18. SmartNovel——自动帮你写文章
  19. 浅析TD源链的未来发展趋势
  20. 极光推出统计产品 极光统计(JAnalytics)正式上线

热门文章

  1. dbd mysql_解决无法安装DBD::mysql模块
  2. 人工智能未来的发展趋势
  3. HikariCP连接池教程
  4. Java中的Map及其使用
  5. kvm 1.创建虚拟机
  6. springboot毕设项目“果然是你”水果直销平台vkfo8(java+VUE+Mybatis+Maven+Mysql)
  7. 如何用pdf转jpg软件将pdf转换成图片
  8. 知识图谱在金融领域中的应用
  9. html/css做一个简单的个人简历
  10. 从恒大亚冠夺冠夜看恒大营销