步骤都是按教程做的,可是不知道是哪里出错了,adc就是读不到数,反复检查了2天了,查不出问题所在。求原子哥和大神们帮下忙看看哪里出错了。
////////////////////下面是adc.c文件,使用pa3,adc用的是adc1 通道3
#include <adc.h>
#include <sys.h>
void ADC_INIT(void)
{
RCC->APB2ENR|=1<<2; //io a使能
GPIOA->CRL&=0XFFFF0FFF; //a7 为模拟输入
RCC->APB2ENR|=1<<9; //使能adc1时钟
RCC->APB2RSTR|=1<<9; //复位adc1时钟
RCC->APB2RSTR&=~(1<<9);
RCC->CFGR&=~(3<<14); //设置adc 时钟分频因子为6
RCC->CFGR|=2<<14;
ADC1->CR1&=0XF0FFFF; //工作模式清零,清零为独立模式
ADC1->CR1|=0<<16; //~~~~~~~
ADC1->CR1&=~(1<<8); //adc1非扫描模式
ADC1->CR2&=~(1<<1); //adc1单次转换
ADC1->CR2&=~(7<<17); //清空转换控制方式
ADC1->CR2|=7<<17; //选择软件控制转换
ADC1->CR2|=1<<20; //使用外部触发,swstart必须使用一个事件来触发
ADC1->CR2&=~(1<<11); //右对齐
ADC1->SQR1&=~(0X0F<<20); //清空转换规则序列,默认即为只转换序列1
ADC1->SQR1|=0<<20;
ADC1->SMPR2&=~(7<<9);//通道1采样时间清空
ADC1->SMPR2|=7<<9;//通道1采样时间239.5周期 ~~~~~~~~~
ADC1->CR2|=1<<0; //ADC1使能
ADC1->CR2|=1<<3; //ADC1使能复位校准
while(ADC1->CR2&1<<3);//等待复位校准结束
ADC1->CR2|=1<<2; //adc1 ad校准
while(ADC1->CR2&1<<2); //等待校准结束
}
u16 GETADC(u8 ch)
{
ADC1->SQR3&=0XFFFFFFE0; //设置序列1 为ch
ADC1->SQR3|=ch;
// ADC1->CR2|=1<<0; //~~~~~~~
ADC1->CR2|=1<<22;
// ADC1->CR2|=1<<0; //~~~~~~~
while(~ADC1->SR&0x02); //(特别注意这个取反)
return ADC1->DR;
}
////////////下面是adc.h内容
#ifndef __ADC_H
#define __ADC_H
#include <sys.h>
void ADC_INIT(void);
u16 GETADC(u8 ch);
#endif
//////////////////////////////main.c里面用一下程序调用,可是dr读到数永远为0
adc_back=GETADC(3);
TIM4->CCR1=(adc_back-1650)/2446+60;
求原子哥和各位大神们帮忙看看问题到底出在哪里啊,万分感谢
|