主题:C2000WARE 中讨论的其他器件
工具/软件:
尊敬的 Delaney:
感谢您发送编修。 我曾尝试使用 HPI 编译器 pragma、但只有微小的改进。 我是这样做的:


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.
工具/软件:
尊敬的 Delaney:
感谢您发送编修。 我曾尝试使用 HPI 编译器 pragma、但只有微小的改进。 我是这样做的:


部件号: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:
我看不到您的代码有任何重大问题。 几个问题:
此致、
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)。
非常感谢您的支持。 非常感谢大家对改进这一点提供的帮助。

谢谢。此致、
Bhargav Sakia.
尊敬的 Bhargav:
谢谢你的耐心,当我出去. 以下是我的 回答:
以下是有关 CCS 20 性能分析时钟的等效文档: 7.1.调试概述—Code Composer Studio 20.2.0 文档。 要在 ISR 的一开始设置断点、您可以转至 Run -> Disassembly 并找到 ISR 的名称、然后在开始时将断点放入 Disassembly 中。

预计 RAM 程序代码与闪存程序代码之间的执行时间会有差异 — 请参阅此主题。
下面是一些尽可能缩短 ISR 的方法。
另外、我之前应该提到过这一点、但如果您只是希望为您的应用生成调制信号、您将看到 ePWM 模块的性能更好且易于使用、因为这就是它的设计用途。 借助此模块、您也不需要任何 CPU 干预、您只需将信号配置为以特定的速率产生脉冲、它就会将此信号输出到配置的 GPIO。 如果您想了解有关 ePWM 的更多信息、请告诉我。
此致、
Delaney
尊敬的 Delaney:
感谢您发送编修。 我曾尝试使用 HPI 编译器 pragma、但只有微小的改进。 我是这样做的:



尊敬的 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