#include"adc.h"
#include"delay.h"
void ADC1_2_IRQHandler()//中断进入函数
{
if(ADC1->SR&0X02)//标志位,表示转换完成
data=ADC1->DR; //读取数据会被自动清零
ADC1->CR2|=1<<22;//开始转换
}
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;//初始化复位校准寄存器
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;//开始转换
MY_NVIC_Init(2,1,ADC1_2_IRQChannel ,2);//设置中断优先级
//MY_NVIC_Init(2,1,EXTI0_IRQChannel ,2);//设置中断优先级
}
u16 show2()
{
u16 data;
ADC1->SQR3=16; //这个表明在第一规则通道当中,进行转换的将是16通道的数据
while(!(ADC1->SR&0X02));
data=ADC1->DR;
ADC1->CR2|=1<<22;//开始转换
return data;
}
u16 get_temp()
{
u8 i;
u16 temp=0;
for(i=0;i<10;i++)
{
temp+=show2();
delay_ms(5);
}
temp=temp/10;
return temp;
}
这是我们板子所自带的资料,我这里就是想开下ADC转换完成中断,允许中断,
MY_NVIC_Init(2,1,ADC1_2_IRQChannel ,2);//设置中断优先级
这句话是我们对于中断优先级的初始化,我这样设定之后,编译可以通过,但是在程序下载到板子上面之后,就会出现程序卡死在这里,而不能够去执行下面的语句!
如果我这样设置中断优先级
MY_NVIC_Init(2,1,EXTI0_IRQChannel ,2);//设置中断优先级
这个当然是与adc无关的,但是程序可以正常的执行,所以这里我就不清楚为什么设定ADC中断错误了,麻烦高手给个答案!谢谢了!
|