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.

[参考译文] F28M36P63C2:在 Concerto M3/C28x 内核上、GPIO 切换速率限制为 2µs

Guru**** 2964790 points

Other Parts Discussed in Thread: F28M36P63C2

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1645000/f28m36p63c2-gpio-toggle-rate-limited-to-2-s-on-concerto-m3-c28x-cores

器件型号: F28M36P63C2

您好!  在切换 Concerto F28M36P63C2 芯片上的 GPIO 引脚时、我遇到了意想不到的性能限制。 在调试某个时序问题时、我通过示波器监控了 GPIO 输出、但无法生成脉冲或切换速度快于大约 2µs。

根据数据表、GPIO 频率限制为 25MHz(约 40ns) 。 但是、代码中任何间隔小于 2µs 的切换都不会出现在示波器上。

目标引脚为 GPIO P4(M3 侧)/ GPIOD108(C28x 侧)。 只要间隔超过 2µs、输出信号就会正确遵循代码逻辑(设置/复位/切换)。 如果时间间隔较短、则会完全错过转换。  我在 main() M3 内核的环路中放置了两个连续的切换命令、以测量最小延迟。

为了排除常见的配置错误、我已经尝试了以下操作:

  1. 寄存器访问: 从驱动程序库函数切换到直接寄存器写入、以最大程度地减少软件开销。

  2. 引脚比较: 经过测试的替代引脚(例如 P5)、结果相同。

  3. 硬件验证: 使用不同的示波器通道和探头、以确保测量设备不会成为瓶颈。

  4. 限定条件设置: 已将异步限定符模式 (GPEDSEL1) 配置为绕过输入同步逻辑、但 2µs 限制保持不变。

  5. 时钟: 已验证系统时钟配置、以确保 CPU 在预期频率下运行。

谁遇到过此问题? 如何解决?

我希望就如何解决这一瓶颈提供任何指导。

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

    您好、

    您有足够带宽来捕获转换的范围? 在 GPIO 上的转换时间应该少于 2 μ s

    谢谢

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

    您好、

    我们开发团队提供的所有示波器都具有超高的分辨率和性能  、能够应对 2µs GPIO 转换

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

    大家好。 有什么想法吗?

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

    您好、

    您能否参阅下面有关此问题的 GPIO 常见问题解答、看看是否有任何问题适用于您的案例、特别是下面发布的案例? -  【常见问题解答】C2000 GPIO 常见问题解答  

    问:GPIO 的切换速度似乎比应该慢 — 第 1 部分

      GpioDataRegs.GPACLEar.bit.GPIO18 = 1;
    GpioDataRegs.GPASET.bit.GPIO18
    = 1;GpioDataRegs.GPACLEar.bit.GPIO18 = 1;GpioDataRegs.GPASET.bit.GPIO18
    
    = 1;GpioDataRegs.GPATOGGLE.bit.GPIO18 = 1;

    尝试尽可能快地切换 GPIO18。 所示的位方法执行读取 — 修改-写入。 读取部分为等待状态、由于外设帧具有“先写后读流水线保护“、因此在上一次写入完成之前不会发生下一次读取。 使用.all 对整个寄存器进行写入将消除等待状态读取和流水线保护的影响。 《使用 C/C++对 TMS320x28xx 外设进行编程》(SPRAA85) 应用手册也对此进行了介绍

    问:GPIO 的切换速度似乎比应该慢 — 第 2 部分

    for(;;)
    {
    GpioDataRegs.GPADAT.bit.GPIO18 = 1;
    GpioDataRegs.GPADAT.bit.GPIO18 = 0;
    }

    上述代码具有与前面讨论过的类似问题。 此方法使用读取 — 修改-写入。 由于读取部分是等待状态的、并且外设帧具有“先写后读保护“、因此在前一个读取完成之前不会发生下一次读取。 另一个问题是 for 循环将引入一个需要 4 个周期的分支。 因此、即使更改了此代码以使用 GPBTOGLE 寄存器、您也会看到分支开销。

    问:如何在 C 语言中尽可能快地切换 GPIO 引脚?

    最快的方法是对切换寄存器执行背对背写入:
    如果这是在 for () 循环中完成的、则循环将引入一个分支指令、在每个循环开始时需要 4 个周期。 在浮点器件上、您可以使用重复块指令 (RPTB) 执行类似的操作、而不是使用将消除分支开销的分支。 此外、对该外设帧的背对背写入将引入等待状态。 也就是说、一次切换将需要一个周期、但背对背切换将在写入之间增加一个额外的周期。

    for(;;)
    {
    GpioDataRegs.GPBTOGLE.all = 0x0002;
    GpioDataRegs.GPBTOGLE.all = 0x0002;
    GpioDataRegs.GPBTOGLE.all = 0x0002;
    GpioDataRegs.GPBTOGLE.all = 0x0002;
    GpioDataRegs.GPBTOGLE.all = 0x0002;
    GpioDataRegs.GPBTOGLE.all = 0x0002;
    GpioDataRegs.GPBTOGLE.all = 0x0002;
    GpioDataRegs.GPBTOGLE.all = 0x0002;
    重复...等
    }