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.

[参考译文] TM4C1294NCPDT:ADC DMA 问题

Guru**** 2524460 points
Other Parts Discussed in Thread: EK-TM4C1294XL

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/969778/tm4c1294ncpdt-adc-dma-issue

器件型号:TM4C1294NCPDT
Thread 中讨论的其他器件:EK-TM4C1294XL

您好!

我想在乒乓模式下使用具有 DMA 的多通道 ADC、因为我的应用需要多个模拟信号监控、在这种情况下、DMA 是必需的、我配置了 ADC 和 DMA、但在 ISR 中、它卡在 udmaterset()函数中。  配置中是否存在任何问题、请提供帮助、

此致、

Sandeep Kore

以下是我的代码

#include 
#include 

include "inc/hw_ints.h"
#include "inc/hw_memmap.h"
#include "inc/hw_adc.h"
#include "inc/hw_types.h"
#include "inc/hw_udma.h"
#include "driverlib_driverlib_driver/h"













(#driverlib_driverlib_driverf.h)#include "driverlib_driverlib_driverf.dlpina.mature/driver32.h (#include "driverlib_driverlib_driverlib_driverlib_driverlib"(#driverlib#driverlib_driverlib_driverf.dlpina.h")#include "#driverlib_drivers.dlpin.dlpin.dlpin.dlpin.dlpin.dlpin.dlpin.dlpin.in.in.dlpin.in.in.dlpin.in.dlpin.in.in.dlpin.in.dl_ude/drivers.in.in.dlpin.dl./


静态 uint32_t g_ui32RxBufBCount = 0;
枚举缓冲区状态
{
空、
灌装、
Full
};
uint32_t pui32ADC0Value[8];
//静态枚举缓冲区状态 pui32BufferStatus[2];
bool bufCtr = 0;
静态 uint32_t g_ui32uDMAErrCount = 0;

空 uDMAErrorHandler (void)
{
uint32_t ui32Status;

ui32Status = uDMAErrorStatusGet ();

if (ui32状态)
{
uDMAErrorStatusClear ();
G_ui32uDMAErrCount++;
}
}

空
UART0IntHandler (空)
{
uint32_t ui32模式;

ui32Mode = uDMAChannelModeGet (UDMA_CHANGE_UART0RX | UDMA_PRI_SELECT);

if (ui32Mode = uDMA_MODE_STOP)
{
G_ui32RxBufACount++;

uDMAChannelTransferSet (UDMA_CHANGE_ADC0 | UDMA_PRI_SELECT、UDMA_MODE_PINGONG、(void *)(ADC0_BASE + ADC_O_SSFIFO0)、ADC_OUT_1、8);

}

ui32Mode = uDMAChannelModeGet (UDMA_CHANGE_UART0RX | UDMA_ALT_SELECT);

if (ui32Mode = uDMA_MODE_STOP)
{
G_ui32RxBufBCount++;

uDMAChannelTransferSet (UDMA_CHANGE_ADC0 | UDMA_ALT_SELECT、UDMA_MODE_PINGONG、(void *)(ADC0_BASE + ADC_O_SSFIFO0)、ADC_OUT_2、8);
}

IF (uDMAChannelIsEnabled (UDMA_CHANGE_ADC0))
{
uDMAChannelTransferSet (UDMA_CHANGE_ADC0 | UDMA_PRI_SELECT、UDMA_MODE_BASIC、(void *)(ADC0_BASE + ADC_O_SSFIFO0)、ADC_OUT_1、8);

uDMAChannelEnable (UDMA_CHANGE_ADC0);
}
}
void ADCseq0Handler (void)
{
//
//清除中断标志。
//
// ADCIntClear (ADC0_BASE、0);
uint32_t ui32Mode = uDMAChannelModeGet (UDMA_CHANGE_ADC0);
if (ui32Mode = 4)
{
bufCtr = 1;
uDMAChannelTransferSet (UDMA_CHANGE_ADC0 | UDMA_PRI_SELECT、UDMA_MODE_PINGONG、(void *)(ADC0_BASE + ADC_O_SSFIFO0)、ADC_OUT_1、8);
}
否则、如果(ui32Mode = 4)
{
bufCtr = 0;
uDMAChannelTransferSet (UDMA_CHANGE_ADC0 | UDMA_ALT_SELECT、UDMA_MODE_PINGONG、(void *)(ADC0_BASE + ADC_O_SSFIFO0)、ADC_OUT_2、8);
}

uDMAChannelEnable (UDMA_CHANGE_ADC0);
uDMAChannelRequest (UDMA_CHANGE_ADC0);
}

void InitUDMA (void)
{


uDMAEnable();//启用 UDMA
uDMAControlBaseSet (udmaCtrlTable);
//IntEnable (INT_UDMA);
uDMAChannelAttributeDisable (UDMA_CHANGE_ADC0、UDMA_ATTR_ALL);

//配置通道控制表的基地址。 表驻留在系统内存中并保持控制
// 每个 UDMA 通道的信息。 表必须在1024字节边界上对齐。 基地址必须为
// 任何通道功能之前配置
uDMAChannelAttributeEnable (UDMA_CHANGE_ADC0、UDMA_ATTR_USEBURST);


uDMAChannelControlSet (UDMA_CHANNEL_ADC0 | UDMA_PRI_SELECT、UDMA_SIZE 32 | UDMA_SRC_INC_NONE | UDMA_DST_INC_32 | UDMA_NEW_USEBURST | UDMA_CHCTL_ARBSIZE_1);
uDMAChannelControlSet (UDMA_CHANNEL_ADC0 | UDMA_ALT_SELECT、UDMA_SIZE_32 | UDMA_SRC_INC_NONE | UDMA_DST_INC_32 | UDMA_NEW_USEBURST | UDMA_CHCTL_ARBSIZE_1);

uDMAChannelTransferSet (UDMA_CHANGE_ADC0 | UDMA_PRI_SELECT、UDMA_MODE_PINGONG、(void *)(ADC0_BASE + ADC_O_SSFIFO0)、ADC_OUT_1、8);
uDMAChannelTransferSet (UDMA_CHANGE_ADC0 | UDMA_ALT_SELECT、UDMA_MODE_PINGONG、(void *)(ADC0_BASE + ADC_O_SSFIFO0)、ADC_OUT_2、8);

// uDMAChannelEnable (UDMA_CHANGE_ADC0);//启用 DMA 通道以便它可以执行传输
uDMAChannelEnable (UDMA_CHANGE_ADC0);
uDMAChannelRequest (UDMA_CHANGE_ADC0);

//IntEnable (INT_UDMA);
//uDMAIntRegister (INT_UDMA、uDMAIntHandler);
//IntMasterEnable();



}

void InitConsole (void)
{
SysCtlPeripheralReset (SYSCTL_Periph_ADC0);
SysCtlPeripheralEnable (SYSCTL_Periph_ADC0);
//SysCtlPeripheralEnable (SYSCTL_Periph_ADC1);
SysCtlPeripheralReset (SYSCTL_Periph_UDMA);
SysCtlPeripheralEnable (SYSCTL_Periph_UDMA);

SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE);
GPIOPinTypeADC (GPIO_Porte _BASE、GPIO_PIN_3);
GPIOPinTypeADC (GPIO_Porte _BASE、GPIO_PIN_2);
GPIOPinTypeADC (GPIO_Porte _BASE、GPIO_PIN_1);
GPIOPinTypeADC (GPIO_Porte _BASE、GPIO_PIN_0);

SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD);
GPIOPinTypeADC (GPIO_PORTD_BASE、GPIO_PIN_0);
GPIOPinTypeADC (GPIO_PORTD_BASE、GPIO_PIN_1);

