ccs adc+tim+dma

ccs adc+tim+dma
1.打开一个adc这个选auto和manual都可以dma中断2.定时器控制采样周期再回到adc中配置触发源3.代码部分可以看看timadcdmafft#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(); gCheckDMAfalse; // 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(gCheckDMAfalse); fft_process(); gCheckDMAfalse; 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: gCheckDMAtrue; 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*i1] 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); }