我的使能了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中断失能,只留串口接收中断一个的时候,串口接收的数据就没有丢过,接收一直很正常。
但是现在我就不明白了,串口中断的优先级最高,为什么接收数据的时候会出现问题。大家帮我看看哈,这个问题繁了我两天了。。。。呃。。。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
每次读取寄存区自动清除中断标记。变成了RESET。
你使用DMA自动读取,所以每次都变成了RESET。
你去掉ADC_DMACmd(ADC1,ENABLE);即可。一般来说使用DMA的话,应该采用DMA的中断来写。
11年的帖子,不知你还能看见么...
一周热门 更多>