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/EK-TM4C1294XL:DMA 乒乓模式的 ADC、MEM_BADCK_SIZE 限制为8

Guru**** 2480755 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/699971/ccs-ek-tm4c1294xl-adc-with-dma-ping-pong-mem_buffer_size-limited-to-8

器件型号:EK-TM4C1294XL

工具/软件:Code Composer Studio

**编辑**请参阅页面底部的工作示例

您好!

我正在尝试使用 修改 后的 UDMA_DEMO 通过 ADC 学习 DMA。 但我对如何完成读数感到有点困惑、并在将 ADC 缓冲区大小设置为2时遇到一些问题

#include "config/config.h"

#pragma DATA_ALIGN (dmaControlTable、1024)
uint8_t dmaControlTable[1024];

#define MEM_buffer_size 8

静态 uint16_t g_adcBufA[MEM_buffer_size];
静态 uint16_t g_adcBufB[MEM_buffer_size];

静态 uint32_t g_uDMAErrCount;

void CONFIG_ADC0DMA (void)
{
ROM_GPIOPinTypeADC (GPIO_PORTK_base、GPIO_PIN_0 | GPIO_PIN_1);

ROM_ADCSequenceConfigure (ADC0_BASE、1、ADC_TRIGGER_Always、0);
ROM_ADCSequenceStepConfigure (ADC0_BASE、1、0、ADC_CTL_CH16);
ROM_ADCSequenceStepConfigure (ADC0_BASE、1、1、ADC_CTL_CH17 | ADC_CTL_IE | ADC_CTL_END);

//(320MHz PLL/2)/ 5 = 32MHz = 2MSPS
ADCClockConfigSet (ADC0_BASE、ADC_CLOCK_SRC_PLL | ADC_CLOCK_RATE_FULL、5);

//rom_ADCHardwareOversampleConfigure (ADC0_BASE、64);

ROM_ADCSequenceEnable (ADC0_BASE、1);
ROM_ADCSequenceDMAEnable (ADC0_BASE、1);

ROM_uDMAChannelAttributeDisable (UDMA_CHANGE_ADC1、
UDMA_ATTR_ALTSELECT | UDMA_ATTR_USEBURST |
UDMA_ATTR_HIGH_PRIOR|
UDMA_ATTR_REQMASK);

ROM_uDMAChannelAttributeEnable (UDMA_CHANGE_ADC1、UDMA_ATTR_USEBURST);

ROM_uDMAChannelControlSet (UDMA_CHANGE_ADC1 | UDMA_PRI_SELECT、
UDMA_SIZE_16 | UDMA_SRC_INC_NONE | UDMA_DST_INC_16 |
UDMA_ARB_1);

ROM_uDMAChannelControlSet (UDMA_CHANGE_ADC1 | UDMA_ALT_SELECT、
UDMA_SIZE_16 | UDMA_SRC_INC_NONE | UDMA_DST_INC_16 |
UDMA_ARB_1);

ROM_uDMAChannelTransferSet (UDMA_CHANGE_ADC1 | UDMA_PRI_SELECT、
UDMA_MODE_PINGONG、
(void *)(ADC0_BASE + ADC_O_SSFIFO1)、
G_adcBufA、MEM_buffer_size);

ROM_uDMAChannelTransferSet (UDMA_CHANGE_ADC1 | UDMA_ALT_SELECT、
UDMA_MODE_PINGONG、
(void *)(ADC0_BASE + ADC_O_SSFIFO1)、
G_adcBufB、MEM_buffer_size);

ROM_uDMAChannelEnable (UDMA_CHANGE_ADC1);

ROM_ADCIntEnableEx (ADC0_BASE、ADC_INT_DMA_SS1);
ROM_IntEnable (INT_ADC0SS1);
}

int main (void)
{
uint32_t g_cpuFrequency = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz | SYSCTL_OSC_MAIN |
SYSCTL_USE_PLL | SYSCTL_CFG_VCO_320)、120000000);
ROM_FPUEnable();
ROM_FPULazyStackingEnable();

ROM_IntMasterDisable();

initPeripheral();

