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/TMS320F28377D:使用 F021闪存 API 函数擦除程序并使用新程序进行更新

Guru**** 1993015 points
Other Parts Discussed in Thread: CONTROLSUITE, C2000WARE
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/611627/ccs-tms320f28377d-using-f021-flash-api-function-to-erase-program-and-update-with-new-program

器件型号:TMS320F28377D
Thread 中讨论的其他器件:controlSUITEC2000WARE

工具/软件:Code Composer Studio

 您好!  

我使用的是28377的 F021闪存 API 函数。 现在、我可以使用函数 Fapi_issueProgrammingCommand 来调用.cinit 段并对其进行更新。 但是、当涉及.text 段时、擦除该段后、pragram 将跳转到未知位置。 它显示"0x3fe00a 中没有可用的源"。  

现在、所有函数都通过 CODESECTION (****、"ramfuncs")在 RAM 中运行。 如果我不擦除旧程序、一切运行正常。  附件是我的映射文件。 感谢 you.e2e.ti.com/.../RAM_5F00_management_5F00_cpu02.zip

此致!

Yanpo、Li

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

    此外、我在使用 DINT 进行擦除操作之前禁用了中断。

    至于#programa code_section,当我将所有函数从闪存复制到 RAM 时、我发现闪存中仍有一些字节。 这是否重要?  

    还是应该使用 sectioncopy 而不是函数复制?

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

    Yanpo、

    根据表3-14、0x3FE00A 是引导 ROM 中的 ITRAP ISR。 TRM 中 CPU2的等待点地址(http://www.ti.com/lit/ug/spruhm8f/spruhm8f.pdf)。

    这表明 CPU 执行了一个非法操作码。  您可能还没有将应用程序完全移动到 RAM、我想仍有一些对闪存的访问。 检查映射文件中.text 段中存在的所有代码、并确保应用程序在闪存中擦除这些代码后不会尝试访问它们。  您可以执行步进执行来确定哪个确切的函数导致了此行为。

    关于将闪存内容复制到 RAM 的问题: 当您使用 memcpy()将内容从闪存复制到 RAM 时,闪存不会被擦除。  您需要使用 API 来擦除闪存- memcopy 不会擦除闪存。


    谢谢、此致、

    Vamsi

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

    您好、Vamsi、

    我检查映射文件。 我发现 rts2800-fpu32.lib CPU 计时器函数和 SYSCTRL 仍在闪存中。 我不知道这是否重要。  是的、我使用 API 来擦除。

    .text 0 0008d570 00000b23
    0008d570 00000585 F2837xD_DefaultISR.obj (.text:retain)
    0008daf5 0000021a F2837xD_SYSCTRL.obj (.text)
    0008dd0f 000001d7 rts2800_fpu32.lib:memory.obj (.text)
    0008dee6 0000007d F2837xD_CpuTimers.obj (.text)
    0008df63 00000046 rts2800_fpu32.lib:boot.obj (.text)
    0008dfa9 00000028 F2837xD_PIECTRL.obj (.text)
    0008dfd1 00000025 F2837xD_PieVect.obj (.text)
    0008dff6 00000021 rts2800_fpu32.lib:memcpy_ff.obj (.text)
    0008e017 00000019:args_main.obj (.text)
    0008e030 00000019:exit.obj (.text)
    0008e049 00000018:LL_AOX (.text)
    0008e061 00000012 ecatappl.obj (.text)
    0008e073 0000000b rts2800_fpu32.lib:u_div.obj (.text)
    0008e07e 00000009:_lock.obj (.text)
    0008e087 00000008:strlen.obj (.text)

    Beisdes、我认为配置 cmd 文件也很重要。  您认为将文本部分放入 RAMGS**部分更好,还是放在本地 RAM 中更好? 现在、我的配置将文本放入 RAMGS8_12中、其他内容如下。

    .stack:>RAMM1,PAGE = 1.
    .ebss:>> RAMLS345|RAMD0D1,PAGE = 1
    .esysmem:>RAMD0D1 PAGE = 1.
    .sysmem:>RAMGS13_14 PAGE = 1.

    谢谢你。

    此致!

    Yanpo、Li

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

    您是否按照我的建议尝试执行步骤来计算导致问题的函数?

    在 RAM 使用问题上:如果本地 RAM 可用、则首选它、因为全局共享 RAM 需要访问 CPU2的使用权限。

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

    您好、Vamsi、

    我尝试了 setp 执行。 当程序进入 while (Fapi_checkFsmForReady()!= Fapi_Status_FsmReady){}时,它将变为“无可用源”。 但 我已将 F021闪存 API.lib 添加到 ramfuncs 中。 我不知道为什么。 以下是我的映射文件。

    0008be0a 00000259 F021_API_F2837xD_FPU32.lib:FlashStateMachine.obj (.text:__Fapi_setupFlashStateMachine)
    0008c063 0000019d:Program.obj (.text:_fapi_issueProgrammingCommand)
    0008c200 000000ad:read.obj (.text:_fapi_doMarginiad)
    0008c2ad 00000088:read.obj (.text:__Fapi_loopRegionForValue)
    0008c335 0000007f:read.obj (.text:__Fapi_checkRegionForValue)
    0008c3b4 00000042:BlankCheck.obj (.text:_fapi_doBlankCheck)
    0008c3f6 00000034:Init.obj (.text:_Fapi_initializeAPI)
    0008c42a 0000002e:utilities.obj (.text:_fapi_calculateFletcherChecksum)
    0008c458 0000002d:FlashStateMachine.obj (.text:__Fapi_issueFsmCommand)
    0008c485 0000002c:Utilities.obj (.text:__Fapi_didedUnsignedLong)
    0008c4b1 00000025:FlashStateMachine.obj (.text:_Fapi_setActiveFlashBank)
    0008c4d6 00000022:FlashStateMachine.obj (.text:_Fapi_isAddressEcc)
    0008c4f8 00000022:FlashStateMachine.obj (.text:__Fapi_setupSectorsForWrite)
    0008c51a 00000020:ASYNC.obj (.text:_fapi_issueCommandWithAddress)
    0008c53a 0000001a:utilities.obj (.text:_fapi_waitDelay)
    0008c554 00000016:read.obj (.text:_fapi_flushPipeline)
    0008c56a 0000000f:Verify.obj (.text:_Fapi_doVerify)
    0008c579 0000000d:Utilities.obj (.text:__Fapi_scaleCycles)
    0008c586 0000000c:Init.obj (.ebss)[填充= 0]
    0008c592 0000000b:Utilities.obj (.text:__Fapi_calculateOtpChecksum)
    0008c59d 0000000a:FlashStateMachine.obj (.text:_Fapi_checkFsmForReady)
    0008c5a7 00000006:FlashStateMachine.obj (.text:_Fapi_getFsmStatus)

    实际上,细节是,如果我在 Fapi_checkFsmForReady()中添加一个断点,然后逐步添加,则它会变成“没有可用的源”。 如果我没有连接任何断点、则程序从 文件 memory.c 进入 free (void * userptr) 这是否因为 memory.c 仍然位于闪存中而不是 RAM 中? 如果是、如何将其移动到 ramfuncs?

    但我不知道为什么我不能  通过 CODESECTION 将 InitSysCtrl()添加到 ramfuncs 中。 实际上,它包含在我的 hw_init()函数中。 这个函数所做的全部是初始化与硬件相关的参数。 当我在 ramfuncs 中添加 hw_init 时、即使我刚刚在调试模式下完成了新程序的下载。 它属于"无源可用"。

    此致、

    Yanpo、Li

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

    由于您不包含闪存 API 函数的源代码、因此您会收到针对闪存 API 函数的"无源代码可用"消息。 您只包含 TI 提供的库。 TI 不提供闪存 API 库的源代码。 因此、当您步入它时、您将收到该消息。 这不是问题。 如果您单步执行、您应该会看到控制转到下一个函数、但没有任何问题(我认为这是您在程序放入您的 memory.c 文件时所说的意思)。

    关于 InitSysCtrl():您可能已将 InitSysCtrl()函数分配给 ramfuncs,并认为它将从 RAM 执行。 但是,由于 memcopy()是在 InitSysCtrl()内部调用的,因此它不会复制到 RAM,因此您将获得一个 ITRAP。 您的应用程序可能已到达 BootROM 中的 ITRAP ISR、因此您会看到"no source available "消息。 您可以从 InitSysCtrl()中提取 memcopy(),并在调用 InitSysCtrl()之前调用它。

    您正在尝试实现什么目标? 为什么要擦除具有.text 段或 ramfuncs 的扇区?

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

    您好、Vamsi、

    我想要的是通过以太网(EtherCAT FOE)(如引导加载程序)更新程序。 因此、首先我需要擦除旧扇区、然后写入新程序。 我已经在28069中完成了程序更新程序。 但在28069中、我首先使用段复制将所有.text 段复制到 RAM。 至于28377、当我还使用"DSP28xxx_SectionCopy_nonBIOS.asm"和"DSP280x_CodeStartBranch.asm"来生成段副本时。 我失败了。 在调试模式下下载程序(在 CPU02中、CPU1用于其他控制程序)后、项目将不会以公开方式提供源代码。 我不确定是否有问题。

    至于单步执行闪存 API 函数,实际上,我只使用“单步执行”而不是“单步执行”。 甚至在 CCS 的示例项目"flash_programming_cpu02"中,当我将擦除扇区从扇区 C 更改为扇区 D 时(此处为.text lacates)。 对于"Fapi_doBlankCheck"、它还显示"no source available "。 因此、我想知道使用"#program code_section(***、"ramfuncs")"是否可以进行程序更新。 或者、我应该使用 sectioncopy 替换它吗?  如果是、如何操作? 谢谢你。

    此致、

    Yanpo、Li

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

    Yanpo、

    我想要的是通过以太网(EtherCAT FOE)(如引导加载程序)更新程序。 因此、首先我需要擦除旧扇区、然后写入新程序。 我已经在28069中完成了程序更新程序。 但在28069中、我首先使用段复制将所有.text 段复制到 RAM。 至于28377、当我还使用"DSP28xxx_SectionCopy_nonBIOS.asm"和"DSP280x_CodeStartBranch.asm"来生成段副本时。 我失败了。 在调试模式下下载程序(在 CPU02中、CPU1用于其他控制程序)后、项目将不会以公开方式提供源代码。 我不确定是否有问题。

    当您使用 F28377D 的段复制方法时、您是这样做的

    (i)确保修改链接器命令文件、使"DSP28xxx_SectionCopy_nonBIOS.asm"复制到 RAM 的段具有闪存加载地址和 RAM 运行地址?  或者您是否使用 TI 提供的默认链接器命令文件?  

    (ii)确保您在链接器命令文件中使用的符号名称(用于加载地址、运行地址和大小)与 "DSP28xxx_SectionCopy_nonBIOS.asm"的名称相匹配?

    (iii)确保将任何具有不同加载(闪存)和运行(RAM)地址的用户定义的文本段添加到"DSP28xxx_SectionCopy_nonBIOS.asm"中、以便正确复制这些段、因为您可能已删除 memcpy()?   

    (iv)确保将任何 asm 文件中的任何.sect "ramfuncs "(或.sect ".TI.ramfunc")替换为 .sect "text"、以便 "DSP28xxx_SectionCopy_nonBIOS.asm"可以将这些段复制为.text 段的一部分?

    (v)确保删除任何 #pragma CODE_SECTION (xx、"ramfuncs ")(或 #pragma CODE_SECTION (xx、".TI.ramfunc "))、以便将它们映射到.text 段?

    (vi)确保删除 memcpy (&RamfuncsRunStart、&RamfuncsLoadStart、(size_t)&RamfuncsLoadSize)、因为即使 在到达_c_int00之前、代码也会被"DSP28xxx_SectionCopy_nonBIOS.asm"复制?

    (vii)确保有足够的 RAM 空间将您的所有应用从闪存复制到 RAM?  

    (VIII)另外、请查看此帖子、其中 Tim Love 提供了更新  的(带有错误修复)"DSP28xxx_SectionCopy_nonBIOS.asm"文件: http://e2e.ti.com/support/microcontrollers/c2000/f/171/t/21164#pi316717=2。  我不确定 Tim Love 是否更新了随 SPRAAU8文档发布的软件包以反映他在论坛上发布的这一最新文件。  我将与他离线检查这个问题。

    至于单步执行闪存 API 函数,实际上,我只使用“单步执行”而不是“单步执行”。 甚至在 CCS 的示例项目"flash_programming_cpu02"中,当我将擦除扇区从扇区 C 更改为扇区 D 时(此处为.text lacates)。 对于"Fapi_doBlankCheck"、它还显示"no source available "。 因此、我想知道使用"#program code_section(***、"ramfuncs")"是否可以进行程序更新。 或者、我应该使用 sectioncopy 替换它吗?  如果是、如何操作? 谢谢你。

    关于 TI controlSUITE 或 C2000Ware 中的 flash_programming 工程: 我不会擦除扇区 D、因为.text 已映射到该扇区。  但是,为了在您的案例中进行解释,我在 Example_CallFlashAPI ()中注释了“ReleaseFlashPump()”函数,即使我用 D 扇区擦除代码替换了扇区 C 擦除代码,我也能成功执行整个示例。  请注意,我注释掉了 ReleaseFlashPump()函数,因为它被映射到.text 段,并在扇区 D 被擦除时被擦除。  或者、如果我不想注释掉它、我可以将它映射到 ramfuncs -它也应该这样工作。  您可能注意到 example_CallFlashAPI()本身已复制到 RAM。  您可以根据需要尝试附加的代码。  确保使用最新的 C2000Ware examples.e2e.ti.com/.../2630.flash_5F00_programming_5F00_cpu01.c  

    关于 ramfuncs 与段复制用法的问题: 这取决于您的应用。  从您所说的内容来看、我认为您不打算在闪存上进行固件升级时使应用程序保持活动状态。  如果是这种情况、则将固件更新程序代码分配给 ramfuncs 应该可以在需要时从 RAM 执行它。  正如我之前提到的、您需要弄清楚应用程序在闪存被擦除后尝试从闪存中提取/执行的代码。

    谢谢、此致、

    Vamsi  

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

    您好、Vamsi、

    我仍然尝试使用 ramfuncs 而不是 sectioncopy。 但是、当我将所有函数复制到 ramfuncs 中时、如果我不执行擦除操作、那么一切都是正常的。 如果我执行擦除操作、甚至擦除 econst 段失败。 这意味着当我擦除 econst 段时、 Fapi_doBlankCheck 告诉我失败。 如果我检查存储器、数据仍在那里。 当我在跳转到主循环后单击运行或单步执行时,它无法运行 free()。 我不知道为什么。 附件是我的 cmd 文件。 谢谢你。

    此致、

    Yanpo、Li

    e2e.ti.com/.../2837xD_5F00_FLASH_5F00_lnk_5F00_cpu2.zip

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

    看起来您能够根据所说的内容执行 API。 擦除失败的原因可能不同。 在调用擦除函数之前、您可能尚未完成 EALLOW。 请检查。

    我已经共享了能够正确擦除/编程闪存的代码(甚至是.text 和其他映射的扇区)。 我提到您正在获取 ITRAP、并给出了调试应用的提示。 不确定我还能提供什么帮助。

    您可以共享您的项目吗? 这可能是帮助您的最简单方法。 但是、请不要共享整个应用程序。 将其缩减到我们可以解决您所面临的确切问题的程度。

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

    您好、Vamsi、

    我找到了不能擦除任何段的原因。 因为我应该在"Fapi_initiataleAPI"之前添加函数" izingeFlashPump()"。 现在我可以擦除所有部分。 但是、在我擦除.text 段后、它仍然处于没有可用源的状态。 我已经关闭了中断、将所有相关函数复制到了 ramfuncs 并添加了 EALLOW 和 EDIS。  

    实际上、我还尝试了示例项目"flash-programming-cpu02"、正如您所说的、我对函数 ReleaseFlashPump 进行了注释、并将所有三个函 数从 Fapi_UserDefinitedFuncions.c 复制到 ramfuncs。 然后我可以擦除.text 段。 但是、对于我的新项目、这不起作用。 我不知道为什么。

    在附件中,我附加闪存操作文件、硬件初始化文件、我的映射文件和我的 cmd 文件。  

    感谢 you.e2e.ti.com/.../1004.files.zip

    此致、

    Yanpo、Li

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

    Yanpo、

    正如我提到过的、好的一点是、您现在发现擦除失败的原因是不同的。

    转到您的原始调试: 哪个函数在 您的应用程序中调用 BL_Start()函数?  该函数位于 RAM 还是闪存中?

    此外、您是否启用或禁用了看门狗?

    谢谢、此致、
    Vamsi

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

    您好、Vamsi、

    可以、从映射文件中、您可以看到我已将所有函数复制到 ramfuncs。 我对看门狗不做任何操作。 我只能在 InitSysCtrl 中看到有关禁用看门狗的操作。 其他地方我什么也不做。 另一个问题是、我是否需要将"rts2800_fpu32.lib"复制到 ramfuncs? 我不知道这是否重要。
    我尝试了另一种方法。 也就是说、不要擦除.text 扇区、并将新的.text 数据下载到另一个未使用的扇区(如 FLASHG)。 我已经检查了下载数据、它是正确的。 但是、当我关闭电源并打开电源时、程序不会运行。 我不知道这种方式是否正常。 谢谢你。

    此致、
    Yanpo、Li

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

    Yanpo、

    您没有回答我在上一次答复中提出的问题: 哪个函数调用应用程序中的 BL_Start()函数?  可能是调用 BL_Start()的是您的 main()函数。  由于从该函数返回后会得到一个 ITRAP,我想您正在擦除 main()函数。

    您不需要根据您尝试实现的目标将 RTS 库复制到 ramfuncs 中。

    对未使用扇区中的内容进行编程不会影响您的应用。  我不确定您是否错误地修改了其他内容。  我们无法帮助调试您的应用程序架构。

    谢谢、此致、

    Vamsi

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

    您好、Vamsi、

    我已经检查了哪个函数调用它。 它们是 MailboxServiceInd()<--MBX_Main ()<--ECAT_Main ()<--MainLoop ()<--main()。 我在调用 MailboxServiceInd()之后添加了一个断点,程序可以输入断点,这是可以的。 然后我进入单步执行模式。 当进入 MBX_CheckAndCopyMailbox()(包含在 ECAT_Main()函数中)时,它将变成不可用的源。 ECAT_Main 位于主函数的一部分主循环函数中。 但我已经将这些函数复制到 ramfuncs 中,只剩下 main()函数。 实际上、我无法将 main 函数复制到 ramfuncs 中。 如果我这么做、则在加载新程序后、程序就变成没有可用的源。 我不太清楚擦除主 function.e2e.ti.com/.../7801.files.zip

    附件是相关文件。  ECAT_Main() 位于 ecatslv.c 中, MainLoop 位于 ecatappl.c 中 谢谢你。

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

    Yanpo、

    我简要介绍了您的代码文件。

    需要检查的两件事:

    1.根据您之前发送的 CPU2映射文件,MBX_CheckAndCopyMailbox()位于共享 RAM 中。 检查您的 CPU1应用程序是否提供了对 CPU2的共享 RAM 访问。 如果未给出、CPU2将无法将代码/数据加载/移动到共享 RAM 中。

    2.我看到你的 ramfuncs 分配的#if (flash) condition。 是否应该有像"_flash"这样的前导下划线? 我提出的原因是、在 TI 提供的示例中、我们使用了一个前导下划线。 如果您是从 TI 提供的示例开发项目、请注意、我们使用的是"_flash"而不是"flash"。

    谢谢、此致、
    Vamsi

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

    您好、Vamsi、

    1.是的、我已经提供了对 CPU2的访问权限。 事实上、即使我都使用本地 RAM 也是同样的问题。

    2.对于闪存、我自己定义了它、它是1。

    此致、

    Yanpo、Li

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

    在共享 RAM 中执行 MBX_CheckAndCopyMailbox()时,是否在共享 RAM 中看到有效代码(在反汇编视图中检查)? 我在您的代码中没有看到 memcpy()。

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

    大家好、Vamsi、

    是的、它在 RAM 中被输出。 memcpy 函数位于 InitSysCtrl()中。 当它显示 没有可用源时、我检查了"Disassembly"、它对应于"6F00 SB 0、UNC"。  我的编译器版本是6.2.7。

    相关的反汇编如下所示。

    3fe004:0200 MOVB ACC、#0
    3fe005:C242 MOVL *-SP[2]、XAR6
    3fe006:1E44 MOVL *-SP[4]、ACC
    3fe007:1902 SubB ACC、#2
    3fe008:767FE677 LCR 0x3fe677
    3fe00a:6F00 SB 0、UNC      -------------- 卡在这里
    3fe00b:761B ASP
    3fe00c:FFF0推 RB
    3fe00d:0005按 AR1H:AR0H
    3fe00e:ABBD MOVL *SP++,XT

    此致、

    Yanpo、Li

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

    如前所述、0x3FE00A 是 BootROM 中的 ITRAP ISR。 它不是 MBX_CheckAndCopyMailbox()映射到的 RAM 地址。

    映射文件显示 MBX_CheckAndCopyMailbox()位于共享 RAM 中。 因此、您的应用程序未正确地将代码从闪存复制到 RAM、或者您的应用程序在代码从闪存复制到 RAM 后损坏 RAM。

    从映射文件中,找出 MBX_CheckAndCopyMailbox()被映射的位置(根据共享的位置,它位于0x00017212)。 打开该地址的 CCS 存储器窗口。 在 memcpy()处放置一个断点。 在 memcpy()执行前后检查内存窗口内容。 确保在 memcpy()之后看到内容更改。 然后在 MBX_CheckAndCopyMailbox()或其前面插入断点。 当您单击断点时,请确保内存窗口内容仍然完整,并与执行 memcpy()后看到的内容相匹配。

    请根据这些提示调试您的应用。

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

    您好、Vamsi、

    通过压缩复制到 ramfuncs 的函数数量、现在我可以擦除 TI-txt 文件并将其下载到闪存中。 但是,当我完成下载后,关闭电源并重新启动它,它将无法运行。  

    我已经检查了闪存中下载的每个部分。 实际上、即使我只擦除并将相同的 codestart 段或 econst 函数下载到相关位置、在断电并重新启动时、也无法启动。 我不知道为什么。 下载的数据完全正确。  更新 CPU02中的程序后、我是否需要执行任何额外的工作?

    此外,如果我只下载 CPU1和 CPU2,则所有程序都正常,我是说 CPU1可以正常工作并正常启动 CPU2。 谢谢你。

    此致、

    Yanpo、Li

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

    Yanpo、

    很高兴您现在能够成功对闪存进行编程。

    检查为 CPU2配置的引导模式。  它可以配置为等待引导。  CPU2如果配置为等待引导、则在引导过程后将处于空闲模式。  CPU1可通过 IPC 中断将其唤醒、并指导 CPU2进一步执行(请参阅表3-38)。 TRM 中的 C1TOC2IPC 命令表)。  

    如果希望 CPU2在不进入等待引导的情况下引导至闪存、则需要 适当配置 BOOTCTRL.OTP_KEY 和 BOOTCTRL.OTP_BMODE (引导至闪存)。  检查 表3-8。 获取 CPU2上的模式解码和图3-7。  TRM 中的 CPU2独立和休眠引导流程(SPRUHM8F)。  确保为上述字段编程了正确的值。  

    如果您还有其他与引导相关的问题、我建议您关闭此主题并启动新主题。

    谢谢、此致、
    Vamsi