中级会员
 
- 积分
- 227
- 金钱
- 227
- 注册时间
- 2012-8-10
- 在线时间
- 2 小时
|
发表于 2012-9-12 09:05:41
|
显示全部楼层
我来解决吧
u16 Receive[3];//你可以改成7,因为你要7路采集
dma_init(DMA1_Channel1,(u32)&Receive,(u32)&ADC1->DR,sizeof(Receive)); //调用下面的函数
void dma_init(DMA_Channel_TypeDef*dma_number,u32 masteraddr,u32 slaveaddr,u16 number)
{
//u32 p;
//p=slaveaddr;
m=number;
RCC->AHBENR|=1<<0;//打开dma时钟
delay_us(5);
dma_number->CCR|=0<<4; //从外设读取数据
dma_number->CMAR=(u32)masteraddr; //存储器地址
dma_number->CPAR=(u32)slaveaddr; //做缓冲使用,外设地址
dma_number->CNDTR=number;//代表dma通道传数输据的个数
dma_number->CCR|=1<<7;//存储器地址增量模式,因为只有为增量,才能够使得每次
//dma_number->CCR|=1<<6;//从存储器读取数据的时,地址指针可自动加1
dma_number->CCR|=1<<8;//外设数据宽度为16位
dma_number->CCR|=1<<10;//存储器数据宽度为16位
dma_number->CCR|=2<<12;//dma优先级高
dma_number->CCR|=1<<5; //执行循环模式(CMAR和CPAR也重新赋初值)
dma_number->CCR|=(1<<0); //开启dma传输
}
最关键的地方
void adc_init()
{
RCC->APB2ENR|=1<<2|1<<9; //开启PA时钟 ,以及ADC时钟
RCC->APB2RSTR|=1<<9;//复位adc1
RCC->APB2RSTR&=~(1<<9);//复位完成,需要将复位关闭,否则将一直保持复位
RCC->CFGR|=1<<15;//设置为6分频给ADC转换时钟 //读取ADC0的值
GPIOA->ODR=1<<0|1<<1;//设置PA0口为模拟上拉输入,PA1口模拟上拉输入
ADC1->CR2|=1<<20;//允许软件外部触发
ADC1->CR2|=1<<19|1<<18|1<<17;//选择为软件触发
ADC1->SMPR1=0X1c0000; //为了提高精度,1通道以及16通道
ADC1->SMPR2=0X3f; //通道0,1采样间隔为最大
ADC1->CR2|=1<<23;//开启内部温度传感器
ADC1->CR2|=1<<0;//开启转换
ADC1->CR1|=1<<8;//开启扫描模式
ADC1->CR2|=1<<3;//初始化复位校准寄存器
ADC1->CR2|=1<<8;//允许dma访问
while(ADC1->CR2&1<<3); //等待校准结束
ADC1->CR2|=1<<2;//开始校准
while(ADC1->CR2&1<<2); //等待校准结束
//ADC1->CR1|=1<<5;//允许中断
ADC1->CR2|=1<<1;//设置为连续模式
ADC1->SQR1|=2<<20;//开启三个转换
ADC1->CR2|=1<<22;//开始规则转换
// MY_NVIC_Init(2,1,ADC1_2_IRQChannel,2);//设置中断优先级
ADC1->SQR3=0|(16<<5)|(1<<10); //这个表明在第一规则通道当中,进行转换的将是16通道的数据
//通道0,1以及通道16转换 (转换顺序是通道0,通道16,通道1) 你这里应该要设7个,对于ADC->SQRx你能真正理解了吗??不然你还是不会
}
好了,有什么问题在咨询我吧 qq:741569205 |
|