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.

[参考译文] DK-TM4C129X:带有 ADC 的 UDMA

Guru**** 2479915 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/697610/dk-tm4c129x-udma-with-adcs

器件型号:DK-TM4C129X

嘿、我正在浏览此帖子、因为我也遇到了类似的问题。 我正在使用交替模式的 UDMA 通过 ADC 对函数发生器的信号进行采样。 我已成功对信号进行采样、但在采样后、我正在计算该信号的 FFT。 在执行该操作时,我的程序不会到达代码的 FFT 部分,而是保留在 ADCseq0Handler()中。 我检查了您在 POST ADCISC 中先前建议的寄存器、它的值不为零。 但采样已正确完成。 那么、当我运行代码时会出现什么问题、为什么它会持续中断 ADCseq0handler?  

ADCseq0Handler:

uint32_t ui32模式;

ADCIntClearEx (ADC0_BASE、ADC_INT_DMA_SS0);
// uint32_t ui32Status = ADCIntStatus (ADC0_BASE、0、false);
//HWREG (ADC0_BASE_ADC_O_ISC)= ui32Status;

ui32Mode = uDMAChannelModeGet (UDMA_CHANGE_ADC0 | UDMA_PRI_SELECT);

if (ui32Mode = uDMA_MODE_STOP)
{

uDMAChannelTransferSet (UDMA_CHANGE_ADC0 | UDMA_PRI_SELECT、

UDMA_MODE_PINGONG、

(void *)(ADC0_BASE + ADC_O_SSFIFO0)、

G_ui8RxBufA、MEM_buffer_size);

uDMAChannelEnable (UDMA_CHANGE_ADC0);

}

ui32Mode = uDMAChannelModeGet (UDMA_CHANGE_ADC0 | UDMA_ALT_SELECT);

if (ui32Mode = uDMA_MODE_STOP)

{
uDMAChannelTransferSet (UDMA_CHANGE_ADC0 | UDMA_ALT_SELECT、

UDMA_MODE_PINGONG、

(void *)(ADC0_BASE + ADC_O_SSFIFO0)、

G_ui8RxBufB、MEM_buffer_size);

uDMAChannelEnable (UDMA_CHANGE_ADC0);

} 

主:


uint32_t sysclock;

SysClock = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |

SYSCTL_OSC_MAIN |

SYSCTL_USE_PLL |

SYSCTL_CFG_VCO_480)、120000000);


SysCtlPeripheralEnable (SYSCTL_Periph_UDMA);

while (!(SysCtlPeripheralReady (SYSCTL_Periph_UDMA)));

SysCtlPeripheralSlepEnable (SYSCTL_Periph_UDMA);

IntMasterEnable();

IntEnable (INT_UDMAERR);

uDMAEnable();

uDMAControlBaseSet (pui8ControlTable);

InitUART1传输(sysclock);


while (1)
{

}

InitUART1传输:
SysCtlPeripheralEnable (SYSCTL_Periph_ADC0);

while (!(SysCtlPeripheralReady (SYSCTL_Periph_ADC0)));

SysCtlPeripheralSlepEnable (SYSCTL_Periph_ADC0);

//ADCClockConfigSet (ADC0_BASE、ADC_CLOCK_SRC_PIOSC | ADC_CLOCK_RATE_FULL、1);
// ADCClockConfigSet (ADC0_BASE、ADC_CLOCK_SRC_PLL | ADC_CLOCK_RATE_FULL、 30);
ADCClockConfigSet (ADC0_BASE、ADC_CLOCK_SRC_PLL | ADC_CLOCK_RATE_FULL、24);

SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE);

while (!(SysCtlPeripheralReady (SYSCTL_Periph_GPIOE)));

GPIOPinTypeADC (GPIO_Porte _BASE、GPIO_PIN_3);
ADCSequenceConfigure (ADC0_BASE、0、ADC_TRIGGER_TIMER、0);

ADCSequenceStepConfigure (ADC0_BASE、0、0、ADC_CTL_CH0 | ADC_CTL_IE |
ADC_CTL_END);

ADCSequenceEnable (ADC0_BASE、0);

