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.

[参考译文] TMS320F28334:代码在闪存中无法正常运行

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1264767/tms320f28334-code-is-not-running-properly-when-in-flash

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

您好!

在我的代码中、我将使用由 PWM 触发的 ADC 中断以50us 的速度运行我的例程。 我的代码与交流感应电机控制相关。

在每50us 产生一次 ADC 中断、并且获取 ADC 值后、我使 ISR 标志为真。 我在 while 循环中使用该标志来检查和运行我的代码。

在 while 循环中、我将调用一些使用电机控制库和 IQmath 宏/函数库的函数。

在 while 循环中、我将使用电机控制和 IQmath 宏、如 ACIFE_MACRO、_IQsinPU 等、并进行一些计算。

当我在 RAM 中运行代码时、代码会正常运行、我在 while 循环中切换 GPIO、该循环以每50us 切换一次。 但当我在闪存中运行代码时、GPIO 不会在50us 时切换、而是在200us 时切换至250us。

通过注释和取消注释例程中的某些部分,我发现当我注释 ACIFE_MACRO ()时, GPIO 被切换为100us。

然后、我取消对 ACIFE_MACRO 的注释并注释例程中使用的_IQsinpu、_IQcospu 宏、然后 GPIO 以150us 切换。

参考 HVACI_Senorless_2833x、我使用了#pragma CODESECTION 来复制 while 循环中的例程函数。

当我使用它并取消注释 ACIFE_MACRO 和_IQsinpu、_IQcospu 时、GPIO 在150us 切换。

因此、我在代码中添加了 ACIFE_MACRO、_IQsinpu 和_IQcospu 并使用了#pragma CODESECTION、然后 GPIO 按预期在50us 切换。

这是它在代码中的样子

空 main ()
{

...

while (1)
{
if (adcisrflag)
{

//切换 GPIO 并执行一些例程
//希望在下一个 adcisr 之前完成例程


_interrupt ADC_ISR ()//ADC ISR 每50us 触发一次
{
adcisrflag = 1;

我认为 ACIFE_MACRO、_IQsinpu/_IQcosPU 可能需要更多时间来运行。

您能提出解决这个问题的方案吗?

谢谢、此致。

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

    您好、Raj、

    由于存在等待状态、闪存执行所需的时间比 RAM 更长。 您可以参阅器件数据表中的以下表格、了解有关等待状态的信息。

    与闪存相比、从 RAM 运行时的访问时间始终存在一定的差异。 请告诉我、是否还有其他相关问题、或者您是否能够在从闪存运行时使循环以预期速度运行。

    此致、

    阿米尔·奥马尔

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

    尊敬的 Amir:

    我明白闪存可能需要更多的时间来运行。您能为这个提供任何解决方案吗?  

    ACIFE_MACRO、_IQsinpu/_IQcosPU 需要更多时间在闪存中运行。 当我添加注释时、它的循环按预期运行。

    您能提供相关建议、以在闪存中运行循环导通时间吗?

    谢谢。

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

    您好、Raj、

    这是闪存的硬件限制、我不相信有办法解决它。 即使系统以最高时钟频率运行、闪存也将需要等待状态才能 正确读取。

    是否有原因使程序不能在闪存中启动并将某些函数加载到 RAM 中? 这样、您始终可以从闪存启动编程的应用程序、同时充分利用 RAM 速度实现某些功能。

    此致、

    阿米尔·奥马尔

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

    尊敬的 Amir:

    您能详细说明一下吗? 我不明白你这么说是什么意思。

    是否有理由让程序不能在闪存中启动并将某些函数加载到 RAM? 这样,您就可以始终从闪存启动编程的应用程序,同时利用 RAM 速度执行某些功能。

    谢谢  

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

    您好、Raj、

    由于该器件同时具有 RAM 和闪存、并且都可以使用可执行代码进行编程、因此可以通过一种方法将您的代码编程到闪存 中、然后在从 RAM 运行的代码中具有某些函数。 有关您器件的此方面的 示例、请参阅 C2000Ware 中的 Example_2833xFlash (C2000Ware_5_00_00_00\device_support\F2833x\examples\flash_F28335)。 本质上、有可与 memcopy 函数一同使用的预处理器命令、用于 将一些程序代码从闪存复制到 RAM 以利用执行速度。

    如果您对此有任何问题、请查看一下、并告诉我。

    此致、

    阿米尔·奥马尔

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

    Amir、您好!

    有一种方法可以将您的代码编程到闪存 中,然后在从 RAM 运行的代码中具有某些函数。

    我对此有疑问。 在代码被刷写时、MCU 不会 从闪存将代码运行到 RAM 中? 这种理解是否正确? 那么为什么我们必须从 RAM 运行特定的函数。 如果刷写、它将已从 RAM 运行。 这话什么意思?

    我参考了您建议的示例。 在该示例中、我在代码中使用了#pragma CODESECTION 和 memcpy。

    我的代码中没有使用 InitFlash。 我是否需要在代码中添加 InitFlash? 如果是,原因为何?

    InitFlash 究竟有什么用途? 可以告诉我吗?

    谢谢。

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

    您好、Raj、

     代码刷新时 MCU 不能将该代码运行到 RAM 中从闪存获取? 这种理解是否正确? 那么为什么我们必须从 RAM 运行特定的函数。 如果刷写、它将已从 RAM 运行。 "那你打算怎么办?"

    不、您的理解不正确。 当代码按照命令链接器文件中指示使用.text 等段编程到闪存时、它从闪存运行。 如果它是在 RAM 上编程的、那么它从 RAM 运行。 MCU 的运行方式与计算机不同、计算机会从更慢、更大的存储器单元中提取存储器以从 RAM 执行。 相反、代码在存储位置执行。 这就是为什么在数据表中注明闪存时序/等待状态的原因、因为程序存取比从 RAM 执行慢。

    我的代码中没有使用 InitFlash。 我是否需要在代码中添加 InitFlash? 如果是,原因为何?

    InitFlash 究竟有什么用途? 可以告诉我吗?

    [/报价]

    如果您查看了示例主代码、函数调用上方有注释:

    该函数用于设置闪存的等待状态、以确保访问可以正确进行而不丢失数据(因为闪存的访问速度比 RAM 慢、并且系统时钟比闪存 访问速度快得多)。

    此致、

    阿米尔·奥马尔

    [/quote]