OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 11553|回复: 10

ADC中断初始化问题

[复制链接]

109

主题

1606

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2222
金钱
2222
注册时间
2011-12-15
在线时间
37 小时
发表于 2012-2-13 16:09:16 | 显示全部楼层 |阅读模式

#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中断错误了,麻烦高手给个答案!谢谢了!

专业制作STM32 物联网通信模块板,模块交流群:369840039。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

109

主题

1606

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2222
金钱
2222
注册时间
2011-12-15
在线时间
37 小时
 楼主| 发表于 2012-2-13 16:29:56 | 显示全部楼层
就是当我//MY_NVIC_Init(2,1,ADC1_2_IRQChannel ,2);//设置中断优先级
屏蔽之后,adc中断就可以正常进入了,这难道是MY_NVIC_Init(2,1,ADC1_2_IRQChannel ,2);//设置中断优先级
这句话设定有问题吗
专业制作STM32 物联网通信模块板,模块交流群:369840039。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-2-13 17:12:28 | 显示全部楼层
.s文件里面
ADC的中断服务函数是这么定义的:
                DCD     ADC_IRQHandler            ; ADC
你自己定义了一个:
void  ADC1_2_IRQHandler()
你在.s文件里面是否做了相应的修改呢?
如果没有,必死机...
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

109

主题

1606

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2222
金钱
2222
注册时间
2011-12-15
在线时间
37 小时
 楼主| 发表于 2012-2-14 09:05:20 | 显示全部楼层
void  ADC1_2_IRQHandler() 
这个函数我这样定义的,我的确可以正常执行呢,只是在设定NVIC的时候出现了问题,.s文件里,确实说到 ADC_IRQHandler            
但是nvic.h文件当中有这样的定义#define ADC1_2_IRQChannel            ((u8)0x12)  /* ADC1 et ADC2 global Interrupt */
所以我就选择了ADC1_2_IRQChannel 来定义nvic的了,但是这样定义就出问题了
  void  ADC1_2_IRQHandler() 
这个函数到时与void  ADC_IRQHandler() ,我实验了下,都可以正常执行,而且执行的结果是一致的!
         
专业制作STM32 物联网通信模块板,模块交流群:369840039。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-2-14 09:08:25 | 显示全部楼层
那你又说死机?

我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

109

主题

1606

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2222
金钱
2222
注册时间
2011-12-15
在线时间
37 小时
 楼主| 发表于 2012-2-14 11:47:15 | 显示全部楼层
就是当我MY_NVIC_Init(2,1,ADC1_2_IRQChannel ,2);//设置中断优先级 
就会出现死机的!
专业制作STM32 物联网通信模块板,模块交流群:369840039。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-2-14 11:57:39 | 显示全部楼层
就是你没有中断服务函数嘛...
我晕...
没中断服务函数,产生中断的时候,它跑到哪里去?没地方去!
所以就死了.
把你这个拍脑袋拍出来的函数:ADC1_2_IRQHandler
改为我说的那个名字.就OK了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

109

主题

1606

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2222
金钱
2222
注册时间
2011-12-15
在线时间
37 小时
 楼主| 发表于 2012-2-17 10:47:11 | 显示全部楼层
谢谢原子哥
回复 支持 反对

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
发表于 2014-10-21 11:01:09 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
.s文件里面 
ADC的中断服务函数是这么定义的: 
                DCD     ADC_IRQHandler            ; ADC 
在哪里的.s里面呢?
小小蜗牛
回复 支持 反对

使用道具 举报

0

主题

8

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2014-7-25
在线时间
0 小时
发表于 2014-12-22 17:24:16 | 显示全部楼层
回复【9楼】jiutianshenjian:
---------------------------------
CORE里面的_hd.s
回复 支持 反对

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
26
金钱
26
注册时间
2014-10-6
在线时间
0 小时
发表于 2015-3-1 20:15:13 | 显示全部楼层
应该怎么修改?这个ADC中断的声明
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-25 14:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表