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
我是这里原始问题的原始海报:
https://e2e.ti.com/support/microcontrollers/hercules/f/312/p/878780/3279188
这对我们来说仍是一个未决问题、但原始问题已被锁定。 我想它是由于不活动而锁定的、但我们提供了反馈、并等待 TI 的进一步响应。 我们已联系当地 FAE、并正在内部工作、以确保此问题受到 TI 的关注。
如果 TI 正在等待 VCCP 管脚状态的后续操作、我认为这是合理的。 VCCP 管脚平坦稳定、没有骤降。
如果需要、我可以重新发布原始问题的症状。
提前感谢、
Joe Shidle
Joe、您好!
很抱歉上一个线程意外掉线。
FMSTAT = 0x30000不指示您在上一帖子中提到的错误。 FMSTAT 寄存器中设置的这两个位表示当该操作挂起时正在进行读取验证操作。 例如、如果处理器获得中断、则可能会发生这种情况、除非在软件中显式完成。 您的中断服务例程很可能位于闪存存储器中。
如果在软件中没有完成、您能在尝试擦除闪存扇区时禁用中断吗? 您可以在闪存操作完成后重新启用中断。
此致、Sunil
感谢您的回应、Sunil。
首先、我意识到我在原始响应中的错误代码中放置了一个拼写错误。 从闪存写入 API 调用接收到的 FAPI 状态为代码48十进制、应为0x0030十六进制。
在参考手册的第5.7.21节"闪存模块状态寄存器(FMSTAT)"中、指示位5 (0x20)为 INVDAT、位4 (0x10)为 Cstat。
我对这种混乱表示歉意。
在每次闪存操作之前、我们从 os_portmacro.h 中调用 HalCoGen FreeRTOS 函数 portdisable_interrupts ()
我想重申的是、此代码在 TMS570LS1224上已经完美运行了多年、在 TMS570LS0714上只有问题。 与1224相比、714如何处理此类闪存命令是否存在差异?
我等待您的答复。
提前感谢、
Joe Shidle
感谢您的澄清、Joe。
INVDAT 标志指示应用程序尝试将"1"编程为已经为"0"的位。 闪存存储器单元在已编程状态下为"0"、在已擦除状态下为"1"。 因此、该标志意味着应用程序尝试对未擦除的位置进行编程。 您能否在您的应用程序中检查这是否可行?
至于 LS1224和 LS0714器件之间的差异、它们与主闪存阵列的闪存模块控制器相同。 您的应用显然必须考虑闪存和 CPU SRAM 大小的差异。 除此之外、您还可以参阅 QJ 创建并提供的引导加载程序示例: https://git.ti.com/cgit/hercules_examples/hercules_examples/tree/Bootloaders/SafetyMCU_Bootloaders
此致、Sunil
Sunil;
感谢您的回答。
如果您提到之前与 QJ 的主题对话、我相信您的所有问题都已得到解答:
1) 1)我显示了代码、其中我已执行擦除检查、验证了扇区已完全擦除、错误仍然存在。
2) 2)我有-根据 QJ 的建议、在第一次擦除检查/写入之前放置一个额外的擦除扇区、并且错误仍然存在。
3) 3)更重要的是、我们在1224上运行的相同闪存代码已经运行了几年、没有错误、现在在0714上运行时出现错误。
4) 4)更重要的是、通过 CCS 片上调试器单步执行代码、代码在0714上运行。
因此、除非我们缺少任何内容、否则所编写的代码似乎不会出现问题。
我们当前正在尝试写入闪存组0 (如上一个线程中的代码所示)、因此我不认为这是0714与1224上闪存大小的问题、 尽管我们已经确保在 sys_link.cmd 文件中定义正确的闪存长度。
在1224上运行的代码(成功运行多年、无错误)和在0714上运行的代码(自由运行时出错、通过 CCS 调试器单步执行代码时无错误)的主要区别在于、基础 HalCoGen 代码明显不同。 我们通过 HalCoGen 为0714创建了一个新项目、然后移植了我们1224项目中的应用代码、包括闪存代码。
我不知道这是否相关。
如果您有任何进一步的帮助或见解、我们将不胜感激。
提前感谢、
Joe Shidle
Joe、您好!
当您单步执行例程时、它工作正常这一事实表明它是一个计时问题。 对闪存进行编程时、您尝试使用的目标频率是多少? 在将时钟配置为此目标频率之前、您是否配置了正确数量的随机读取等待(RWAIT)状态?
此致、Sunil
您好,Sunil;
感谢您的回答。
在工作1224和非工作0714的两种情况下、我们都使用 HalCoGen 来设置闪存子系统、并且不会偏离开箱即用的 HalCoGen 默认值。
对于工作1224和非工作714、RWAIT 设置为3。 include 和 system.h 中的代码相同
#define TCMFLASH_FRDCNTL_CONFIGVALUE (0x000000000000U |(UINT32)((UINT32) 3U << 8U)|(UINT32)((UINT32) 1U << 4U)| 1U)
对于工作1224和非工作0714、GHVSRC 寄存器在 INCLUE/system.h 中设置相同
#define SYS_GHVSRC_CONFIGVALUE ((UINT32)((UINT32) SYS_OSC << 24U)\ |(UINT32)((UINT32) SYS_OSC << 16U)\ |(UINT32)((UINT32) SYS_PLL1 <<0U)
对于工作中的1224和非工作中的0714、在 INCLUE/system.h 中将 HCLK 设置为160MHz
#define HCLK_FREQ 160.000F
这绝对不是我们用人工的方式所做的事情。
我还认为时序可能是一个问题、并且在代码行之间以几秒的顺序设置了人为的大等待状态(空闲 NOOP)、以模拟代码步进、但在自动运行代码(即不使用调试器)时、0714代码仍然失败。
如果您需要有关我们的 HalCoGen 设置的更多详细信息、请告诉我。
提前感谢您的建议、
Joe Shidle
Joe、您好!
您能否在即将执行 Fapi_issueProgrammingCommand 函数调用之前捕获 PLL 控制寄存器、闪存 RDCNTL 寄存器和 GHVSRC 寄存器值?
系统中的主振荡器是16MHz 吗?
此致、Sunil
感谢您的回应、Sunil。 我对迟迟不作出答复表示歉意。
主振荡器实际上是16MHz。
我通过调试器测试了我们的板、并打印出了值、以便它可以自然运行。 两个结果是相同的。
Joe、
此时、我需要一个测试代码、我可以在我的设置上执行该代码以查看问题。 我可以尝试运行我自己的代码(基于引导加载程序示例)来擦除代码并将其编程到闪存中、但希望遵循您使用的顺序。
Sunil;
感谢您的回答。 我过去曾尝试过 memcpy(),结果是一样的。
我在办公室与管理层合作发布代码、因为当前代码是专有版本的一部分、所以向您提供该代码时会出现一些问题。
我们可能需要与当地的 TI FAE 合作才能开始工作。 我会告诉你我的目的是否有任何进展
再次感谢您的帮助和关注、
Joe Shidle
谢谢 Joe。 我现在要关闭这个线程。