adc_init();
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;//设置PA0口为模拟上拉输入
ADC1->CR2|=1<<20;//允许软件外部触发
ADC1->CR2|=1<<19|1<<18|1<<17;//选择为软件触发
ADC1->SMPR1=0X1c0000; //为了提高精度,1通道以及16通道
ADC1->SMPR2=0X07; //为了提高精度,1通道以及16通道
ADC1->CR2|=1<<23;//开启内部温度传感器
ADC1->CR2|=1<<0;//开启转换
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->CR2|=1<<22;//开始转换
ADC1->SQR3=16; //这个表明在第一规则通道当中,进行转换的将是16通道的数据
}
dma_init(DMA1_Channel1,(u32)&Receive,(u32)&ADC1->DR,16);
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时钟
dma_number->CCR|=0<<4; //从外设读取数据
dma_number->CMAR=masteraddr; //存储器地址
dma_number->CPAR=p; //做缓冲使用,外设地址
dma_number->CCR|=1<<8;//外设数据宽度为16位
dma_number->CCR|=1<<10;//存储器数据宽度为16位
dma_number->CCR|=2<<12;//dma优先级高
dma_number->CCR|=1<<5; //执行循环模式
dma_number->CCR|=(1<<0); //开启dma传输
}
void main()
{
u16 Receive,adc_dat;
//省略了前面的初始化的内容
adc_init();
dma_init(DMA1_Channel1,(u32)&Receive,(u32)&ADC1->DR,16);
while(1)
{
adc_dat=Receive;
}
}
这是我写的读寄存器内部温度的程序,如果不用dma传输,直接读取ADC1->DR是直接可以读取到的
但是我使用DMA传输了,却读不到adc_dat,实际验证,并没有进行DMA传输,一直为0,我在初始化adc的时候,开启了dma请求的允许,在dma初始化的时候,最后也开启了dma传输!我想知道这是为什么呢,是我哪里设置错误了,为啥一直读取不到数据呢
谢谢了!
|