本帖最后由 xmu_stm 于 2014-8-15 16:44 编辑
现在利用stm32F4进行AD采样,双AD一共10个(1~10)通道,DMA每传送完这60个数据就会中断一次(每完成6遍AD过程发生一次DMA中断),中断处理完后会继续DMA传送。
DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_CDR_ADDR; //ADC1_CDR 地址
DMA_InitStructure.DMA_Memory0BaseAddr = (unsigned int)ADC_Value; //ADC_Value是一个60维数组
为了防止在DMA中断处理时AD转换的结果乱序,我想在中断函数中先停止ADC转换,当退出DMA中断时再重新启动ADC转换,像下面这样,DMA是循环模式,AD转换是连续规则转换,请各位看下问题在哪里,我这样读出来的值不对
void DMA2_Stream0_IRQHandler(void){
int i=0;
if(DMA_GetITStatus(DMA2_Stream0,DMA_IT_TCIF0))
{
ADC_Cmd(ADC1, DISABLE);
ADC_Cmd(ADC2, DISABLE);
for(i=0;i<10;i++)
{
local_size=(ADC_Value+ADC_Value[10+i]+ADC_Value[20+i]+ADC_Value[30+i]+ADC_Value[40+i]+ADC_Value[50+i])*(3.3/4096)/6;
}
flag_PID=1;
ADC_Cmd(ADC1, ENABLE);
ADC_Cmd(ADC2, ENABLE);
ADC_SoftwareStartConv(ADC1);
DMA_ClearITPendingBit(DMA2_Stream0,DMA_IT_TCIF0);
}
}
|