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/TMS320F28035:tms320f28035

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/804027/ccs-tms320f28035-tms320f28035

器件型号:TMS320F28035
主题中讨论的其他器件:C2000WARE

工具/软件:Code Composer Studio

大家好、

我在闪存上操作应用程序代码时遇到问题。

我现在使用 ADC、ePWM1A、eQEP、SCI、I2C 和 F28035的内部振荡器来生成 CPU 时钟。

我的应用程序代码在 SARAM 中加载此应用程序代码时运行良好、但在加载到闪存中时、代码运行不良。

在调试过程中,我可以确定有一个从 InitSysCtrl()函数到 InitAdc()函数的循环。

InitSysCtrl()的操作完成后,运行了 Next 函数,然后运行了 InitAdc();。

但是,在 InitADC()函数的操作完成后,InitSysCtrl()函数再次运行并无限执行上述序列。 ——它被环住了!

和"SysCtrlRegs.PLLSTS.bit.DIVSEL"保持从0更改为2或从2更改为0、并且我为存储 ADC 值声明的数组不稳定。 这些值更改为无法预测的值。 (当此应用程序代码被加载到 SARAM 中然后被执行时、它实现了稳定的值。)

这里是我又注意到的情况。

在 InitAdc()函数中,有(* Device_cal)()函数。 完成此函数后、它没有转到下一条指令行。 相反,InitSysCtrl()函数再次运行。

总结一下我到目前为止所说的话、
当我的应用程序加载到闪存中然后执行时、包括 PLL 设置在内的整个系统会变得严重不稳定。 但当加载到 SARAM 中时、它的运行情况非常好。

但以上问题只是我所经历的整个问题的一部分。
有时它没有恢复、或者我收到消息"0x3ff8a1"没有可用的源

我想这些问题有两个相关的方面。

第一个原因是振荡器运行应用程序代码的速度相当慢、或者闪存运行速度太慢。

其次是因为 Linker cmd 文件配置不是很好。

英语不是我的母语,所以我知道你很难找到我的观点。 如果有一些事情让您感到困惑、我很乐意回答您的问题。

