规则通道顺序第一次CH1第二次CH2第三次CH3 寄存器版本
下面上代码
先来DMA的
void DMA_ADC1_Init(void)
{
RCC->AHBENR|=1<<0; //开启DMA1时钟
//发送DMA模式
DMA1_Channel1->CCR=0;
DMA1_Channel1->CCR&=~(1<<0);// 关闭存储器
DMA1_Channel1->CCR&=~(1<<1);//禁止传输完成中断 TCIE
DMA1_Channel1->CCR&=~(1<<2);//禁止半传输中断 HCIE
DMA1_Channel1->CCR&=~(1<<3);//禁止传输错误中断 TEIE
DMA1_Channel1->CCR&=~(1<<4); //从外设读
DMA1_Channel1->CCR&=~(1<<5);//不执行循环
DMA1_Channel1->CCR&=~(1<<6);//
DMA1_Channel1->CCR|=1<<7;//存储器地址增量模式
DMA1_Channel1->CCR&=~(1<<9);//
DMA1_Channel1->CCR|=(1<<8);// 外设数据宽度16位
DMA1_Channel1->CCR&=~(1<<11);//
DMA1_Channel1->CCR|=(1<<10);//存储器数据宽度16位
DMA1_Channel1->CCR|=1<<12;
DMA1_Channel1->CCR|=1<<13; //PL优先级最高
DMA1_Channel1->CCR&=~(1<<14);// 非存储器到存储器模式
}
void DMA_ADC1_EN(u32 length,u32 cmar)
{
DMA1_Channel1->CCR&=~(1<<0);
DMA1_Channel1->CNDTR=length;//在存储器关闭时修改 0-65536(ffff) 待传输字节数目
DMA1_Channel1->CPAR=(u32)&ADC1->DR;//外设地址 UART_DR数据寄存器地址
DMA1_Channel1->CMAR=cmar;//数据存储器地址 ,数据内存地址例如数组首字节
DMA1_Channel1->CCR|=1<<0; //打开DMA传输
}
DMA1_Channel1为map文件定义的对应DMA ADC1
再来ADC的
void Adc_Init(void)
{
//先初始化IO口
RCC->APB2ENR|=1<<2; //使能PORTA口时钟
GPIOA->CRL&=0XFFFF000F;//PA1 PA2 PA3 anolog输入 3路ADC
RCC->APB2ENR|=1<<9; //ADC1时钟使能
RCC->APB2RSTR|=1<<9; //ADC1复位
RCC->APB2RSTR&=~(1<<9);//复位结束
RCC->CFGR&=~(3<<14); //分频因子清零
RCC->CFGR|=2<<14; //SYSCLK/DIV2=12M ADC时钟设置为12M,ADC最大时钟不能超过14M!
//否则将导致ADC准确度下降!
ADC1->CR1=0; //全部清零,需要哪个功能自己配置
ADC1->CR1|=(1<<8); //扫描模式
ADC1->CR1&=~(0<<16); //16-19独立工作模式
ADC1->CR2=0; //全部清零,需要哪个功能自己配置
ADC1->CR2&=~(1<<1); //单次转换模式
ADC1->CR2|=1<<8; //DMA模式
ADC1->CR2&=~(1<<11); //右对齐
ADC1->CR2|=7<<17; //软件控制转换——SWSTART
ADC1->CR2|=1<<20; //使用用外部触发 必须使用一个事件来触发 (这个是必要的吗?Y)
ADC2->SMPR2&=~(7<<3); //通道1采样时间清空
ADC2->SMPR2|=7<<3; //通道1 239.5周期,提高采样时间可以提高精确度
ADC2->SMPR2&=~(7<<6); //通道2采样时间清空
ADC2->SMPR2|=7<<6; //通道2 239.5周期,提高采样时间可以提高精确度
ADC2->SMPR2&=~(7<<9); //通道3采样时间清空
ADC2->SMPR2|=7<<9; //通道3 239.5周期,提高采样时间可以提高精确度
ADC1->SQR1|=1<<21; //规则序列中三个转换
ADC1->SQR3|=1<<0; //第一个转换通道1
ADC1->SQR3|=2<<5; //第二个转换通道2
ADC1->SQR3|=3<<10; //第三个转换通道3
//设置通道1的采样时间
ADC1->CR2|=1<<0; //开启AD转换器
ADC1->CR2|=1<<3; //使能复位校准
while(ADC1->CR2&1<<3); //等待校准结束
//该位由软件设置并由硬件清除。在校准寄存器被初始化后该位将被清除。
ADC1->CR2|=1<<2; //开启AD校准
while(ADC1->CR2&1<<2); //等待校准结束
//该位由软件设置以开始校准,并在校准结束时由硬件清除
}
ADC1->CR2|=1<<22; //启动规则转换通道
运行上面这句即可,启动ADC--->DMA自动转换--->数据存入数组
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
DMA_ADC1_EN(10,adc_value_2channel);
出现错误:
mytest.c(41): error: #167: argument of type "u32 *" is incompatible with parameter of type "u32"
怎么解啊??
第一个地址怎么找,不是数组名吗?
一周热门 更多>