工具与软件:
以下是您内容的英文翻译:
使用的内容 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 引脚?