SysCtlPeripheralEnable (SYSCTL_Periph_GPIOK);
GPIOPinTypeADC (GPIO_PORTK_base、GPIO_PIN_0);
GPIOPinTypeADC (GPIO_PORTK_base、GPIO_PIN_1);

IntDisable (INT_ADC0SS0);
ADCIntDisable (ADC0_BASE、0);
ADCSequenceDisable (ADC0_BASE、0);

//ADCIntClearEx (ADC0_BASE、ADC_INT_DMA_SS0);
ADCSequenceConfigure (ADC0_BASE、0、ADC_TRIGGER_ALE一直、0);
ADCSequenceStepConfigure (ADC0_BASE、0、0、ADC_CTL_CH0);
ADCSequenceStepConfigure (ADC0_BASE、0、1、ADC_CTL_CH1);
ADCSequenceStepConfigure (ADC0_BASE、0、2、ADC_CTL_CH2);
ADCSequenceStepConfigure (ADC0_BASE、0、3、ADC_CTL_CH3);
ADCSequenceStepConfigure (ADC0_BASE、0、4、ADC_CTL_CH14);
ADCSequenceStepConfigure (ADC0_BASE、0、5、ADC_CTL_CH15);
ADCSequenceStepConfigure (ADC0_BASE、0、6、ADC_CTL_CH16);
ADCSequenceStepConfigure (ADC0_BASE、0、7、ADC_CTL_CH17|ADC_CTL_END);

ADCHardwareOversampleConfigure (ADC0_BASE、64);
ADCSequenceDMAEnable (ADC0_BASE、0);
ADCSequenceEnable (ADC0_BASE、0);

ADCIntEnableEx (ADC0_BASE、ADC_INT_DMA_SS0);//由于 ADC 采样序列0上的 DMA 而启用 ADC 中断源
IntEnable (INT_ADC0SS0);
ADCIntRegister (ADC0_BASE、0、ADCSeq0Handler);
IntMasterEnable();

}

int main (void)
{

uint32_t ui32SysClock;
ui32SysClock = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |SYSCTL_OSC_MAIN)、25000000);
//uint32_t ui32Mode = uDMAChannelModeGet (UDMA_CHANGE_ADC0);
InitConsole();
InitUDMA();

while (1)
{
//ADCProcessorTrigger (ADC0_BASE、0);
//ADCIntClear (ADC0_BASE、1);
//ADCSequenceDataGet (ADC0_BASE、0、pui32ADC0Value);
//ADCSequenceDataGet (ADC1_base、2、pui32ADC1Value);
// SysCtlDelay (ui32SysClock / 12);
//uint32_t ui32Mode = uDMAChannelModeGet (UDMA_CHANGE_ADC0);

}
}

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

    您好!

    这里有几个问题需要从以下方面开始:

    1) 1)您是否了解 了 EK-TM4C1294XL LaunchPad 的 ADC_UDMA_Pingpong 示例? 它会执行 ADC DMA Ping Pong、您所缺少的就是 UART、它...

    2) 2)您有 UART ISR、但没有 UART 配置? 此时是否需要 ISR? 或者、我是否错过了您的配置?

    3) 3)您是否卡在 带有 uDMAChannelTransferSet 的 ADCSeq0Handler 中?

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

    您好!

    我正在尝试在 ADC 处理程序中继续读取 UDMA。 问题现已解决 UDMA 连续读取。