ADC+DMA,为什么只能读取一次转换的结果?

2019-07-21 01:43发布

[mw_shl_code=c,true]/*ADC1三个通道,DMA方式,但是只能传一次数据,请各位大神帮帮忙*/ /*DMA相关的函数是使用正点原子老师的寄存器版本的函数*/ /*ADC1初始化*/ void ADC1_Initial() { /*相关IO口初始化*/ RCC->AHB1ENR|=1<<0; //使能端口A时钟 GPIO_Set(GPIOA,PIN4|PIN5|PIN6,GPIO_MODE_AIN,0,0,GPIO_PUPD_PU); /*ADC1初始化*/ RCC->APB2ENR|=1<<8; //使能ADC1时钟 RCC->APB2RSTR|=1<<8; //复位所有ADC RCC->APB2RSTR&=~(1<<8); //复位结束 ADC->CCR|=3<<16; //8分频 ADC1->CR1&=~(3<<24); //分辨率12位(15ADCCLK周期) ADC1->CR1|=1<<8; //扫描模式 ADC1->CR2&=~(3<<28); //禁止规则通道的外部触发检测 ADC1->CR2&=~(1<<11); //数据右对齐 ADC1->CR2|=1<<9; //DMA模式 ADC1->CR2|=1<<8; //DMA模式 ADC1->CR2|=1<<1; //连续转换模式 ADC1->SQR1|=2<<20; //规则通道转换序列中的转换总数为3(3个转换在规则序列中) ADC1->SQR3|=4; //规则序列中的第1次转换,通道4 ADC1->SQR3|=5<<5; //规则序列中的第2次转换,通道5 ADC1->SQR3|=6<<10; //规则序列中的第3次转换,通道6 ADC1->SMPR2|=7<<12; //通道4采样时间480个周期 ADC1->SMPR2|=7<<15; //通道5采样时间480个周期 ADC1->SMPR2|=7<<18; //通道6采样时间480个周期 ADC1->CR2|=1<<0; //使能ADC1 ADC1->CR2|=1<<30; //开始转换规则通道 } /*主函数*/ void main() { Stm32_Clock_Initial(26,336,2,7); Delay_Initial(168); ADC1_Initial(); DMA_Config(DMA2_Stream0,0,(u32)&ADC1->DR,(u32)Buffer,3); while(1) { DMA_Enable(DMA2_Stream0,3); //开始一次DMA传输 //等待DMA传输完成,实际应用中,输数据期间,以执行另外的任务 while(1) //第2次进入该循环后就无法退出了,????????????????????????????? { if(DMA2->LISR&(1<<5)) //等待DMA2_Steam0传输完成 { DMA2->LIFCR|=1<<5; //清除DMA2_Steam0传输完成标志 break; } } //进行显示处理(略) } } [/mw_shl_code]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。