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.

[参考译文] TMS320F28379D:CPU Timer0 无法生成超过 1.26MHz 的频率

Guru**** 2422790 points
Other Parts Discussed in Thread: TMS320F28379D

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1536297/tms320f28379d-cpu-timer0-is-not-able-to-produce-frequency-more-than-1-26mhz

部件号:TMS320F28379D
主题:C2000WARE 中讨论的其他器件

工具/软件:

尊敬的 Delaney:

感谢您发送编修。 我曾尝试使用  HPI 编译器 pragma、但只有微小的改进。 我是这样做的:

#pragma INTERRUPT (cpuTimer0ISRHPI);
__ interrupt void  cpuTimer0ISR (void)
   ……
   ……
}
我想到 了使用 CLA 来尝试在 GPIO 中生成 20MHz 频率。 我为 CLA 配置了 1 个任务、其中断源为 Timer0。 我将 Timer0 的 PRD 值保持为 10。 CLA 比 CPU 更快、但仍然只能生成最多 13MHz。 我们至少需要 24MHz。 所以我尝试了一种不同的方法。 我已将 timer0 中断频率降低到 10kHz、因此 CLA 将每 100us 中断一次。 在 CLA 任务中、我在不使用任何循环或 API(直接写入 DAT 寄存器)且无需任何位屏蔽的情况下切换了 GPIO。 这是尽可能快的。 然后、当我在示波器中观察到时、我得到了 40MHz、这足够快、可以满足我们的要求。  但是、我们希望能够控制频率从 12MHz 改变为 24MHz。 我尝试使用 NOPS 来延迟,但我无法做到。 存在一些错误。 您能推荐一种在时钟周期内进行精细延迟调整的方法吗?  我附上了 CLA 任务中代码的屏幕截图和 40MHz 上的示波器输出。
CLA 任务代码:
示波器捕获:
谢谢您、
Bhargav。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    部件号:TMS320F28379D

    工具/软件:

    您好团队:

    我正在将 F2837x controlCARD RL.3-1 与 CCS 版本 20.1.1.8_1.7.1 搭配使用。 我的目标是生成 20MHz 的周期性中断、在每次中断时、我必须向 GPIO B 端口写入一些数据(我使用 8 个引脚)。 但现在、我仅使用一个 GPIO 引脚(连接到红色 LED 的引脚 31)、并在每次中断时进行切换。 我面临的问题是、如果我在示波器中观察到信号、则频率仅为 1.26MHz(时间周期限制为约 790ns)。 我能够准确生成 1MHz、200kHz 等频率、甚至 1Hz 等低频率。 系统时钟为 200MHz、计时器预分频器值为 0 且除以 1。 如果向 PRD 寄存器写入 200、则正确获得的时间段为 1us (1MHz)、但如果尝试获得 2MHz 并向 PRD 寄存器写入 100、则会得到错误的时间段 (790ns 而不是 500ns、围绕 1.26MHz)。 现在、即使我尝试获得 20MHz 并将 10 写入 PRD 寄存器、仍然可以获得 790ns 的时间、就像频率已在 1.26MHz 达到饱和一样。 但从理论上讲、我应该能够得到至少 2MHz。 我尝试使用 GPIO 58 等高速 GPIO、但问题是一样的。 您能帮助我了解问题吗?其根本原因是什么? 我是否使用了正确的 GPIO、或者 GPIO 总线速度是否为低且未正确配置? 我附上了 TIMER0 配置和使用 syscfg 的 GPIO58 配置的屏幕截图。

    谢谢您、

    Bhargav。

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

    尊敬的 Bhargav:

    给我 1-2 天时间来查看您的配置、我将回复我的建议。

    此致、

    Delaney

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

    尊敬的 Delaney:

    非常感谢。 非常感谢。

    谢谢、

    Bhargav。

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

    尊敬的 Bhargav:

    我还在努力,将很快回复。

    此致、

    Delaney

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

    尊敬的 Bhargav:

    GPIO 开关频率限制可在器件的数据表中找到:

    最大切换频率应该是 25MHz、因此这不应该是您的问题。

    这是非常奇怪的行为。  您的应用中是否配置了任何其他中断? 在 PIE 中、TIMER0 的优先级相当高、但如果启用了 ADC 或 XINT 中断、这可能会阻止计时器中断的服务。  

    此致、

    Delaney

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

    尊敬的 Bhargav:

    请允许我 1-2 天来查看您的代码、并回复您。

    此致、

    Delaney

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

    当然、非常感谢!

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

    尊敬的 Bhargav:

    我还没有机会查看代码。 我会在 1-2 天内回复。

    此致、

    Delaney

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

    尊敬的 Bhargav:

    我看不到您的代码有任何重大问题。 几个问题:

    • 您使用的是什么逻辑分析仪? 这些通常有最大采样频率规格。 请确保规格大于 20MHz(以及就此问题而言的 2MHz)。
    • 测试中断延迟的一种方法是使用 CCS 的时钟特性。 您可以通过在 ISR 的开头添加断点、然后单步执行直到 IRET 指令、来测量 ISR 所经历的大约数量。 然后将其乘以 SYSCLK 周期。 您还可以将硬件自动添加~8 个额外周期、然后将其添加到计算中。  
      • 直接写入 GPIO 寄存器将缩短 ISR 中的周期数
    • 您是否还可以尝试在 ISR 中添加一个断点、并检查 TIM 寄存器中的值? 应该在达到 ISR 时重新加载周期值。 这只是为了从软件的角度验证它是否能够正常运行。

    此致、

    Delaney

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您使用的是什么逻辑分析仪? 这些通常有最大采样频率规格。 请确保该规范大于 20MHz(以及这方面的 2MHz)。

    您好 Delaney、感谢您确认代码。

    1.我使用了 Saleae 逻辑分析仪。 我实际上将采样频率设置为 24MHz。 但我想这不是问题所在。 我在另外两个 Tektronix 示波器中检查了 100MHz 带宽、那里也看到了完全相同的响应。

    2.您所附的链接显示了一个使用旧版本 CCS 的教程。 我正在使用 CCS v20.2、但我尝试了但不确定如何添加计数事件。 我也找不到断点视图窗口。 只有一个断点窗口、我们可以通过该窗口添加或删除断点。 我附加了一个屏幕截图。 也许这个选项仅适用于 ARM 设备、我不确定。 因此、我无法计算 ISR 所花费的周期数。 还有其他方法吗?

    3.我在 ISR 的第一行放置了一个断点。 我已将 PRD 寄存器配置为 20 或 0x14。 当程序从开始时、在断点到达的那一刻、TIM 寄存器为 0、这是有道理的、因为 TIM 从 20 计数到 0、当达到 0 时、ISR 触发并命中该断点。 但如果我再次运行,第二次它到达断点, TIM 不是 0 ,它有一些小于 20 的值,如 16 ,第三次它到达断点, TIM 是 4 ,第四次 14 ,.. 3、13、2、12 等... 等等。

    4.按照您的建议,我通过直接写入寄存器替换了 ISR 中的 API。 我附加了第二个屏幕截图。 我还将构建配置更改为 CPU1_RAM。 这已将频率饱和点从 1.26MHz 显著改善至 6.04MHz。 如果我将构建配置更改为 CPU1_FLASH、则最大频率将从 6.04MHz 降低到 5.7MHz 附近。 因此、即使将构建配置从 RAM 更改为闪存、对频率的影响也很小。 请注意、按频率计算、我是指脉宽反比。 也就是说、计时器在一个完整周期内达到 0 两次(当它首先达到 0 时、引脚从低电平切换到高电平、当达到 0 秒时,引脚从高电平切换到低电平。) 当我说到 6.04MHz 时、在示波器中观察到的实际频率是 3.02MHz。 但我比较担心 6.04MHz、因为在实际应用中、我会在端口中写入一些数据、而不是切换引脚。 因此、数据将在 6.02MHz 处更改。 总之、我认为存在较大的中断延迟、并且从 TIM 计数为 0 到 ISR 内部到达控制点的那一刻起、需要历经很多时钟周期。 是否有办法降低数字馈通? 我们是否需要在缓存存储器中定义 ISR? 我不知道该如何改进。 感谢您的帮助。

    5.还有一点要注意的是我想测试 GPIO 速度。 因此、我禁用计时器并在主功能内部的 while (1) 环路中切换引脚、没有任何延迟。 最大切换频率为 15MHz(如上所述,全周期频率为 7.5MHz)。

    while (1)
      {
        *((uint32_t *)(GPIODATA_BASE))=*((uint32_t *)(GPIODATA_BASE))^ 1;
      }

    非常感谢您的支持。  非常感谢大家对改进这一点提供的帮助。

           

    谢谢。此致、

    Bhargav Sakia.

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

    Bhargav、

    该专家目前不在办公室、当他们返回时会回复您。 感谢您的耐心。

    此致、

    Aishwarya

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

    尊敬的 Aishwarya:

    没问题、我会等待回答。

    谢谢。此致、

    Bhargav Sakia.

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

    尊敬的 Bhargav:

    谢谢你的耐心,当我出去. 以下是我的 回答:

    以下是有关 CCS 20 性能分析时钟的等效文档:   7.1.调试概述—Code Composer Studio 20.2.0 文档。 要在 ISR 的一开始设置断点、您可以转至 Run -> Disassembly 并找到 ISR 的名称、然后在开始时将断点放入 Disassembly 中。  

    预计 RAM 程序代码与闪存程序代码之间的执行时间会有差异 — 请参阅此主题。

    下面是一些尽可能缩短 ISR 的方法。

    • 避免在 ISR 内进行(非内联)函数调用。 对寄存器使用直接 HWREG 访问
    • 避免在 ISR 内进行任何类型的轮询/等待循环 — 例如,不要调用需要 CPU 等待的阻塞 SPI 函数
    • 在工程属性中启用编译器优化以尽量减少所使用的指令
    • 为每个 ISR 设置 HPI 编译器 pragma、以便 FPU 寄存器不需要压入堆栈(此设置将它们保存在影子寄存器中)。
    • 避免使用 RPT 指令

    另外、我之前应该提到过这一点、但如果您只是希望为您的应用生成调制信号、您将看到 ePWM 模块的性能更好且易于使用、因为这就是它的设计用途。 借助此模块、您也不需要任何 CPU 干预、您只需将信号配置为以特定的速率产生脉冲、它就会将此信号输出到配置的 GPIO。 如果您想了解有关 ePWM 的更多信息、请告诉我。

    此致、

    Delaney

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

    您好:

    该专家目前是 OOO 由于美国假期,请期待下星期初回复。

    此致、

    Sahana

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

    尊敬的 Delaney:

    感谢您发送编修。 我曾尝试使用  HPI 编译器 pragma、但只有微小的改进。 我是这样做的:

    #pragma  INTERRUPT (cpuTimer0ISR、 HPI);
    __ interrupt  void  cpuTimer0ISR (void)
       ……
       ……
    }
    我想到 了使用 CLA 来尝试在 GPIO 中生成 20MHz 频率。 我为 CLA 配置了 1 个任务、其中断源为 Timer0。 我将 Timer0 的 PRD 值保持为 10。 CLA 比 CPU 更快、但仍然只能生成最多 13MHz。 我们至少需要 24MHz。 所以我尝试了一种不同的方法。 我已将 timer0 中断频率降低到 10kHz、因此 CLA 将每 100us 中断一次。 在 CLA 任务中、我在不使用任何循环或 API(直接写入 DAT 寄存器)且无需任何位屏蔽的情况下切换了 GPIO。 这是尽可能快的。 然后、当我在示波器中观察到时、我得到了 40MHz、这足够快、可以满足我们的要求。  但是、我们希望能够控制频率从 12MHz 改变为 24MHz。 我尝试使用 NOPS 来延迟,但我无法做到。 存在一些错误。 我还尝试在 CLA 中使用 SysCtl_delay (count) 函数、但收到了警告(附了屏幕截图)。 您能否建议以某种方法根据 CLA 中的时钟周期(低至 1 个时钟周期)进行精细的延迟调整?  我附上了 CLA 任务中代码的屏幕截图和 40MHz 上的示波器输出。
    CLA 任务代码:
    示波器捕获:
    警告尝试在 CLA 中使用 SysCtl_delay () 时:

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

    尊敬的 Bhargav:

    您没有使用 ePWM 模块来实现这一点吗? 请参阅下面的说明:

    另外、我之前应该提到过这一点、但如果您只是希望为您的应用生成调制信号、您将看到 ePWM 模块具有更好的性能和易用性、因为这就是它的设计目标。 借助此模块、您也不需要任何 CPU 干预、您只需将信号配置为以特定的速率产生脉冲、它就会将此信号输出到配置的 GPIO。 如果您想了解有关 EPWM 的更多信息、请告诉我。

    您将看到此模块的性能更好、并且在更改频率时易于使用。 如果希望避免在主 CPU 上使用周期、您甚至可以使用 CLA 与 ePWM 连接以更改频率代码执行。 切换到这种方法会容易得多。

    此致、

    Delaney  

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

    嗨、Delaney、感谢您提出这一建议。 但是、我不确定这是否符合我的要求。 我需要驱动 8 位并行 DAC、我将通过 GPIO 手动操作该 DAC。 共有 10 个 GPIO 信号。 8 条数据线路和 2 个时钟 (1 个时钟到 DAC、另一个时钟到外部 ADC)。 时钟信号需要从 12MHz 变为 24MHz。 这与 UPP 完全相似、只需手动操作即可。 我无法使用 UPP、因为我已经在使用它从 25MHz 的外部 ADC 接收数据、并且我的 MCU 中只有一个 UPP 实例。 现在使用 CLA、我能够生成 40MHz 信号。 如果您可以建议我采取一些方法在 1 个时钟周期内延迟、那么会很棒。 这是目前唯一剩下的事情。 我不会生成脉宽调制信号。 两个时钟信号的脉冲宽度仅保持在 50%。 让我知道您的想法。

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

    尊敬的 Bhargav:

    好的、我看到了。 至少、我建议将 ePWM 用于时钟信号。 您可以通过写入 ePWM 寄存器来实现这些频率以及改变频率。 然后、您可以触发与 CLK 信号同步的 CLA 任务、并在此切换您的数据 GPIO。

    如果您可以建议我采取一些方法在 1 个时钟周期内延迟、那么会很棒。 这是目前唯一剩下的事情。 [/报价]

    CLA 指令集中有一条 MNOP 指令(类似于 C28x 上的 NOP)、可以延迟单个时钟周期。  

    此器件上还有一个 EMIF 外设、如果您想改用该外设、我认为它具有与 uPP 类似的功能。

    此致、

    Delaney