CONFIG_UART2 (921600、g_cpuFrequency);

UARTprintf ("\033[2J\033[H");

ROM_IntEnable (INT_UDMAERR);

ROM_uDMAEnable();

ROM_uDMAControlBaseSet (dmaControlTable);

CONFIG_ADC0DMA();

ROM_IntMasterEnable();

for (;;)
{
UARTprintf ("ADC 读数 A:%u %u %u %u %u %u %u %u 错误计数:%u\n"、g_adcBufA[0]、g_adcBufA[1]、
G_adcBufA[2]、g_adcBufA[3]、g_adcBufA[4]、g_adcBufA[5]、g_adcBufA[6]、 G_adcBufA[7]、g_uDMAErrCount);
UARTprintf ("ADC 读数 B:%u %u %u %u %u %u %u %u 错误计数:%u\n"、g_adcBufB[0]、g_adcBufB[1]、
G_adcBufB[2]、g_adcBufB[3]、g_adcBufB[4]、g_adcBufB[5]、g_adcBufB[6]、 G_adcBufB[7]、g_uDMAErrCount);

//UARTprintf ("ADC 读取 A:%u %u 错误计数:%u\n"、g_adcBufA[0]、g_adcBufA[1]、g_uDM勘 误计数);
//UARTprintf ("ADC 读数 B:%u %u 错误计数:%u\n"、g_adcBufB[0]、g_adcBufB[1]、g_uDMAErrCount);

ROM_SysCtlDelay ((g_cpuFrequency/3)*0.1);
}
}

void ADC0SS1IntHandler (void)
{
uint32_t ui32模式;

//limpa interrupção caada pero dma
ADCIntClearEx (ADC0_BASE、ADC_INT_DMA_SS1);

ui32Mode = ROM_uDMAChannelModeGet (UDMA_CHANGE_ADC1 | UDMA_PRI_SELECT);

if (ui32Mode = uDMA_MODE_STOP)
ROM_uDMAChannelTransferSet (UDMA_CHANGE_ADC1 | UDMA_PRI_SELECT、
UDMA_MODE_PINGONG、
(void *)(ADC0_BASE + ADC_O_SSFIFO1)、
G_adcBufA、MEM_buffer_size);

ui32Mode = ROM_uDMAChannelModeGet (UDMA_CHANGE_ADC1 | UDMA_ALT_SELECT);

if (ui32Mode = uDMA_MODE_STOP)
ROM_uDMAChannelTransferSet (UDMA_CHANGE_ADC1 | UDMA_ALT_SELECT、
UDMA_MODE_PINGONG、
(void *)(ADC0_BASE + ADC_O_SSFIFO1)、
G_adcBufB、MEM_buffer_size);
}

void uDMAErrorHandler (void)
{
uint32_t ui32Status;

ui32Status = ROM_uDMAErrorStatusGet ();

if (ui32状态)
{
ROM_uDMAErrorStatusClear ();
G_uDMAErrCount++;
}
}

我正在尝试从引脚 PK0 (GND)和 PK1 (3V3)读取数据。 我要将 g_adcBufA 和 g_adcBufB 大小设置为8、并在每个大小上获得[4095 0 4095 0 4095 0 4095 0]。 看起来它正在读取[PK1 PK0 PK1 PK0 PK1 PK0 PK1 PK0]

SS1的 FIFO 深度为4、可以保存4个读数。 但我使用的缓冲区有8个位置、它们交替填充 PK1和 PK0读数。  

问题:

 g_adcBufA 不应该保持前两个值并在其余值中打印其他内容?

为什么不能使用个值的缓冲器? 它仅在8分钟内工作。 我需要立即得到结果、无需等待缓冲区填充8次、我就可以处理数据。

