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.
工具/软件: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
您好、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
您好、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
您好、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
大家好、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
您好、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