如果我能得到你的帮助和支持,我将不胜感激。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Yoonseok、
    我建议查看以下 C2000 Ware 中 F2803x 的示例:C:\ti\c2000Ware_1_00_06_00\device_support\f2803x\examples\c28\flash_F28035

    这采用了在内部构建以从 RAM 运行的 ePWM 示例之一、通过修改链接器文件、将其编译为加载到闪存、然后相应地运行。 您可以查看有关所涉及内容的顶部注释、并查看.cmd 文件、并将其与您具有的用于 RAM 执行的文件进行比较、并注意差异。

    在查看上述内容后、请告诉我您是否能够让您的示例正常工作。

    最棒的
    Matthew
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    想跟进、看看您是否对上述建议有一定的成功。

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

    您好、Matt

    我非常感谢你对我的问题的答复,并对你的这一晚答复表示抱歉。

    我已经查看了您向我推荐的 TI 示例、并将其应用于我的应用代码、但似乎不能解决问题

    故障仍然存在。

    为了解决我的问题、我认为我必须让您了解我的情况和测试环境。

    我们的团队开发了器件电路板的原型、并将 TMS320F28035嵌入为主 MCU。

    在原型上从嵌入式 MCU 的 RAM 中执行应用程序代码非常有效、无论加载哪个应用程序代码。

    但是、当我尝试从 MCU 闪存中执行项目的应用程序代码时、问题就会发生。

    'ePWM Updown'等轻量级应用代码是一个简单的 TI 示例代码、它从嵌入在原型上的 MCU 闪存中正常工作、但我用于设置'ePWM'、'eQEP'、SCI 和'I2C'等各种模块操作的应用代码未按预期工作。

    要找到有关原型上使用我的应用代码出现的问题的解决方案、
    我尝试将其加载到开发套件中。

    但该套件也发生了同样的故障。

    但是、有趣的是、在100万亿次尝试中、嵌入在开发套件中的 MCU 闪存中的应用代码工作非常好。 当它开始很好地运行时、每当我尝试执行时、它都会成功地保持预期的操作。

    这个问题似乎已经解决。

    每次检查操作都进展顺利后、我就尝试在原型上再次运行我的应用程序代码。

    但故障再次发生在原型上。

    一旦我注意到故障、我就将仿真器从原型上拆下、并再次尝试使用仿真器将代码加载到嵌入在开发套件中的 MCU 闪存中。 但是、在我尝试从原型 MCU 闪存加载和执行我的应用程序代码之前、套件也发生了同样的故障。

    它看起来像 Zombie 病毒包含在原型中、而开发套件通过仿真器感染了它。 哈哈哈…

    因此、现在我假设原型对与 JTAG 相关的寄存器或与仿真器相关的东西似乎有不良影响。

    您能就此提出任何建议吗?

    在哪里可以看到有关 JTAG 及其操作的参考指南文档?

    我希望您在阅读此电子邮件时不要感到困惑。 如果是、请告诉我。  

    非常感谢您的真诚支持和款待。

     

     

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是否可以确认您的原型和开发套件上的编程都成功? 我的意思是、在您对闪存进行编程之后(您是否使用 CCS 内置的编程器或其他内容)读取内容并确保其与您的预期映像相匹配。
    您可以使用"Tools"菜单项下的 Save Memory 在 CCS 中导出大量存储器。 有许多不同的格式、因此请选择与源的任何格式相匹配的格式。
    如果我们可以确定闪存是否已正确编程、我们可以调试代码的更多功能方面。

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

    嗨、Matt!  

    您的建议和 TI 示例是我的代码的解决方案。  

    我的应用代码在开发套件和原型上都运行得很好。

    我不知道在我的代码上应用示例源代码并在我的第一次尝试中运行它时到底有什么关系。

    我想这是因为我多次强制 MCU 使用不适合闪存运行的代码来运行它

    在我应用示例代码之前。

    我可以通过在顶部编写预处理器"#pragma CODE_SECTION (epwm1_ISR、"ramfuncs")"来解决它

    main.c 和 memcpy ((uint16_t *)&RamfuncsRunStart、(uint16_t *)&RamfuncsLoadStart、(无符号)

    long)&RamfuncsLoadSize);在 main 函数中。 我还检查了 cmd 文件的分配是否与 TI 示例中的分配相同

    您建议我检查的代码。

    我还使用了"InitFlash()"函数来实现闪存运行的高性能。

    我认为将函数'InitFlash'分配给用户输出段'Ramfuncs'的预处理器不需要写入

    在 main.c 上再运行一次、因为它已经被写入'SysCtrl.c'中。

    但我很好奇、我的代码的主要问题是当它仅从闪存中执行时会出现什么?

    我认为我的代码不是那么长和复杂。 到目前为止、我对我的代码所做的只是设置

    注册以便在我的用途上使用 MCU 模块、例如'ePWM、eQEP、I2C、SCI、 和 ADC。

    此外、我将寄存器设置为使用每100us 运行一次的"ePWM"中断模式。

    (中断 ISR 是我从闪存复制到 SARAM 的函数。 在我这么做之后、我的代码运行得非常好、就像魔术一样!)

    我注意到、可以通过编写 memcpy 函数成功完成代码复制。 发生了什么

    如果我只编写不编写 memcpy 函数的 code_section 预处理器?  

    如果没有 memcpy、看起来代码也可以运行、但我注意到的是我声明给的 Unit16全局变量

    在 ISR 处从 eQEP 获取位置计数器的连续数据似乎没有从 eQEP 获取任何值。

    我还注意到、可以在没有适当的 memcpy 或代码段预处理器集的情况下输入 ISR。

    非常感谢 Matt 为帮助我而付出的努力 和真诚的回答。 我很高兴有机会来到这里

    在线帮助。  

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

    就 memcopy 函数和使用/不使用它的代码而言、取决于您是否已将该代码配置为从与加载不同的空间运行。  这只是在代码被载入到闪存时完成的操作、但是你想要从 SRAM 运行以获得更高的速度(RAM 为0个等待状态、而闪存为3个 WS、频率为60MHz)。

    因此、如果不关心速度、您可以从闪存执行程序、而不是复制到 SRAM。  在这种情况下、您的链接器(.cmd)文件中不会有运行地址。

    就 QEP 值不正确而言、我不确定这是如何发生的。  当然、如果从闪存执行、执行速度会更慢、但值仍应在那里。   

    我会在执行时使用观察窗口和查看的 QEP 寄存器来查看内容、以确保 QEP 本身的运行方式正确。

    最棒的

    Matthew

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

    想查看是否有其他有关此主题的行动/问题。  我将标记为 TI 认为已解决、但请随时回复、并将收到通知。

    最棒的
    Matthew