OpenEdv-开源电子网

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

我的STM32的ADC中断好像有问题,大家帮我看看

[复制链接]

19

主题

68

帖子

0

精华

初级会员

Rank: 2

积分
190
金钱
190
注册时间
2011-9-19
在线时间
8 小时
发表于 2011-11-4 09:21:43 | 显示全部楼层 |阅读模式
我的使能了ADC的规则组转换完成中断,而且一个规则组转换完成后函数也确实进入了ADC中断,但是我在ADC中断中查询ADC的规则转换完成中断标志时值为RESET,而不是SET,这是为什么呢?ADC_IT_EOC这个中断标志在规则组转换完成后应该是SET的呀,但不知道为什么为RESET。
以下是ADC的初始化:
void ADC_Configuration(void)
{
 GPIO_InitTypeDef GPIO_InitStructure;
 ADC_InitTypeDef ADC_InitStructure;

 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA , ENABLE);
 RCC_ADCCLKConfig(RCC_PCLK2_Div2);

 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4;
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
 GPIO_Init(GPIOA , &GPIO_InitStructure);

 ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
 ADC_InitStructure.ADC_ScanConvMode = ENABLE;
 ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
 ADC_InitStructure.ADC_NbrOfChannel = 5;
 ADC_Init(ADC1, &ADC_InitStructure);
 ADC_TempSensorVrefintCmd(ENABLE);

 ADC_RegularChannelConfig(ADC1 , ADC_Channel_1 , 1 , ADC_SampleTime_239Cycles5);
 ADC_RegularChannelConfig(ADC1 , ADC_Channel_2 , 2 , ADC_SampleTime_239Cycles5);
 ADC_RegularChannelConfig(ADC1 , ADC_Channel_3 , 3 , ADC_SampleTime_239Cycles5);
 ADC_RegularChannelConfig(ADC1 , ADC_Channel_4 , 4 , ADC_SampleTime_239Cycles5);
 ADC_RegularChannelConfig(ADC1 , ADC_Channel_16 , 5 , ADC_SampleTime_239Cycles5);
 ADC_ITConfig(ADC1,ADC_IT_EOC,ENABLE); 
 ADC_DMACmd(ADC1,ENABLE);
 ADC_Cmd(ADC1 , ENABLE);
}
以下是ADC的中断函数:
void ADC_IRQHandler(void)
{
 if(ADC_GetITStatus(ADC1,ADC_IT_EOC) == RESET)
 {
  ADCData_Move();
  ADC_SoftwareStartConvCmd(ADC1,ENABLE);
  ADC_ClearITPendingBit(ADC1,ADC_IT_EOC);
 }
}
在主函数中所有用到的外设初始化完成后进行ADC校准,校准完了之后软件启动一次转换,一次转换完成后进行规则组转换完成中断,在中断服务程序中再软件启动一次,就这样,转换完一次,在中断中启动下一次转换。

而且还有一个关于串口接收的问题:
我整个程序中就用到了串口接收中断和ADC规则组转换完成中断两个,而且串口接收中断的优先级比ADC规则组转换完成中断要高,ADC规则组的转换结果由DMA读走,但是没有使能DMA中断,但是不知道为什么,我的串口数据接收的时候老是丢数据,我在调试的时候通过MDK中看到串口接收到的内容总是缺少几个字节的数据,但是只要我把ADC中断失能,只留串口接收中断一个的时候,串口接收的数据就没有丢过,接收一直很正常。
但是现在我就不明白了,串口中断的优先级最高,为什么接收数据的时候会出现问题。大家帮我看看哈,这个问题繁了我两天了。。。。呃。。。


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-11-4 10:00:48 | 显示全部楼层
回复【楼主位】baiydcwy:
---------------------------------
软件仿真,跟踪一下看看寄存器的信息,是否设置正常.
串口中断问题,有可能你优先级设置反了.或者在其他地方修改了他们的顺序.总之要查代码,慢慢看吧.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

46

主题

1579

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1970
金钱
1970
注册时间
2011-7-17
在线时间
4 小时
发表于 2011-11-4 11:44:56 | 显示全部楼层
卧槽,库函数的。
Time?And?Relative?Dimension?In?Space.
回复 支持 反对

使用道具 举报

19

主题

68

帖子

0

精华

初级会员

Rank: 2

积分
190
金钱
190
注册时间
2011-9-19
在线时间
8 小时
 楼主| 发表于 2011-11-4 14:11:21 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