乒乓模式是否是将 DMA 与 ADC 结合使用的最佳方式? 我听说我可以使用散聚模式、但似乎相当复杂、不确定复杂性是否会弥补性能增益(我对 DMA 完全不了解、只在 STM32板上工作一次、它有一个相当不错的名为 STM32CubeMX 的软件、在后台执行所有操作)。

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

    [报价用户="Helder Sales"]不应 将 g_adcBufA 保持前两个值并在其余值中打印其他值?

    您将 UDMA 配置为执行8 16位传输。 所有8个位置都将有 A 到 D 结果。

    [报价用户="Helder Sales)]为什么不能使用个值的缓冲区? 它仅在8分钟内工作。 我需要立即得到结果、无需等待缓冲区填充8次、我才能处理数据。

    UDMA 缓冲区的大小应小于模数 FIFO 的大小、这毫无意义。 如果您需要立即获得结果、请使用序列3和直接 A 到 D 中断。

    [报价用户="Helder Sales)]乒乓是将 DMA 与 ADC 结合使用的最佳方式吗? [/报价]

    这取决于您尝试执行的操作。 如果您连续对信号进行采样并以块的形式处理该信号、那么乒乓就能很好地工作。

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

    [引用 user="Bob Crosby"]

    UDMA 缓冲区的大小应小于模数 FIFO 的大小、这毫无意义。 如果您需要立即获得结果、请使用序列3和直接 A 到 D 中断。

    [/报价]

    至少需要3个引脚才能读取? 我计划使用 DMA 和两个具有相位控制功能的 ADC 从这些器件中读取数据、以实现4MSPS (然后进行过采样以获得更好的结果)。 目前、为了简单起见、我仅使用两个引脚。

    尝试修改为与此类似的内容、但不起作用

    ROM_ADCSequenceStepConfigure (ADC0_BASE、3、0、ADC_CTL_CH16 | ADC_CTL_IE);
    ROM_ADCSequenceStepConfigure (ADC0_BASE、 3、0、ADC_CTL_CH17 | ADC_CTL_IE | ADC_CTL_END); 

    即使只有一个通道(CH17)、UDMA 也永远不会停止模式。 我相信它也不会离开 ISR

    另一个问题是、我将 MEM_buffer_size 更改为任何低于8的值( 例如、MEM_buffer_size = 4)、即使 SS1、它也会在 ISR 中挂起、UDMA 也永远不会停止。

    [引用 user="Bob Crosby"]

    您将 UDMA 配置为执行8 16位传输。 所有8个位置都将有 A 到 D 结果。

    [/报价]

    假设我有一个大小为4的功能缓冲器(使用 SS1)、如果我只使用两个通道、FIFO 将存储

    adcBuf[0]=通道0;

    adcBuf[1]=通道1;

    adcBuf[2]=通道0;

    adcBuf[3]=通道1;

    喜欢这个吗?

    8 16位传输将类似于 A 到 D + A 到 D、总共8个结果?

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

    我发现了将 ADC 缓冲区大小设置为8以下的问题。 我不知道原因、但在极高的速度下、μ µDMA 在使用小型缓冲器时似乎无法正常工作。 当我启用64x 过采样时、问题就消失了。 在逻辑分析仪中测量、以确认 ADC 以全速工作过采样。

    我将通过共享我开发的工作代码来帮助社区。

    基本而言、它将两个 ADC 配置与相移同时工作、以便使采样频率加倍。 组合速度为4MSPS 除以64的过采样、结果为~30KSPS。 采样通道的数量为2个(PK0和 PK1)、它使用采样序列发生器1。 此外、它还在乒乓模式下使用 μ µDMA

    #include 
    #include 
    include "inc/hw_memmap.h"
    #include "inc/hw_types.h"
    #include "inc/hw_ints.h"
    #include "inc/hw_adc.h"
    #include "hw_timer.h"
    #define "inc/hw_gpio.h"#define
    "driverlib_driver.h"
    
    
    #include "driverlib_drivert/driver.h"#define "#driverlib_drivert/driver.h"#define "#define "driverinc/driverlib.dlpina.mA/driver.h"#define #define "#driverlib_dmA/dma.dl.dl.dlpina.mA/dma.dl"#define #include "#define "#driver.dlpine/driver.dlpin.dl.dlpin.dlpin.dlpin.dl"#include "#define #define "#driver.dlpin.dlpin.dlpin.dlpin.dlpin.dlpin.dlpin.dl.dl.dlpin
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    静态 uint32_t g_uDMAErrCount;
    
    bool g_flagAdc0;
    bool g_flagAdc1;
    
    void initPeripherals (void)
    {
    ROM_SysCtlPeripheralDisable (SYSCTL_Periph_GPIOA);
    ROM_SysCtlPeripheralReset (SYSCTL_Periph_GPIOA);
    ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
    while (!ROM_SysCtlPeripheralReady (SYSCTL_Periph_GPIOA));
    
    ROM_SysCtlPeripheralDisable (SYSCTL_Periph_GPIOD);
    ROM_SysCtlPeripheralReset (SYSCTL_Periph_GPIOD);
    ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD);
    while (!ROM_SysCtlPeripheralReady (SYSCTL_Periph_GPIOD));
    
    ROM_SysCtlPeripheralDisable (SYSCTL_Periph_GPIOK);
    ROM_SysCtlPeripheralReset (SYSCTL_Periph_GPIOK);
    ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOK);
    while (!ROM_SysCtlPeripheralReady (SYSCTL_Periph_GPIOK));
    
    ROM_SysCtlPeripheralDisable (SYSCTL_Periph_ADC0);
    ROM_SysCtlPeripheralReset (SYSCTL_Periph_ADC0);
    ROM_SysCtlPeripheralEnable (SYSCTL_Periph_ADC0);
    while (!ROM_SysCtlPeripheralReady (SYSCTL_Periph_ADC0));
    
    ROM_SysCtlPeripheralDisable (SYSCTL_Periph_ADC1);
    ROM_SysCtlPeripheralReset (SYSCTL_Periph_ADC1);
    ROM_SysCtlPeripheralEnable (SYSCTL_Periph_ADC1);
    while (!ROM_SysCtlPeripheralReady (SYSCTL_Periph_ADC1));
    
    ROM_SysCtlPeripheralDisable (SYSCTL_Periph_UART2);
    ROM_SysCtlPeripheralReset (SYSCTL_Periph_UART2);
    ROM_SysCtlPeripheralEnable (SYSCTL_Periph_UART2);
    while (!ROM_SysCtlPeripheralReady (SYSCTL_Periph_UART2));
    
    ROM_SysCtlPeripheralDisable (SYSCTL_Periph_UDMA);
    ROM_SysCtlPeripheralReset (SYSCTL_Periph_UDMA);
    ROM_SysCtlPeripheralEnable (SYSCTL_Periph_UDMA);
    while (!ROM_SysCtlPeripheralReady (SYSCTL_Periph_UDMA));
    }
    
    void CONFIG_UART2 (uint32_t 波特率、uint32_t cpuClock)
    {
    ROM_GPIOPinConfigure (GPIO_PD4_U2RX);
    ROM_GPIOPinConfigure (GPIO_PD5_U2TX);
    ROM_GPIOPinTypeUART (GPIO_PORTD_base、GPIO_PIN_4 | GPIO_PIN_5);
    
    ROM_UARTClockSourceSet (UART2_base、UART_CLOCK_SYSTEM);
    
    UARTStdioConfig (2、波特率、cpuClock);
    }
    
    void CONFIG_ADC0DMA (void)
    {
    ROM_GPIOPinTypeADC (GPIO_PORTK_base、GPIO_PIN_0 | GPIO_PIN_1);
    
    ROM_ADCReferenceSet (ADC0_BASE、ADC_REF_INT);
    
    ROM_ADCSequenceConfigure (ADC0_BASE、1、ADC_TRIGGER_Always、0);
    
    ROM_ADCSequenceStepConfigure (ADC0_BASE、1、0、ADC_CTL_CH16);
    ROM_ADCSequenceStepConfigure (ADC0_BASE、1、1、ADC_CTL_CH17 | ADC_CTL_IE | ADC_CTL_END);
    
    //(320MHz PLL/2)/ 5 = 32MHz = 2MSPS (文档存在问题、PLL 被2分频、因此为320MHz/2)
    ADCClockConfigSet (ADC0_BASE、ADC_CLOCK_SRC_PLL | ADC_CLOCK_RATE_FULL、10);
    
    //启用过采样
    ROM_ADCHardwareOversampleConfigure (ADC0_BASE、64);
    
    //设置相位延迟,因此两个 ADC 可以对同一信号进行交替采样,该值是试验性的
    //您应该使用逻辑分析仪或示波器检查它们是否被~180°隔开
    //本例中为0作为基准
    ROM_ADCPhaseDelaySet (ADC0_BASE、ADC_PHASE_0);
    
    //启用 ADC 和 ADC DMA
    ROM_ADCSequenceEnable (ADC0_BASE、1);
    ROM_ADCSequenceDMAEnable (ADC0_BASE、1);
    
    //配置 UDMA
    ROM_uDMAChannelAttributeDisable (UDMA_CHANGE_ADC1、UDMA_ATTR_ALL);
    ROM_uDMAChannelAttributeEnable (UDMA_CHANGE_ADC1、UDMA_ATTR_USEBURST);
    
    ROM_uDMAChannelControlSet (UDMA_CHANGE_ADC1 | UDMA_PRI_SELECT、
    UDMA_SIZE_16 | UDMA_SRC_INC_NONE | UDMA_DST_INC_16 |
    UDMA_ARB_1);
    ROM_uDMAChannelControlSet (UDMA_CHANGE_ADC1 | UDMA_ALT_SELECT、
    UDMA_SIZE_16 | UDMA_SRC_INC_NONE | UDMA_DST_INC_16 |
    UDMA_ARB_1);
    
    ROM_uDMAChannelTransferSet (UDMA_CHANGE_ADC1 | UDMA_PRI_SELECT、
    UDMA_MODE_PINGONG、
    (void *)(ADC0_BASE + ADC_O_SSFIFO1)、
    G_adcBuf、ADC_buffer_size);
    ROM_uDMAChannelTransferSet (UDMA_CHANGE_ADC1 | UDMA_ALT_SELECT、
    UDMA_MODE_PINGONG、
    (void *)(ADC0_BASE + ADC_O_SSFIFO1)、
    G_adcBuf、ADC_buffer_size);
    
    ROM_uDMAChannelEnable (UDMA_CHANGE_ADC1);
    
    //启用中断(在这种情况下为 ADCIntEnableEx 而不是 ADCIntEnable)
    ROM_ADCIntEnableEx (ADC0_BASE、ADC_INT_DMA_SS1);
    ROM_IntEnable (INT_ADC0SS1);
    }
    
    void CONFIG_ADC1DMA (void)
    {
    ROM_GPIOPinTypeADC (GPIO_PORTK_base、GPIO_PIN_0 | GPIO_PIN_1);
    
    ROM_ADCReferenceSet (ADC1_base、ADC_REF_INT);
    
    ROM_ADCSequenceConfigure (ADC1_base、1、ADC_TRIGGER_AUSE_0);
    
    ROM_ADCSequenceStepConfigure (ADC1_BASE、1、0、ADC_CTL_CH16);
    ROM_ADCSequenceStepConfigure (ADC1_base、1、1、ADC_CTL_CH17 | ADC_CTL_IE | ADC_CTL_END);
    
    //(320MHz PLL/2)/ 5 = 32MHz = 2MSPS (文档存在问题、PLL 被2分频、因此为320MHz/2)
    ADCClockConfigSet (ADC1_base、ADC_CClock_SRC_PLL | ADC_CClock_RATE_FULL、10);
    
    //启用过采样
    ROM_ADCHardwareOversampleConfigure (ADC1_base、64);
    
    //设置相位延迟,因此两个 ADC 可以对同一信号进行交替采样,该值是试验性的
    //您应该使用逻辑分析仪或示波器检查它们是否被~180°隔开
    ROM_ADCPhaseDelaySet (ADC1_base、ADC_PHASE_270);
    
    //启用 ADC 和 DMA
    ROM_ADCSequenceEnable (ADC1_BASE、1);
    ROM_ADCSequenceDMAEnable (ADC1_BASE、1);
    
    //将通道25分配给 ADC1 (因为通道默认为 SSI1TX)
    ROM_uDMAChannelAssign (UDMA_CH25_ADC1_1);
    
    //配置 UDMA (辅助外设分配)
    ROM_uDMAChannelAttributeDisable (UDMA_SEC_CHANGE_ADC11、UDMA_ATTR_ALL);
    ROM_uDMAChannelAttributeEnable (UDMA_SEC_CHANGE_ADC11、UDMA_ATTR_USEBURST);
    
    ROM_uDMAChannelControlSet (UDMA_SEC_CHANGE_ADC11 | UDMA_PRI_SELECT、
    UDMA_SIZE_16 | UDMA_SRC_INC_NONE | UDMA_DST_INC_16 |
    UDMA_ARB_1);
    ROM_uDMAChannelControlSet (UDMA_SEC_CHANGE_ADC11 | UDMA_ALT_SELECT、
    UDMA_SIZE_16 | UDMA_SRC_INC_NONE | UDMA_DST_INC_16 |
    UDMA_ARB_1);
    
    ROM_uDMAChannelTransferSet (UDMA_SEC_CHANGE_ADC11 | UDMA_PRI_SELECT、
    UDMA_MODE_PINGONG、
    (void *)(ADC1_base + ADC_O_SSFIFO1)、
    G_adcBuf、ADC_buffer_size);
    ROM_uDMAChannelTransferSet (UDMA_SEC_CHANGE_ADC11 | UDMA_ALT_SELECT、
    UDMA_MODE_PINGONG、
    (void *)(ADC1_base + ADC_O_SSFIFO1)、
    G_adcBuf、ADC_buffer_size);
    
    ROM_uDMAChannelEnable (UDMA_SEC_CHANGE_ADC11);
    
    //启用中断(在这种情况下为 ADCIntEnableEx 而不是 ADCIntEnable)
    ROM_ADCIntEnableEx (ADC1_base、ADC_INT_DMA_SS1);
    ROM_IntEnable (INT_ADC1SS1);
    }
    
    int main (void)
    {
    //配置 CPU 以120MHz 和320MHz VCO 运行
    uint32_t g_cpuFrequency = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz | SYSCTL_OSC_MAIN |
    SYSCTL_USE_PLL | SYSCTL_CFG_VCO_320)、120000000);
    ROM_FPUEnable();
    ROM_FPULazyStackingEnable();
    
    //禁用中断以安全地配置外设
    ROM_IntMasterDisable();
    
    //启用外设
    initPeripheral();
    
    //configs UART 2 (Launchpad 跳线必须处于 CAN 位置、否则您需要将此函数重写到 UART0)
    CONFIG_UART2 (921600、g_cpuFrequency);
    
    //设置 PA 输出引脚以在每次 ADC 中断后更改状态
    ROM_GPIOPinTypeGPIOOutput (GPIO_Porta_base、GPIO_PIN_4 | GPIO_PIN_5);
    
    //清除屏幕并重置光标
    UARTprintf ("\033[2J\033[H");
    
    //启用 uDMA 错误中断
    ROM_IntEnable (INT_UDMAERR);
    
    //启用 UDMA
    ROM_uDMAEnable();
    
    ROM_uDMAControlBaseSet (dmaControlTable);
    
    //configs ADC
    CONFIG_ADC0DMA();
    CONFIG_ADC1DMA();
    
    //现在每个 periph 都已安全配置,我们可以启用中断
    ROM_IntMasterEnable();
    
    for (;;)
    {
    UARTprintf ("ADC 读数:%u %u 错误计数:%u\n"、g_adcBuf[0]、g_adcBuf[1]、g_uDMAErrCount);
    
    ROM_SysCtlDelay ((g_cpuFrequency/3)*0.1);
    }
    }
    
    void ADC0SS1IntHandler (void)
    {
    uint32_t ui32模式;
    
    //清除由 DMA 引起的 ADC 中断
    ADCIntClearEx (ADC0_BASE、ADC_INT_DMA_SS1);
    
    //检查 uDMA 主控制结构当前模式
    ui32Mode = ROM_uDMAChannelModeGet (UDMA_CHANGE_ADC1 | UDMA_PRI_SELECT);
    
    //如果 UDMA 主控制结构体完成了数据传输,请重新启用它
    if (ui32Mode = uDMA_MODE_STOP)
    ROM_uDMAChannelTransferSet (UDMA_CHANGE_ADC1 | UDMA_PRI_SELECT、
    UDMA_MODE_PINGONG、
    (void *)(ADC0_BASE + ADC_O_SSFIFO1)、
    G_adcBuf、ADC_buffer_size);
    
    //检查 uDMA 次级控制结构电流模式
    ui32Mode = ROM_uDMAChannelModeGet (UDMA_CHANGE_ADC1 | UDMA_ALT_SELECT);
    
    //如果 UDMA 次级控制结构体完成了数据传输,请重新启用它
    if (ui32Mode = uDMA_MODE_STOP)
    ROM_uDMAChannelTransferSet (UDMA_CHANGE_ADC1 | UDMA_ALT_SELECT、
    UDMA_MODE_PINGONG、
    (void *)(ADC0_BASE + ADC_O_SSFIFO1)、
    G_adcBuf、ADC_buffer_size);
    
    //切换引脚 PA5以使用示波器或逻辑分析仪对 ADC 电流速度进行分析
    ROM_GPIOPinWrite (GPIO_Porta_base、GPIO_PIN_4、g_flagAdc0? GPIO_PIN_4:0x00);
    G_flagAdc0 =!g_flagAdc0;
    }
    
    void ADC1SS1IntHandler (void)
    {
    uint32_t ui32模式;
    
    //清除由 DMA 引起的 ADC 中断
    ADCIntClearEx (ADC1_BASE、ADC_INT_DMA_SS1);
    
    //检查 uDMA 主控制结构当前模式
    ui32Mode = ROM_uDMAChannelModeGet (UDMA_SEC_CHANGE_ADC11 | UDMA_PRI_SELECT);
    
    //如果 UDMA 主控制结构体完成了数据传输,请重新启用它
    if (ui32Mode = uDMA_MODE_STOP)
    ROM_uDMAChannelTransferSet (UDMA_SEC_CHANGE_ADC11 | UDMA_PRI_SELECT、
    UDMA_MODE_PINGONG、
    (void *)(ADC1_base + ADC_O_SSFIFO1)、
    G_adcBuf、ADC_buffer_size);
    
    //检查 uDMA 次级控制结构电流模式
    ui32Mode = ROM_uDMAChannelModeGet (UDMA_SEC_CHANGE_ADC11 | UDMA_ALT_SELECT);
    
    //如果 UDMA 次级控制结构体完成了数据传输,请重新启用它
    if (ui32Mode = uDMA_MODE_STOP)
    ROM_uDMAChannelTransferSet (UDMA_SEC_CHANGE_ADC11 | UDMA_ALT_SELECT、
    UDMA_MODE_PINGONG、
    (void *)(ADC1_base + ADC_O_SSFIFO1)、
    G_adcBuf、ADC_buffer_size);
    
    //切换引脚 PA5以使用示波器或逻辑分析仪对 ADC 电流速度进行分析
    ROM_GPIOPinWrite (GPIO_Porta_base、GPIO_PIN_5、g_flagAdc1? GPIO_PIN_5:0x00);
    G_flagAdc1 =!g_flagAdc1;
    }
    
    void uDMAErrorHandler (void)
    {
    uint32_t ui32Status;
    
    ui32Status = ROM_uDMAErrorStatusGet ();
    
    if (ui32状态)
    {
    ROM_uDMAErrorStatusClear ();
    G_uDMAErrCount++;
    }
    }
    

    我还附加了 projet 文件。 希望它有所帮助、我不确定为什么没有"官方"的示例、只有 UART 示例。

    e2e.ti.com/.../0333.ADC_5F00_DMA.zip

    P.S. 在本例中、我只使用一个缓冲器来 ping 和 pong、但也可以使用 adcBufA 来 ping并使用 adcBufB 来 pong。 分离可能便于处理大型数据块。