This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/TMS320F2.8335万:一次性闪烁代码

Guru**** 2573695 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/641747/ccs-tms320f28335-flashing-code-in-one-shot

部件号:TMS320F2.8335万

工具/软件:Code Composer Studio

您好,

我想询问一个特别的问题:我目前正在开发一个新的应用程序,它从RAM启动并调试,链接程序脚本附在下面。 不幸的是,我遇到了缺乏这种记忆的情况。 在我的代码中有一些工作正常的部件,所以我认为,可以将它们移动到闪存中,然后立即将它们下载到MCU中。 如何实现? 我应该在 代码中插入一些pragma节,如“#pragma code_section()”,还是有其他方法可以将经过充分验证的代码放入闪存中? 我提醒:它必须是一次性的,并且后续调试等必须只能从RAM中再次进行:-)

非常感谢您的建议。

Miroslav

/*
// TI文件$Revision:/main/11 $
//签入$日期:2009年4月15日09:57:28 $//#############################################################################################################################################.########.################./#./#./#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.

//
//文件:2.8335万_RAM_lnk.cmd
////
标题:2.8335万的链接程序命令文件RAM不足的示例
////
这仅包括2.8335万设备上的所有SARAM块。
// 这不包括闪存或OTP。
////
请记住,L0和L1受代码
//保护 安全模块。
////
这意味着在大多数情况下,您会想要移至
// 定义了更多内存的另一个内存映射文件。
//
//###########################################################################
//$TI发行:$//
$Release Date:$//####################################################################################################################################################################################################

*/

/*===================================================================================
//对于Code Composer Studio 2.2 和更高版本
//------------------
//除了此内存链接器命令文件外,
//将头链接器命令文件直接添加到项目中。
//需要头链接器命令文件,才能将
//外设结构链接到
//内存映射中的正确位置。
////
头链接器文件位于<base>\DSP2833x_Headers\cmd
////
对于BIOS应用程序,请添加: DSP2833x_Headers_BIOS.cmd
//对于非BIOS应用程序,添加:DSP2833x_Headers_nonBIOS.cmd
========================= */

/*===================================================================================
//对于2.2 之前的代码编辑器工作室
//------------------
//1)使用以下-l语句之一在
项目中包括//头链接器命令文件。 将
外围结构链接到
内存映射中的正确//位置需要头链接器//文件 */

/*取消注释此行仅包括非BIOS应用程序的文件*/*
-l DSP2833x_Headers_nonBIOS.cmd */

/*取消注释此行仅包括BIOS应用程序的文件*/*
-l DSP2833x_Headers_BIOS.cmd */

/* 2) 在项目中,将路径<base>\DSP2833x_headers\cmd添加到
库搜索路径中,路径位于project->build options,linker tab,
library search path (-i)下。
/*=========================================================================================================== */*

定义F2.8335万的内存块起始/长度
第0页用于组织程序部分
第1页用于组织数据部分

注:
F2.8335万上的内存块是一致的(即相同的
物理内存)。
这是不应出现的相同内存区域
为第0页和第1页定义。
这样做会导致程序损坏
和/或数据。

镜像l0/L1/L2和L3内存块-即
它们可以在高内存或低内存中访问。
为简单起见,此中仅使用一个实例
链接程序文件。

连续的SARAM内存块可以组合使用
如果需要创建更大的内存块。
*/