ADCIntClear (ADC0_BASE、0);

//启用计时器外设
SysCtlPeripheralEnable (SYSCTL_Periph_TIMER0);

//计时器应定期运行
TimerConfigure (TIMER0_BASE、TIMER_CFG_PERIODICASE);

//设置每次计时器完成时加载到计时器中的值
//这是计时器触发 ADC 之前所需的时钟周期数
//#define F_sample 1000
ui32Period = 1200000/1024000;
TimerLoadSet (TIMER0_BASE、TIMER_A、ui32Period-1);

//启用触发
TimerControlTrigger (TIMER0_BASE、TIMER_A、TRUE);

ADCIntEnable (ADC0_BASE、0);

//启用计时器
TimerEnable (TIMER0_BASE、TIMER_A);

ADCSequenceDMAEnable (ADC0_BASE、0);

uDMAChannelAttributeDisable (UDMA_CHANGE_ADC0、

UDMA_ATTR_ALTSELECT | UDMA_ATTR_USEBURST |

UDMA_ATTR_HIGH_PRIOR|

UDMA_ATTR_REQMASK);

uDMAChannelControlSet (UDMA_CHANGE_ADC0 | UDMA_PRI_SELECT、

UDMA_SIZE_32 | UDMA_SRC_INC_NONE | UDMA_DST_INC_32 | UDMA_NEW_USEBURST |

UDMA_ARB_1024);

uDMAChannelControlSet (UDMA_CHANGE_ADC0 | UDMA_ALT_SELECT、

UDMA_SIZE_32 | UDMA_SRC_INC_NONE | UDMA_DST_INC_32 | UDMA_NEW_USEBURST |

UDMA_ARB_1024);

uDMAChannelTransferSet (UDMA_CHANGE_ADC0 | UDMA_PRI_SELECT、

UDMA_MODE_PINGONG、

(void *)(ADC0_BASE + ADC_O_SSFIFO0)、

G_ui8RxBufA、MEM_buffer_size);


uDMAChannelTransferSet (UDMA_CHANGE_ADC0 | UDMA_ALT_SELECT、

UDMA_MODE_PINGONG、

(void *)(ADC0_BASE + ADC_O_SSFIFO0)、

G_ui8RxBufB、MEM_buffer_size);


uDMAChannelEnable (UDMA_CHANGE_ADC0);
ADCIntEnableEx (ADC0_BASE、ADC_INT_DMA_SS0);

对于(I = 0;I < 1024;I++)
{
/*执行从 LSB 到 MSB 的转换*/
BufferQ31[i]=((Q31_t) g_ui8RxBufB[i])<20;
}
ARM_Q31_TO_FLOAT (BufferQ31、fftin、1024);
arm_rfft_fast_instance_f32 S;

arm_rfft_fast_init_F32 (&S、1024);
arm_rfft_fast_F32 (&S、fftin、fftout、0);

arm_cmplx_mag_F32 (fftout、fftout、512);

arm_max_F32 (&fftout[1]、511、&maxValue、&maxindex);
maxindex++;

IntEnable (INT_ADC0SS0); 

 

 

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

    我附上了一个使用时间、ADC 和 UDMA 的工作示例。 将此项目导入您的工作区(File -> Import ->"CCS Projects" Next ->"Select archive file:")

    /cfs-file/__key/communityserver-discussions-components-files/908/7624.ADCwDMA.zip

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

    嗨、Bob、是的、这个项目工作正常、我的代码有什么问题? 似乎我获得了正确的采样输出、但代码进入 ADC 中断处理程序。 因此、我无法计算 FFT。

    此致、

    Harshul  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在您发布的代码和我提供的示例中、对 AtoD 进行连续采样。 是否在覆盖缓冲区(g_ui8RxBufA 或 g_ui8RxBufB)之前无法完成 FFT?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、这可能是问题所在。 我现在更改了我的代码、现在使用了另一个成功采样信号的代码。 我仍然无法在其中包含 FFT。 如何在覆盖缓冲区之前计算 FFT。 我也在不同的论坛上发布了该代码。 很抱歉在这里和那里发帖。 这里是它的链接。
    e2e.ti.com/.../696830