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.

[参考译文] MSPM0G3507-Q1:使用 DMA 读取 GPIO 引脚

Guru**** 2457760 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1488027/mspm0g3507-q1-using-dma-read-gpio-pin

器件型号:MSPM0G3507-Q1

工具与软件:

以下是您内容的英文翻译:


使用的内容 mspm0_sdk_2_03_00_07 Keil 工具提供支持 我想用这个方法 DMA 通道1 来实现 TIMG6 从读取数据(数字信号) GPIO 引脚 .

DMA CH1配置如下:

static const DL_DMA_Config gDMA_SAMPLE_READConfig = {
    .transferMode   = DL_DMA_SINGLE_TRANSFER_MODE,
    .extendedMode   = DL_DMA_NORMAL_MODE,
    .destIncrement  = DL_DMA_ADDR_INCREMENT,
    .srcIncrement   = DL_DMA_ADDR_UNCHANGED,
    .destWidth      = DL_DMA_WIDTH_WORD,
    .srcWidth       = DL_DMA_WIDTH_WORD,
    .trigger        = DMA_SAMPLE_READ_TRIGGER_SEL_FSUB_0,
    .triggerType    = DL_DMA_TRIGGER_TYPE_EXTERNAL,
};

static uint32_t sample_map[1024];

然后、我的程序设置参数并启动 TIMG6计时器 、以及 DMA 的源地址和目标地址设置如下:

DL_DMA_setSrcAddr(DMA, DMA_SAMPLE_READ_CH, (uint32_t) &(SDA_GPIO_PORT->DIN31_0));
DL_DMA_setDestAddr(DMA, DMA_SAMPLE_READ_CH, (uint32_t) sample_map);
DL_DMA_setTransferSize(DMA, DMA_SAMPLE_READ_CH, 1024);

然后、DMA 被启动、程序等待它完成:

DL_DMA_enableChannel(DMA, DMA_SAMPLE_READ_CH);
while (DL_DMA_isChannelEnabled(DMA, DMA_SAMPLE_READ_CH)) { 
    // waiting DMA completed
}
DL_TimerG_stopCounter(TIMER_SAMPLE_READ);

但是、结果是这样的 中的所有元素均sample_map为零 .

我不得不使用 SRAM 变量作为中间缓冲器 、并使用的值持续更新该变量、SDA_GPIO_PORT->DIN31_0以便 DMA 正确读取引脚数据:

static uint32_t temp_data;
DL_DMA_setSrcAddr(DMA, DMA_SAMPLE_READ_CH, (uint32_t) &temp_data);

DL_DMA_enableChannel(DMA, DMA_SAMPLE_READ_CH);
while (DL_DMA_isChannelEnabled(DMA, DMA_SAMPLE_READ_CH)) { 
    temp_data = DL_GPIO_readPins(SDA_GPIO_PORT, SDA_1_GPIO_PIN | SDA_2_GPIO_PIN | SDA_3_GPIO_PIN | SDA_4_GPIO_PIN);
}

这样、结果是正确的。


如何直接设置和使用 DMA 读取 GPIO 引脚?

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

    您好、 

    我认为这需要使用&来获取变量的地址:

    DL_DMA_setDestAddr(DMA, DMA_SAMPLE_READ_CH, (uint32_t*) &sample_map);

    此致、

    Helic

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Thanks for reply. The prototype for this function is DL_DMA_setDestAddr(DMA, DMA_SAMPLE_READ_CH, uint32); So it cannot be 'uint32_t *)
    But I think in this case, &sample_map[0] is the same as smaple_map for array.
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!  

    抱歉、如果出现错误、应该是这样的:

    DL_DMA_setDestAddr(DMA, DMA_SAMPLE_READ_CH, (uint32_t) &sample_map);
    DMA need its 32bit address.

    [报价用户 id="646544" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1488027/mspm0g3507-q1-using-dma-read-gpio-pin ]DL_DMA_setDestAddr (dma、dma_sample_read_ch、(uint32_t) sample_map);
     

    此致、

    Helic

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

    我认为这里的结论:

    https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1484409/mspm0l1306-dma-gpio-input-source-address-error

    不能这样做。

    显然、[Ref TRM (SLAU846B) Sec 11.2.5]"GPIO 外设允许 DMA 对 DOUT31_0寄存器进行写访问"这句话的意思就是他们说的意思--你可以用 DMA 写入 DOUT31_0 (但在其他地方)、而且你不能读取任何寄存器。

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

    谢谢,我不能再感谢你!