新手上路
- 积分
- 34
- 金钱
- 34
- 注册时间
- 2013-11-13
- 在线时间
- 0 小时
|

楼主 |
发表于 2013-11-13 11:11:43
|
显示全部楼层
应该不会的,我配置PA11就可以,以同样的方式配置PB11就不行了,PC11也不行。
下面是我的ADC初始化程序,原子给看看吧。底层的那些系统函数用的都是你们例程提供的。
//初始化ADC
void ADC_Init(void)
{
//先初始化IO口
RCC->APB2ENR|=1<<2; //使能PORTA口时钟
RCC->APB2ENR|=1<<3; //使能PORTB口时钟
GPIOA->CRL&=0X000000FF; //PA2、PA3、PA4、PA5、PA6、PA7 anolog输入
GPIOB->CRH&=0XFFFF0FFF;
GPIOB->CRH|=0X00008000; //PB11 上拉/下拉输入
//通道设置
RCC->APB2ENR|=1<<9; //ADC1时钟使能
RCC->APB2RSTR|=1<<9; //ADC1复位
RCC->APB2RSTR&=~(1<<9);//复位结束
RCC->CFGR&=~(3<<14); //分频因子清零
//SYSCLK/DIV2=8M ADC时钟设置为8M,ADC最大时钟不能超过14M!
//否则将导致ADC准确度下降!
RCC->CFGR|=3<<14; //8分频
ADC1->CR1&=0XF0FFFF; //工作模式清零
ADC1->CR1|=6<<16; //规则同步模式
ADC1->CR1|=1<<8; //扫描模式 扫描选中的通道
ADC1->CR2|=0<<1; //单次转换模式
ADC1->CR2&=~(7<<17);
ADC1->CR2|=6<<17; //EXTI线PB11控制转换
ADC1->CR2|=1<<20; //使用用外部触发,必须使用一个事件来触发
ADC1->CR2&=~(1<<11); //右对齐
ADC1->SQR1&=~(0XF<<20);
ADC1->SQR1|=0X5<<20; //6个转换在规则序列中
//设置通道的采样时间
ADC1->SMPR2&=~(7<<6); //通道2采样时间清空
ADC1->SMPR2|=7<<6; //通道2 239.5周期,提高采样时间可以提高精确度
ADC1->SMPR2&=~(7<<9); //通道3采样时间清空
ADC1->SMPR2|=7<<9; //通道3 239.5周期,提高采样时间可以提高精确度
ADC1->SMPR2&=~(7<<12); //通道4采样时间清空
ADC1->SMPR2|=7<<12; //通道4 239.5周期,提高采样时间可以提高精确度
ADC1->SMPR2&=~(7<<15); //通道5采样时间清空
ADC1->SMPR2|=7<<15; //通道5 239.5周期,提高采样时间可以提高精确度
ADC1->SMPR2&=~(7<<18); //通道6采样时间清空
ADC1->SMPR2|=7<<18; //通道6 239.5周期,提高采样时间可以提高精确度
ADC1->SMPR2&=~(7<<21); //通道7采样时间清空
ADC1->SMPR2|=7<<21; //通道7 239.5周期,提高采样时间可以提高精确度
ADC1->SQR3&=~(0x1f<<0);
ADC1->SQR3|=2<<0; //通道2
ADC1->SQR3&=~(0x1f<<5);
ADC1->SQR3|=3<<5; //通道3
ADC1->SQR3&=~(0x1f<<10);
ADC1->SQR3|=4<<10; //通道4
ADC1->SQR3&=~(0x1f<<15);
ADC1->SQR3|=5<<15; //通道5
ADC1->SQR3&=~(0x1f<<20);
ADC1->SQR3|=6<<20; //通道6
ADC1->SQR3&=~(0x1f<<25);
ADC1->SQR3|=7<<25; //通道7
ADC1->CR2|=1<<0; //开启ADC并启动转换
ADC1->CR2|=1<<3; //使能复位校准
while(ADC1->CR2&1<<3); //等待校准结束
//该位由软件设置并由硬件清除。在校准寄存器被初始化后该位将被清除。
ADC1->CR2|=1<<2; //开始AD校准
while(ADC1->CR2&1<<2); //等待校准结束
//该位由软件设置以开始校准,并在校准结束时由硬件清除
ADC1->CR2|= 1<<8 ; //使用DMA模式转换
ADC1->CR2|=1<<22; //启动规则转换通道
ADC1->CR2|=0<<0; //关闭AD转换
} |
|