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.

[参考译文] MSPM0G1505:使用 DMA 更新 GPIO 的速率

Guru**** 2392395 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1311005/mspm0g1505-rate-of-updating-gpios-using-dma

器件型号:MSPM0G1505

我所做的设置要求我使用 DMA 写入 DOUT31_0、以便以特定模式切换 GPIO、我以工作原型形式使用该模式。  但是、我想确认一下我对可能干扰计时的理解。  从实验中、我认为需要5个 MCLK 时钟(我目前在80MHz 上运行)从闪存中读取值并将其写入 GPIO 端口、因此我可以每62.5ns 更改一次 GPIO 的状态。  我不明白这在数据表/TRM 中的什么位置进行了说明-我说得对吗?  (我不违反数据表7.10.2中列出的任何单个 GPIO 的开关速率)。

如果我选择了最高优先级的 DMA 通道并且使器件保持在运行模式、是否有任何可能导致计时发生变化的因素、例如需要额外的时钟?  看起来我需要确保 CPU 不会尝试访问与 DMA 相同的存储器、还要确保它不会访问与 GPIO (PD1)相同总线上的外设?

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

    1.您能告诉我为什么需要5个 MCLK 时钟吗? 闪存可在24MHz 零等待提取下工作。

    2、对不起,我不能再想了。

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

    我已经设置了一组 uint32_t 值、其中的位设置为与我希望切换的 GPIO 相对应。  我已配置一个 DMA 通道、以便在触发时从该阵列传输到 DOUT31_0。  我的代码的相关片段如下(我已经从应用中删除了一些不必要的附加功能):

    const uint32_t pin_output[] = {
    
        DRIVE_DR3_PIN,
        DRIVE_DR2_PIN | DRIVE_DR1_PIN | DRIVE_DR3_PIN,
        DRIVE_DR2_PIN | DRIVE_DR3_PIN,
        DRIVE_DR2_PIN,
        DRIVE_DR2_PIN,
        DRIVE_DR2_PIN
    }
    
    int main(void)
    {
        SYSCFG_DL_init();
    
        DL_GPIO_enableDMAAccess(DRIVE_PORT, DRIVE_DR1_PIN | DRIVE_DR2_PIN | DRIVE_DR3_PIN);
    
        DL_DMA_setSrcAddr(DMA, DMA_GPIO_OUTPUT_CHAN_ID, (uint32_t)&pin_output);
        DL_DMA_setDestAddr(DMA, DMA_GPIO_OUTPUT_CHAN_ID, (uint32_t)&DRIVE_PORT->DOUT31_0);
        DL_DMA_setTransferSize(DMA, DMA_GPIO_OUTPUT_CHAN_ID, sizeof(pin_output) / sizeof(pin_output[0]));
        DL_DMA_enableChannel(DMA, DMA_GPIO_OUTPUT_CHAN_ID);
    
        DL_DMA_startTransfer(DMA, DMA_GPIO_OUTPUT_CHAN_ID);
    
        while (1) {
            __WFI();
        }
    }

    从调整 pin_output 阵列到使用示波器进行测量、我可以实现每62.5ns 更新一次。  我很想知道我是否应该能够比这更快。  但是、一致性对我来说也很重要、因此我想了解哪些因素会影响 DMA 吞吐量。

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

    我建议将 PIN_OUT 放入 RAM 中。 它将比闪存中更快。

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

    感谢您的建议。  数据表/参考手册是否说明了对于给定的时钟速度、GPIO 更新的有效速度是多少?  我假设应该有两个时钟(一个从存储器中读取值、另一个写入 GPIO 寄存器)、但实际上似乎不止这一点、即使是使用您的 RAM 建议也是如此。

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

    您好、Alan!

    我将连接我们的设计。 我很快就会回来的。

    伊森

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

    这里是我们的设计的回复,请检查您是否有任何额外的油炸玉米粉饼。

    源地址

    不可访问 CPU 的时钟周期

    可同时访问 CPU 的时钟周期

    DMA 触发类型

    不具有 ECC 的 SRAM

    • 第一次 DMA 传输中的6个周期
    • 随后的传递函数中有3个周期
    • 第一次 DMA 传输中有6个周期、
    • 随后的传递函数中有3个周期

    软件触发

    具有 ECC 的 SRAM

    • 第一次 DMA 传输中有6个周期、
    • 随后的传递函数中有3个周期
    • 第一次 DMA 传输中有6个周期、
    • 随后的传递函数中有3个周期

    软件触发

    闪存(WS 2)

    • 第一次 DMA 传输中有8个周期、
    • 随后的传递函数中进行5个周期
    • 在第一次 DMA 传输中多执行8个周期、
    • 后续传输后具有6个周期(额外的1个周期)

    软件触发

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

    非常好、谢谢、看起来与我的测量结果相符。

    我可以看看您的表显示的内容吗-如果我的 GPIO 模式置于 SRAM 中、那么即使 CPU 也在访问 SRAM 或闪存、时序也没有区别?  所以我的 CPU 仍可以执行代码(包括中断) 和访问闪存或 SRAM 中的数据、如果没有启用更高优先级的 DMA 通道或执行 GPIO 访问、则不应该有任何操作来干扰 GPIO 输出的时序?  如果是、这非常适合我的应用。

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

    是的、是的。 无论如何、对于 DMA、它将始终具有 基本时钟周期(具有最快的8/16/32位传输的重复块 DMA 传输模式)、即3个用于 DMA 读取、等待、写入。