我一直都是用软件仿真在看,看到ADC的SR寄存器中的EOC标志始终为0,EOCIE为1,SCAN为1,STRT始终为1,EOC那个标志不是在规则组转换完成后被置位的吗?这什么它始终为RESET呢?
回复 支持 反对

使用道具 举报

19

主题

68

帖子

0

精华

初级会员

Rank: 2

积分
190
金钱
190
注册时间
2011-9-19
在线时间
8 小时
 楼主| 发表于 2011-11-4 14:57:58 | 显示全部楼层
而且还有一个奇怪的问题:
我把中断服务程序改成这样:
void ADC_IRQHandler(void)
{
 if(ADC_GetITStatus(ADC1,ADC_IT_EOC) == SET)
 {
  ADCData_Move();
  ADC_SoftwareStartConvCmd(ADC1,ENABLE);
  ADC_ClearITPendingBit(ADC1,ADC_IT_EOC);
 }
}
我在调试的时候,在ADC中断里面设了一下断点,第一次全速运行,进入了ADC中断,但是再点全速运行就进不了中断了,也就是只进了一次中断,以后就进不去了。
如果我把AD中断服务程序改为这样:
void ADC_IRQHandler(void)
{
 if(ADC_GetITStatus(ADC1,ADC_IT_EOC) == RESET)
 {
  ADCData_Move();
  ADC_SoftwareStartConvCmd(ADC1,ENABLE);
  ADC_ClearITPendingBit(ADC1,ADC_IT_EOC);
 }
}
如果是这样的话,它进入中断后我单步执行,我单步执行到中断服务程序的最后一行后,我再单步,程序又跳进了ADC中断,反复好几次程序才跳出中断,去执行别的程序。
呃,好奇怪呃,原子哥和大家帮我看看呃。。。。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-11-4 16:48:14 | 显示全部楼层
库函数,没研究啊.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

19

主题

68

帖子

0

精华

初级会员

Rank: 2

积分
190
金钱
190
注册时间
2011-9-19
在线时间
8 小时
 楼主| 发表于 2011-11-5 14:20:11 | 显示全部楼层
我们正常使用操作寄存器的方法操作寄存器的话,在使用ADC规则组加DMA的时候,进入ADC中断服务程序中后,我们是不是应该先判断EOC标志位,看是不是因为规则组转换完成进入的中断,还是其它原因进入的中断,若被置位的话,我们将EOC标志位清除,然后再次置位ADON位,开始新的一次转换。不知道流程是不是这样和呢,在这期中EOC应该是被置位的,不知道我说的对不对,希望原子哥和大家看看有没有要纠正的,我自己对操作寄存器不太会,大家帮我看看
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-11-5 15:03:14 | 显示全部楼层
回复【7楼】baiydcwy:
---------------------------------
是应该判断一下.比较好的做法.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

96

主题

762

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1228
金钱
1228
注册时间
2012-10-19
在线时间
15 小时
发表于 2013-3-12 10:41:14 | 显示全部楼层
回复【8楼】正点原子:
---------------------------------
ADC中断标志位在哪啊,没有状态寄存器啊
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-3-12 11:26:41 | 显示全部楼层
回复【9楼】tian123chi:
---------------------------------
adc_sr是什么?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

96

主题

762

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1228
金钱
1228
注册时间
2012-10-19
在线时间
15 小时
发表于 2013-3-12 17:06:34 | 显示全部楼层
回复【10楼】正点原子:
---------------------------------
额,看了半天没看到,原来还是有的,原来是读取数据寄存器时自动清除。。。
回复 支持 反对

使用道具 举报

9

主题

44

帖子

2

精华

中级会员

Rank: 3Rank: 3

积分
402
金钱
402
注册时间
2014-8-15
在线时间
0 小时
发表于 2015-10-14 11:46:30 | 显示全部楼层
原因其实很简单。
每次读取寄存区自动清除中断标记。变成了RESET。
你使用DMA自动读取,所以每次都变成了RESET。
你去掉ADC_DMACmd(ADC1,ENABLE);即可。一般来说使用DMA的话,应该采用DMA的中断来写。
11年的帖子,不知你还能看见么...
回复 支持 反对

使用道具 举报

0

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
122
金钱
122
注册时间
2016-8-23
在线时间
32 小时
发表于 2017-4-1 16:37:40 | 显示全部楼层
肯定看不见了
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-8-22 12:30

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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