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.

[参考译文] CCS/TM4C1294NCPDT:具有 DMA 配置的 ADC

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/780899/ccs-tm4c1294ncpdt-adc-with-dma-configuration

器件型号:TM4C1294NCPDT

工具/软件:Code Composer Studio

你(们)好

我需要一些有关 DMA 与 ADC 配置的帮助。

我有一个20kHz 的2 PWM 信号(用于电机控制)。 我需要对整个周期的电流进行采样。

为此、我希望以1.28MSPS 的采样率对64个值进行采样(需要49us)。

因此、我的想法是启动 ADC、始终触发采样4个值、在 ADC 采样接下来的4个值时、使用 DMA 突发请求将样本传输到缓冲器中。

在我的 PWM 中断内、我将启动下一个 DMA 请求(主结构或备用结构)

为此、我为 ADC 序列发生器0配置了4个采样(FIFO 半满时的猝发请求)。

   ROM_ADCSequenceStepConfigure (ADC0_BASE、0、0、ADC_CTL_CH18 | ADC_CTL_IE);
   ROM_ADCSequenceStepConfigure (ADC0_BASE、0、1、ADC_CTL_CH18);
   ROM_ADCSequenceStepConfigure (ADC0_BASE、0、2、ADC_CTL_CH18);
   ROM_ADCSequenceStepConfigure (ADC0_BASE、0、3、ADC_CTL_CH18 | ADC_CTL_END);

ADC1和通道19也是如此。

ADC 工作列表-我在配置 DMA 之前对其进行了测试。

DMA 的配置如下:

ROM_uDMAChannelAttributeDisable (UDMA_CHANGE_ADC0、UDMA_PRI_SELECT | UDMA_ATTR_USEBURST | UDMA_ATTR_HIGH_PRIOR| UDMA_ATTR_REQMASK);
ROM_uDMAChannelAttributeDisable (UDMA_CHANGE_ADC0、UDMA_ALT_SELECT | UDMA_ATTR_USEBURST | UDMA_ATTR_HIGH_PRIOR| UDMA_ATTR_REQMASK);
ROM_uDMAChannelAttributeDisable (UDMA_SEC_CHANGE_ADC10、UDMA_PRI_SELECT | UDMA_ATTR_USEBURST | UDMA_ATTR_HIGH_PRIOR| UDMA_ATTR_REQMASK);
ROM_uDMAChannelAttributeDisable (UDMA_SEC_CHANGE_ADC10、UDMA_ALT_SELECT | UDMA_ATTR_USEBURST | UDMA_ATTR_HIGH_PRIOR| UDMA_ATTR_REQMASK);

ROM_uDMAChannelAssign (UDMA_CH14_ADC0_0);
ROM_uDMAChannelControlSet (UDMA_CHANNEL_ADC0 | UDMA_PRI_SELECT、UDMA_SIZE_16 | UDMA_SRC_INC_NONE | UDMA_DST_INC_16 | UDMA_ARB_4);
ROM_uDMAChannelControlSet (UDMA_CHANNEL_ADC0 | UDMA_ALT_SELECT、UDMA_SIZE_16 | UDMA_SRC_INC_NONE | UDMA_DST_INC_16 | UDMA_ARB_4);

ROM_uDMAChannelTransferSet (UDMA_CHANGE_ADC0 | UDMA_PRI_SELECT、UDMA_MODE_PINGONG、(void *)(ADC0_BASE + ADC_SEQ + ADC_SSFIFO)、(void *) u16Adc0SamplesA、64);
ROM_uDMAChannelTransferSet (UDMA_CHANGE_ADC0 | UDMA_ALT_SELECT、UDMA_MODE_PINGONG、(void *)(ADC0_BASE + ADC_SEQ + ADC_SSFIFO)、(void *) u16Adc0SamplesB、64);

ROM_uDMAChannelAssign (UDMA_CH24_ADC1_0);
ROM_uDMAChannelControlSet (UDMA_SEC_CHANNEL_ADC10 | UDMA_PRI_SELECT、UDMA_SIZE_16 | UDMA_SRC_INC_NONE | UDMA_DST_INC_16 | UDMA_ARB_4);
ROM_uDMAChannelControlSet (UDMA_SEC_CHANNEL_ADC10 | UDMA_ALT_SELECT、UDMA_SIZE_16 | UDMA_SRC_INC_NONE | UDMA_DST_INC_16 | UDMA_ARB_4);

ROM_uDMAChannelTransferSet (UDMA_SEC_CHANGE_ADC10 | UDMA_PRI_SELECT、UDMA_MODE_PINGONG、(void *)(ADC1_base + ADC_SEQ + ADC_SSFIFO)、(void *) u16Adc1SamplesA、64);
ROM_uDMAChannelTransferSet (UDMA_SEC_CHANGE_ADC10 | UDMA_ALT_SELECT、UDMA_MODE_PINGONG、(void *)(ADC1_base + ADC_SEQ + ADC_SSFIFO)、(void *) u16Adc1SamplesB、64);

uDMAChannelEnable (UDMA_CHANGE_ADC0);
uDMAChannelEnable (UDMA_SEC_CHANGE_ADC10);

ADCSequenceDMAEnable (ADC0_BASE、0);
ADCSequenceDMAEnable (ADC1_BASE、0);

启动 uC 后、我在缓冲区中看到64个值(u16Adc0SamplesA 等)、因此看起来 DMA 至少在工作一次。

但是、如何重新触发 PWM 中断内部的主结构或备用结构的 DMA?

这是我尝试过但不起作用的东西。

if (((HWREG (UDMA_ENASET)>> UDMA_CHANGE_ADC0)& 0x01)= 0){
if (uDMAChannelAttributeGet (UDMA_CHANGE_ADC0)& UDMA_ATTR_ALTSELECT){
ROM_uDMAChannelTransferSet (UDMA_CHANGE_ADC0 | UDMA_PRI_SELECT、UDMA_MODE_PINGONG、
(void *)(ADC0_BASE + ADC_SEQ + ADC_SSFIFO)、(void *) u16Adc0SamplesA、64);
}
否则{
ROM_uDMAChannelTransferSet (UDMA_CHANGE_ADC0 | UDMA_ALT_SELECT、UDMA_MODE_PINGONG、
(void *)(ADC0_BASE + ADC_SEQ + ADC_SSFIFO)、(void *) u16Adc0SamplesB、64);
}
uDMAChannelEnable (UDMA_CHANGE_ADC0);
} 

到达 UDMA_ALT_SELECT 行的断点、但不会发生任何情况。

感谢你的帮助。

此致

Rene