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

2019-08-23 14:35发布

我的使能了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中断失能,只留串口接收中断一个的时候,串口接收的数据就没有丢过,接收一直很正常。
但是现在我就不明白了,串口中断的优先级最高,为什么接收数据的时候会出现问题。大家帮我看看哈,这个问题繁了我两天了。。。。呃。。。


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
12条回答
正点原子
1楼-- · 2019-08-23 17:25
回复【楼主位】baiydcwy:
---------------------------------
软件仿真,跟踪一下看看寄存器的信息,是否设置正常.
串口中断问题,有可能你优先级设置反了.或者在其他地方修改了他们的顺序.总之要查代码,慢慢看吧.
Tardis
2楼-- · 2019-08-23 23:12
卧槽,库函数的。
baiydcwy
3楼-- · 2019-08-24 02:19
 精彩回答 2  元偷偷看……
baiydcwy
4楼-- · 2019-08-24 05:51
而且还有一个奇怪的问题:
我把中断服务程序改成这样:
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中断,反复好几次程序才跳出中断,去执行别的程序。
呃,好奇怪呃,原子哥和大家帮我看看呃。。。。
正点原子
5楼-- · 2019-08-24 08:27
库函数,没研究啊.
baiydcwy
6楼-- · 2019-08-24 12:02
我们正常使用操作寄存器的方法操作寄存器的话,在使用ADC规则组加DMA的时候,进入ADC中断服务程序中后,我们是不是应该先判断EOC标志位,看是不是因为规则组转换完成进入的中断,还是其它原因进入的中断,若被置位的话,我们将EOC标志位清除,然后再次置位ADON位,开始新的一次转换。不知道流程是不是这样和呢,在这期中EOC应该是被置位的,不知道我说的对不对,希望原子哥和大家看看有没有要纠正的,我自己对操作寄存器不太会,大家帮我看看

一周热门 更多>