memory
{
page 0:/*
begin用于“boot to SARAM”bootloader模式 */

开始 :Origin = 0x0万,length = 0x0.0002万 /*引导至M0将在此处 */
RAMM0 :原始= 0x0.005万,长度= 0x0003B0
RAML0 :原点= 0x0.8万,长度= 0x0.1万
RAML1 :原点= 0x0.9万,长度= 0x0.1万
RAML2 :原点= 0x00A000,长度= 0x0.1万
RAML3 :原点= 0x00B000,长度= 0x0.1万
RAML4 :原点= 0x00C000,长度= 0x0.1万
//RAML5 :原点= 0x00D000,长度= 0x0.1万
//RAML6 :原点= 0x00E000,长度= 0x0.1万
//ZONE7A :原始= 0x20万,长度= 0x00FC00 /* XINTF区域7-程序空间*//*已禁用,所有外部RAM将位于数据部分*/
CSM_RSVD:原始= 0x33FF80,长度= 0x0.0076万 /* FLASHA的一部分。 在使用CSM时使用所有0x0000编程。 */
CSM_PWL:原点= 0x33FFF8,长度= 0x0.0008万 /* FLASHA的一部分。 FLASHA中的CSM密码位置 */
ADC_CAL:原点= 0x38.008万,长度= 0x0.0009万
重置 :原点= 0x3FFFC0,长度= 0x0.0002万
IQTABLES:原点= 0x3FE000,长度= 0x000b50
IQTABLES2:原点= 0x3FEB50,长度= 0x0.0008万c
FPUTABLES:原点= 0x3FEBDC,长度= 0x0006A0
引导ROM:原点= 0x3FF27C,


页面长度= 0x000D44:
/* BOOT_RSVD由启动ROM用于堆栈。 */*
此部分仅保留用于防止引导ROM在
调试过程中损坏此区域 */

BOOT_RSVD:原始= 0x0.0002万,长度= 0x0.0004万E /* M0的一部分,引导ROM将使用此堆栈*/
RAMM1 :原点= 0x0.04万,长度= 0x0.04万 /*片上RAM块M1 */
RAML5 :原点= 0x00D000,长度= 0x0.1万
RAML6 :原点= 0x00E000,长度= 0x0.1万
RAML7 :原点= 0x00F000,长度= 0x000FF0 /*片上RAM块L1 */
FLASH_FLAG:Origin = 0x00FFF0,length = 0x0万F
FLASH_CRC:origin = 0x30万,length = 0x0.0002万 /*应用CRC */
ZONE7 	:原始= 0x20万,长度= 0x10万	/* 1Mx16b */
ZONE6的扩展RAM :原始= 0x10万,长度= 0x8万 /*分机NV RAM 512kx16b */
}


“

