[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]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>