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.

[参考译文] TMS320F28234-Q1:与闪存相关的问题

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/990567/tms320f28234-q1-flash-related-issues

器件型号:TMS320F28234-Q1
主题中讨论的其他器件:TMS320F28234

Heloo、

我正在使用 TMS320F28234进行无传感器矢量控制。 当程序从 RAM 工作时、我的控制环路是完美的。  当我闪烁时、电流中的程序纹波 会更大、因此电流谐波也会更大。  我使用 TI 提供的.asm 文件将 RAM 更改为闪存。  加电后的闪存程序使用 API 更改为 RAM。  

我有两个意见,想知道原因

1) 1)与 RAM 相比、控制环路花费的时间要高7-8us。 即使程序在 RAM 上运行也是如此。 是否想知道这样做的原因??

2) 2)闪烁时可能导致更高电流纹波的原因。 在运行形式闪存时、ADC 中是否存在任何问题。

此致

曼诺伊雷  

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

    Manoj、

    1) 1)闪存不如 RAM 快。  从闪存中提取/读取内容需要额外的周期。  这些额外的周期被称为等待状态。  您可能已经在应用中使用了闪存初始化例程。  在这种情况下、您可以看到等待状态是根据应用的工作频率进行配置的。

    我们建议将任何时间关键型 ISR 或控制循环复制到 RAM、以实现所需的性能。

    2) 2) 2)当您说闪存时、您是指闪存擦除/编程操作吗?  或者、您是指从闪存执行?   数据表应包含有源闪存(执行以及擦除/编程)的功耗汇总。  您是否查看了数据表?

    我们的模拟专家将解答您的 ADC 问题。

    谢谢、此致、
    Vamsi

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

    Manoj、

    为了添加到 Vamsi 的回复中、闪存和 ADC 采样中的代码执行之间没有已知的串扰。

    最棒的

    Matthew

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

    您好、Vamsi、

    感谢您的回答。 我们使用 TI 提供的 SectionCopy.asm。 您将如何确保从 RAM 执行时间关键型函数。

    此致

    曼诺伊雷

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

    您好、Vamsi、

    感谢您的回答。 我们使用 TI 提供的 SectionCopy.asm。 您将如何确保从 RAM 执行时间关键型函数。

    此致

    曼诺伊雷

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

    Manoj、

    您是否意味着要使用 https://www.ti.com/lit/pdf/spraau8?中讨论的 sectioncopy.asm 将整个应用复制到 RAM

    如果是、这意味着您已经从 RAM 执行-您同意吗?

    您能否执行步进执行并查看您的代码(控制循环)是否正在从 RAM 中执行(查看反汇编窗口)?   

    谢谢、此致、
    Vamsi

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

    尊敬的 Vamsi:

    我们已将整个代码复制到 RAM。 我们遵循了本文件中所述的相同程序。 我们的控制环路也从 RAM 工作。  当我们移动到闪存时,什么可能导致控制环路性能的差异??

    此致

    曼诺伊雷

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

    Manoj、

    它是否从闪存访问任何数据?   

    如果是、您可能还需要将其移动到 RAM 中。

    谢谢、此致、
    Vamsi

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

    您好、Vamsi、

    在分析反汇编代码时,我们能够看到控制循环中的断点在定义的 RAM 位置没有到达,在这里,与闪存中的相同函数一样,已经到达了。  

    请您分享一些参考、(SectionCopy.asm)以确保从 RAM 执行控制循环。

    此致

    曼诺伊雷

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

    Manoj、

    这就是我的想法、也是我提出的问题。  我认为复制到 RAM 的操作在应用程序中未正确执行。

    在进一步讨论这一问题之前、我 有一个问题: 您将整个应用程序复制到 RAM 的原因是什么?  仅复制时间关键代码和任何其他初始化例程(如闪存初始化)是否不够?

    谢谢、此致、

    Vamsi

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

    尊敬的 Vamshi:

    我们认为速度最好,因此将整个代码复制到 RAM 中。  

    我们使用的是 TI Long Back 提供的 SectionCopy.asm、Code_StartBranch.asm 和 flash.cmd。 代码在闪存中工作正常。

    我们最近更改了软件架构以优化控制环路性能。 我们有两 个 ISR、时间关键型例程。 我们还将尝试仅移动 RAM 中的这两个 ISR。  

    我们已在 Flash.cmd 中定义了闪存和 RAM 位置、并进一步定义了这些行。

    中断:load = interrupt_flash,page = 0 /*可以是 ROM */
    运行= interrupt_RAM、page = 0 /*必须为 CSM 安全 RAM */
    TZ_INTERRUPT:load =TZ_INTERRUPT_FLASH、page = 0 /*可以是 ROM */
    运行= TZ_INTERRUPT_RAM、PAGE = 0 /*必须是 CSM 安全 RAM */
    TMR_Inter:load = TMR_inter_FLASH、page = 0 //可以是 ROM *
    运行= TMR_Inter_RAM、PAGE = 0 /*必须是 CSM 安全 RAM */

    和已使用  

    #pragma CODE_SECTION (EPWM_INT_ISR、"中断")
    #pragma CODE_SECTION (ePWM_TZ_INT_ISR、"TZ_INTERRUPT")
    #pragma CODE_SECTION (TIMER_One_ISR、"TMR_INTER")

    因此、我们认为从闪存加载的代码进一步从 RAM 执行。  

    并使用 sectioncopy.asm 将整个代码复制到 RAM

    MOVL XAR5、#_const_size;在 XAR5中存储段大小
    MOVL ACC、@XAR5;将 Section Size 移动到 ACC
    MOVL XAR6、#_const_loadstart;将加载起始地址存储在 XAR6中
    MOVL XAR7、#_const_runstart;在 XAR7中存储运行地址
    LCR 副本;分支至副本

    MOVL XAR5、#_econst_size;在 XAR5中存储段大小
    MOVL ACC、@XAR5;将 Section Size 移动到 ACC
    MOVL XAR6、#_econst_loadstart;将加载起始地址存储在 XAR6中
    MOVL XAR7、#_econst_runstart;在 XAR7中存储运行地址
    LCR 副本;分支至副本

    MOVL XAR5、#_PinIT_SIZE;将段大小存储在 XAR5中
    MOVL ACC、@XAR5;将 Section Size 移动到 ACC
    MOVL XAR6、#_PinIT_loadstart;将加载起始地址存储在 XAR6中
    MOVL XAR7、#_PinIT_runstart;在 XAR7中存储运行地址
    LCR 副本;分支至副本

    MOVL XAR5、#_SWITCH_SIZE;将段大小存储在 XAR5中
    MOVL ACC、@XAR5;将 Section Size 移动到 ACC
    MOVL XAR6、#_SWITCH_loadstart;将加载起始地址存储在 XAR6中
    MOVL XAR7、#_switch_runstart;将运行地址存储在 XAR7中
    LCR 副本;分支至副本

    MOVL XAR5、#_TEXT_SIZE;将段大小存储在 XAR5中
    MOVL ACC、@XAR5;将 Section Size 移动到 ACC
    MOVL XAR6、#_TEXT_LOADSTART;将加载起始地址存储在 XAR6中
    MOVL XAR7、#_TEXT_runstart;在 XAR7中存储运行地址
    LCR 副本;分支至副本

    MOVL XAR5、#_cinit_size;在 XAR5中存储段大小
    MOVL ACC、@XAR5;将 Section Size 移动到 ACC
    MOVL XAR6、#_cinit_loadstart;将加载起始地址存储在 XAR6中
    MOVL XAR7、#_cinit_runstart;在 XAR7中存储运行地址
    LCR 副本;分支至副本

    MOVL XAR5、#_RamFuncs_size;将段大小存储在 XAR5中
    MOVL ACC、@XAR5;将 Section Size 移动到 ACC
    MOVL XAR6、#_RamFuncs_loadstart;将加载起始地址存储在 XAR6中
    MOVL XAR7、#_RamFuncs_runstart;将运行地址存储在 XAR7中
    LCR 副本;分支至副本

    MOVL XAR5、#_ramFuncs_size;将段大小存储在 XAR5中
    MOVL ACC、@XAR5;将 Section Size 移动到 ACC
    MOVL XAR6、#_ramFuncs_loadstart;将加载起始地址存储在 XAR6中
    MOVL XAR7、#_ramFuncs_runstart;在 XAR7中存储运行地址
    LCR 副本;分支至副本

    LB _c_int00

    您能不能建议我们如何进一步为我们的控制环路获得最佳性能。

    此致

    曼诺伊雷

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

    您好、Vamsi、

    我们认为具有最佳性能、因此将整个代码移至 RAM。

    我们使用的是长时间以来的 SectionCopy.asm、CodeStartBranch.asm 和 Flash.cmd,并且工作正常。

    我们最近更改了软件架构、以获得最佳的控制性能。 我们有两个时间关键型 ISR、我们计划在 RAM 中仅移动这两个 ISR。

    我们已经为中断定义了闪存和 RAM 位置并使用了这行代码。

    中断:load = interrupt_flash,page = 0 /*可以是 ROM */
    运行= interrupt_RAM、page = 0 /*必须为 CSM 安全 RAM */
    TZ_INTERRUPT:load =TZ_INTERRUPT_FLASH、page = 0 /*可以是 ROM */
    运行= TZ_INTERRUPT_RAM、PAGE = 0 /*必须是 CSM 安全 RAM */
    TMR_Inter:load = TMR_inter_FLASH、page = 0 //可以是 ROM *
    运行= TMR_Inter_RAM、PAGE = 0 /*必须是 CSM 安全 RAM */

    #pragma CODE_SECTION (EPWM_INT_ISR、"中断")
    #pragma CODE_SECTION (ePWM_TZ_INT_ISR、"TZ_INTERRUPT")
    #pragma CODE_SECTION (TIMER_One_ISR、"TMR_INTER")

    因此、我们认为 ISR 最初从闪存加载并从 RAM 运行。  

    您能给我们建议一下实现最佳控制性能的方法吗?

    此致

    曼诺伊雷

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

    Manoj、

    好的、很高兴知道您决定只将几个关键 ISR 复制到 RAM、而不是整个应用程序。

    关于您提出的问题、请查看  https://www.ti.com/lit/pdf/spra958中的第4.4节"初始化闪存控制寄存器(DSP/BIOS 和非 DSP/BIOS 项目)"。 您可以对时间关键型 ISR 遵循类似的流程。

    总的来说,最好审查上述指南。

    谢谢、此致、

    Vamsi

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

    Manoj、

    有什么帮助吗?  我可以关闭此帖子吗?

    谢谢、此致、
    Vamsi

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

    您好、Vamsi、

    我已在控制器中进行验证。 必须使用实际硬件进行验证。  

    此致

    曼诺伊雷

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

    Manoj、

    好的、请在您验证后通知我。

    谢谢、此致、
    Vamsi