引导至SARAM”模式的{/*设置:
codegstart部分(可在DSP28_CodeStartBranch.asm中找到)
将执行重定向到用户代码的开头。 */
codesstart :>开始, 页面= 0
ramfuncts :> RAML0, Page =0
// two >表示链接器可以将.text部分拆分为多个RAM区域
.text :>> RAML0 | RAML1 | RAML2 | RAML3 | RAML4, 页面= 0
.cinit :> RAML0, 页面= 0
。Pinit :> RAML0, 页面= 0
。switch :> RAML0, 页面= 0

.stack :> RAML4, 页面= 0
.ebss :>> RAML5 | RAML7 页面= 1
。econst :>> RAML6 | RAML7, 页面= 1
个.esysmem :> RAMM1, Page =1
.sysmem			:> RAML0,	page =0
.cio				:> RAML0,	page =0

diagbuff :> RAMM1, 页面= 1

FLASH_CRC :> FLASH_CRC page = 1
FLASH_FLAG :> flash_flag page = 1

IQmath :> RAML0, Page =0
IQmathTables :> IQTABLES,页面=0,类型= NoLoad

/*如果调用IQNexp()或IQexp(),则取消注释以下部分
从IQMath.lib库中执行函数,以便利用
引导ROM中的相关IQ Math表(这可节省空间和引导ROM
为1等待状态)。 如果此部分未取消注释,请使用IQmathTables2.
将加载到其他存储器(SARAM,闪存等)中并将占用
打开空间,但0等待状态是可能的。
*/*

IQmathTables2 :> IQTABLES2, page =0,type = NoLoad
{

IQMath.lib<IQNexpTable.obj>(IQmathTablesRam)

}
*/

FPUmathTables:> FPUTABLES,page =0,type = NoLoad

DMARAML4 :> RAML4, 页面= 0
//DMARAML5 :> RAML5, 页面= 0
//DMARAML6 :> RAML6, 页面= 0
DMARAML7 :> RAML7, 页面= 1

//ZONE7DATA :> ZONE7B,页面= 1 /*重新定义如下*/
ZONE7DATA 		:> ZONE7,	第= 1页
ZONE6DATA :> ZONE6, 页面= 1

。重置 :>重置, 页=0,类型= DSECT /*未使用 */
CSM_rsvd :> CSM_RSVD page =0,type = DSECT /*不用于SARAM示例*/
csmpasswds :> CSM_PWL页=0,type = DSECT /*不用于SARAM示例*/

/*分配ADC_CAL函数(出厂时预编程到TI保留内存中)*/
.ADC_CAL. :load = adc_CAL,page = 0,type = NoLoad

}/*


//===================================================================
//文件结束。
//===========================================================================================================================================
*/

 

 

 

 

 

 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Miroslav,
    我建议从RAM中调试,如果您将部分代码加载到闪存中,每次对基于RAM的代码进行小更改时,闪存都必须被擦除,重写和验证。 加载到RAM的时间要快得多!

    代码完全调试后,您可以将代码移至Flash中。 将项目移至闪存后,我仍然建议您将代码复制到RAM中,以获得最佳性能。

    但是,您确实想要细分代码,使用#Pragma应该可以。

    此致,
    科迪
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Cody:

    感谢您的回答。 是的,目前我正在从RAM调试和启动我非常广泛的应用程序,但正如我昨天所提到的,这种内存已经不足了。 另一方面,我的代码的关键部分已准备就绪,因此我想立即将其闪存,然后继续在RAM中去除新部件的故障。 简单地说,我的目标是清除记录和档案管理,以供其他发展。

    TMS320F2.8335万的主要问题是闪存重写的数量很少-因为我需要一次执行。

    我不明白:"一旦您的代码完全调试完毕,您就可以将您的代码移到Flash中。 将项目移至闪存后,我仍然建议您将代码复制到RAM中,以获得最佳性能。" 您是想在RAM或整个代码中仅放置ISR等吗?

    美好的一天

    Miroslav
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好,

    我只想说,上述问题现已解决。 要实现这一目标,需要执行以下几个步骤:

    1.您必须创建一个新的链接器文件,并附加闪存部分(闪存函数)

    2.如果您的部分代码已完成并准备好移动到闪存中,则必须使用#pragma code_section或#pragma data_section进行标记,以将其放置到特定的内存段中。

    3.下载代码并开始调试

    4.之后,如果您要更改应用程序中的某些内容并仅在RAM中进行调试,则必须设置调试器的配置:调试配置->转子->闪存设置->在闪存程序设置中,请选中“仅加载RAM”。  好的,您现在可以再次下载代码,但请确保您的闪存保持最后状态:-)

    /*
    // TI文件$Revision:/main/10 $
    //签入$日期:2008年7月9日13:43:56 $//#############################################################################################################################################################./#########./#./#./#./#./#./#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.
    
    //
    //文件:	F2.8335万.cmd
    ////
    标题:	F2.8335万设备的链接器命令文件
    //######################################################################################################################################################################################
    
    //$TI发行版:$//$Release
    Date:$//########################################################################################################################################################################################################
    
    */
    
    /*===================================================================================
    //对于Code Composer Studio 2.2 和更高版本
    //------------------
    //除了此内存链接器命令文件外,
    //将头链接器命令文件直接添加到项目中。
    //需要头链接器命令文件,才能将
    //外设结构链接到
    //内存映射中的正确位置。
    ////
    头链接器文件位于<base>\DSP2833x_Headers\cmd
    ////
    对于BIOS应用程序,请添加: DSP2833x_Headers_BIOS.cmd
    //对于非BIOS应用程序,添加:DSP2833x_Headers_nonBIOS.cmd
    ========================= */
    
    /*===================================================================================
    //对于2.2 之前的代码编辑器工作室
    //------------------
    //1)使用以下-l语句之一在
    项目中包括//头链接器命令文件。 将
    外围结构链接到
    内存映射中的正确//位置需要头链接器//文件 */
    
    /*取消注释此行仅包括非BIOS应用程序的文件*/*
    -l DSP2833x_Headers_nonBIOS.cmd */
    
    /*取消注释此行仅包括BIOS应用程序的文件*/*
    -l DSP2833x_Headers_BIOS.cmd */
    
    /* 2) 在项目中,将路径<base>\DSP2833x_headers\cmd添加到
    库搜索路径中,路径位于project->build options,linker tab,
    library search path (-i)下。
    /*=========================================================================================================== */*
    
    定义F2.8335万的内存块起始/长度
    第0页将用于组织程序部分
    第1页将用于组织数据部分
    
    注:
    F2.8335万上的内存块是一致的(即相同的
    物理内存)。
    这是不应出现的相同内存区域
    为第0页和第1页定义。
    这样做会导致程序损坏
    和/或数据。
    
    镜像l0/L1/L2和L3内存块-即
    它们可以在高内存或低内存中访问。
    为简单起见,此中仅使用一个实例
    链接程序文件。
    
    连续的SARAM内存块可以组合使用
    如果需要创建更大的内存块。
    */
    
    
    内存
    {
    第0页:/*程序内存*/
    /*内存(RAM/FLASE/OTP)块可移至Page1以进行数据分配*/
    
    开始 :Origin = 0x0万,length = 0x0.0002万 /*引导至M0将在此处*/
    RAMM0 :原点= 0x0.005万,长度= 0x0003B0
    // ZONE0 :原点= 0x0.4万,长度= 0x0.1万 /* XINTF区域0 */
    RAML0 :原点= 0x0.8万,长度= 0x0.1万 /*片上RAM块L0 */
    RAML1 :原点= 0x0.9万,长度= 0x0.1万 /*片上RAM块L1 */
    RAML2 :原点= 0x00A000,长度= 0x0.1万 /*片上RAM块L2 */
    RAML3 :原点= 0x00B000,长度= 0x0.1万 /*片上RAM块L3 */
    RAML4 :原点= 0x00C000,长度= 0x0.1万 /*片上RAM块L1 *///
    FLASH_CRC:原点= 0x30万,长度= 0x0.0002万 /* Application CRC */
    FLASHH :原点= 0x30.0002万,长度= 0x007FFE /*片上闪存*/
    FLASHG :原点= 0x30.8万,长度= 0x0.8万 /*片上闪存*/
    FLASHF :原点= 0x31万,长度= 0x0.8万 /*片上闪存*/
    FLASHE :原点= 0x31.8万,长度= 0x0.8万 /*片上闪存*/
    FLASHD :原点= 0x32万,长度= 0x0.8万 /*片上闪存*/
    FLASHC :原点= 0x32.8万,长度= 0x0.8万 /*片上闪存*/
    FLASHB :原点= 0x33万,长度= 0x007FFE /*片上闪存*/// begin_app
    :origin = 0x33FFF6,length = 0x0.0002万 /* FLASHA的一部分。 用于“引导至闪存”引导加载程序模式。 *
    FLASHA :原点= 0x33.8万,长度= 0x007F80 /*片上闪存*/
    CSM_RSVD:原点= 0x33FF80,长度= 0x0.0076万 /* FLASHA的一部分。 在使用CSM时使用所有0x0000编程。 */
    CSM_PWL :原点= 0x33FFF8,长度= 0x0.0008万 /* FLASHA的一部分。 FLASHA */
    OTP中的CSM密码位置 :原点= 0x38.04万,长度= 0x0.04万 /*片上OTP */
    ADC_CAL :原点= 0x38.008万,长度= 0x0.0009万 保留内存中的/* ADC_CAal函数*/
    
    IQTABLES:原点= 0x3FE000,长度= 0x000b50 /*引导ROM中的IQ数学表*/
    IQTABLES2:原点= 0x3FEB50,长度= 0x0.0008万c /*引导ROM中的IQ数学表*/
    FPUTABLES:原点= 0x3FEBDC,长度= 0x0006A0 /* Boot ROM */
    BootROM中的FPU表 :原点= 0x3FF27C,长度= 0x000D44 /* Boot ROM */
    reset :原点= 0x3FFFC0,长度= 0x0.0002万 /*引导ROM */
    矢量的一部分 :原点= 0x3FFFC2,长度= 0x0.0003万E /*启动ROM的一部分*/
    
    第1页:/*数据存储器*/
    /*内存(RAM/FLASE/OTP)块可以移动到PAGE0以进行程序分配*/
    /*寄存器保留在Page1上 */
    
    Boot_RSVD:原始= 0x0万,长度= 0x0.005万 /* M0的一部分,引导ROM将使用此堆栈*///
    RAMM0 :原点= 0x0.005万,长度= 0x0003B0 /*片上RAM块M0 */
    RAMM1 :原点= 0x0.04万,长度= 0x0.04万 /*片上RAM块M1 */
    RAML5 :原点= 0x00D000,长度= 0x0.1万 /*片上RAM块L1 */
    RAML6 :原点= 0x00E000,长度= 0x0.1万 /*片上RAM块L1 */
    RAML7 :原点= 0x00F000,长度= 0x000FF0 /*片上RAM块L1 */
    FLASH_FLAG:Origin = 0x00FFF0,length = 0x0万F
    ZONE7 :原点= 0x20万,长度= 0x10万 /*外置1Mx16b */
    ZONE6 RAM :原点= 0x10万,长度= 0x8万 /* Ext. NV RAM 512kx16b */
    FLASH_CRC:Origin = 0x30万,length = 0x0.0002万 /*应用CRC *//FLASHB
    :原点= 0x33万,长度= 0x0.8万 /*片上闪存*/
    }/*
    
    将段分配给内存块。
    注意:
    DSP28_CodeStartBranch.asm中的codegstart用户定义部分用于重定向代码
    引导至闪存时执行
    ramfuncs用户定义的部分,用于存储将从Flash复制到RAM
    */
    
    部分
    {
    
    /*分配方案领域:*/
    codesstart :>开始, 页面= 0
    ramfuncts :> RAML0, 页面= 0
    闪存功能 :>>FLASHB | FLASHC page =0
    flashdata		:: FLASHD	page =0
    // two >表示链接器可以将.text部分拆分为多个RAM区域
    .text :>> RAML0 | RAML1 | RAML2 | RAML3 | RAML4, 页面= 0
    .cinit :> RAML0, 页面= 0
    。Pinit :> RAML0, 页面= 0
    。switch :> RAML0, 页面= 0
    
    .stack :> RAML4, 页面= 0
    .ebss :>> RAML5 | RAML7 页面= 1
    。econst :>> RAML6 | RAML7, 页面= 1
    个.esysmem :> RAMM1, 页面= 1
    .sysmem 			:> RAML0,	页面= 0
    。cio 				:> RAML0,	页= 0
    
    FLASH_CRC :> FLASH_CRC page = 1
    FLASH_FLAG :> flash_flag page = 1
    
    // csmpasswds :> CSM_PWL 页面= 0
    // CSM_rsvd :> CSM_RSVD页面= 0
    
    Diagbuff :> RAMM1, 页=1/*
    
    初始化部分进入Flash *//*
    要使SDFlash对这些部分进行编程,必须将它们分配到第0页*/
    
    //.switch :> FLASHB 页面= 0
    
    /*分配IQ数学领域:*/
    IQmath :> FLASHC 页面= 0 /*数学代码*/
    IQmathTables :> IQTABLES,PAGE = 0,TYPE = NoLoad
    
    /*如果调用IQNexp()或IQexp(),则取消注释以下部分
    从IQMath.lib库中执行函数,以便利用
    引导ROM中的相关IQ Math表(这可节省空间和引导ROM
    为1等待状态)。 如果此部分未取消注释,请使用IQmathTables2.
    将加载到其他存储器(SARAM,闪存等)中并将占用
    打开空间,但0等待状态是可能的。
    */*
    
    IQmathTables2 :> IQTABLES2, page =0,type = NoLoad
    {
    
    IQMath.lib<IQNexpTable.obj>(IQmathTablesRam)
    
    }
    */
    
    FPUmathTables:> FPUTABLES,page =0,type = NoLoad
    
    /*分配DMA可访问的RAM部分:*/
    DMARAML4 :> RAML4, 页面= 0
    //DMARAML5 :> RAML5, 页面= 1
    //DMARAML6 :> RAML6, 页面= 1
    DMARAML7 :> RAML7, 页面= 1.
    
    ZONE7DATA :> ZONE7,第= 1页
    ZONE6DATA :> ZONE6,页= 1
    
    /*。reset是编译器使用的标准部分。 它包含
    _c_int00 for C Code的起始地址*/*。 /*
    /*使用引导ROM时
    ,不需要此部分和CPU矢量*/*表。 因此,默认类型在此处设置为*/*
    DSECT */
    .reset :>重置, 页=0,类型= DSECT
    //矢量 :>引导程序 页面=0,类型= DSECT
    CSM_rsvd :> CSM_RSVD page =0,type = DSECT /*不用于SARAM示例*/
    csmpasswds :> CSM_PWL页= 0,类型= DSECT /*不用于SARAM示例*/
    
    /*分配ADC_CAal函数(出厂时预编程到TI保留内存中)*/
    .ADC_CAL. :load = adc_CAL,page = 0,type = NoLoad
    
    }/*
    
    
    //===================================================================
    //文件结束。
    //===========================================================================================================================================
    */