1.打开一个adc
这个选auto和manual都可以
dma中断
2.定时器控制采样周期
再回到adc中配置触发源
3.代码部分(可以看看)
tim+adc+dma+fft
#include "ti_msp_dl_config.h" #include "arm_math.h" #include "arm_const_structs.h" #include "window_func.h" #include "9959.h" #define NUM_SAMPLES 1024 uint16_t gFFTOutput[NUM_SAMPLES]; uint16_t gFFTInput[NUM_SAMPLES*2]; uint16_t gADCSamples[NUM_SAMPLES]; uint16_t gFFTmaxValue; uint16_t gFFTmaxFreqIndex; volatile bool gCheckDMA; float scale_factor = 32767.0f / 2048.0f; int32_t scaled_value; void delay_ms(uint32_t ms); void fft_process(); int main(void) { SYSCFG_DL_init(); gCheckDMA=false; // AD9959_Init(); //初始化控制AD9959需要用到的IO口,及寄存器 // AD9959_Set_Fre(CH0, 4990000); //设置通道0频率100000Hz // AD9959_Set_Fre(CH1, 100000); //设置通道1频率100000Hz // AD9959_Set_Fre(CH2, 100000); //设置通道2频率100000Hz // AD9959_Set_Fre(CH3, 100000); //设置通道3频率100000Hz // AD9959_Set_Amp(CH0, 1023); //设置通道0幅度控制值1023,范围0~1023 // AD9959_Set_Amp(CH1, 1023); //设置通道1幅度控制值1023,范围0~1023 // AD9959_Set_Amp(CH2, 1023); //设置通道2幅度控制值1023,范围0~1023 // AD9959_Set_Amp(CH3, 1023); //设置通道3幅度控制值1023,范围0~1023 // AD9959_Set_Phase(CH0, 0); //设置通道0相位控制值0(0度),范围0~16383 // AD9959_Set_Phase(CH1, 4096); //设置通道1相位控制值4096(90度),范围0~16383 // AD9959_Set_Phase(CH2, 8192); //设置通道2相位控制值8192(180度),范围0~16383 // AD9959_Set_Phase(CH3, 12288); //设置通道3相位控制值12288(270度),范围0~16383 // my_Update(); DL_DMA_setSrcAddr(DMA, DMA_CH0_CHAN_ID,(uint32_t) 0x40556280); DL_DMA_setDestAddr(DMA, DMA_CH0_CHAN_ID,(uint32_t) gADCSamples); DL_DMA_enableChannel(DMA, DMA_CH0_CHAN_ID); NVIC_EnableIRQ(ADC12_0_INST_INT_IRQN); while (1) { while(gCheckDMA==false); fft_process(); gCheckDMA=false; DL_TimerA_startCounter(TIMER_0_INST); } } /*--------------------------中断--------------------------*/ void ADC12_0_INST_IRQHandler(void) { switch (DL_ADC12_getPendingInterrupt(ADC12_0_INST)) { case DL_ADC12_IIDX_DMA_DONE: gCheckDMA=true; DL_TimerA_stopCounter(TIMER_0_INST); break; default: break; } } //--------------------------辅助函数--------------------------// /*fft处理*/ void fft_process() { q15_t window[NUM_SAMPLES]; // 窗系数缓冲区 // 1. 生成窗系数(例如汉宁窗) generate_window_q15(window, NUM_SAMPLES, WINDOW_HANNING); // 2. 将ADC数据转为Q15复数(实部+虚部) for (int i = 0; i < NUM_SAMPLES; i++) { scaled_value = (int32_t)((gADCSamples[i] - 2048) * scale_factor); scaled_value = (scaled_value > 32767) ? 32767 : (scaled_value < -32767) ? -32767 : scaled_value; gFFTInput[2*i] = (q15_t)scaled_value; // 实部 gFFTInput[2*i+1] = 0; // 虚部 } // 3. 应用窗函数 apply_window_q15((q15_t*)gFFTInput, window, NUM_SAMPLES); // 4. 执行FFT及后续步骤 arm_cfft_q15(&arm_cfft_sR_q15_len1024, (q15_t*)gFFTInput, 0, 1); arm_cmplx_mag_q15((q15_t*)gFFTInput, (q15_t*)gFFTOutput, NUM_SAMPLES); arm_max_q15((q15_t*)gFFTOutput, NUM_SAMPLES, (q15_t*)&gFFTmaxValue, (uint32_t*)&gFFTmaxFreqIndex); } void delay_ms(uint32_t ms) { while(ms--) delay_cycles(CPUCLK_FREQ/1000); }