器件型号: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);