新手上路
- 积分
- 49
- 金钱
- 49
- 注册时间
- 2021-4-20
- 在线时间
- 15 小时
|
5金钱
本人在用ADC采集电压用DMA传输进内存,设置了传输完成中断,想在中断里传数据给串口屏,在过程中遇到以下问题
在中断服务函数中,中断标志位清除语句的位置会决定中断服务函数的执行次数。
1.在服务函数的末尾清除标志位
如下代码:
void DMA2_Stream0_IRQHandler(){
int i;
int j=0;
DMA2_Stream0->CR&=~(1<<0);
ADC1->CR2&=~(1<<0);
ADC2->CR2&=~(1<<0);
ADC3->CR2&=~(1<<0);
for (i = 0; i < 240; i++)
{
ADC_ConvertedValueLocal[j++]=ADC_ConvertedValue;
ADC_ConvertedValueLocal[j++]=(ADC_ConvertedValue)>>16;
}
for(i=0;i<240;i++)
{
printf("%d.add 1,0,%d\xff\xff\xff",i,(ADC_ConvertedValueLocal/16));
}
DMA2->LIFCR|=1<<5;
}
实际发现中断函数被执行了一次是正常的现象。
2.在服务函数的开始清除标志位
void DMA2_Stream0_IRQHandler(){
int i;
int j=0;
DMA2->LIFCR|=1<<5;
DMA2_Stream0->CR&=~(1<<0);
ADC1->CR2&=~(1<<0);
ADC2->CR2&=~(1<<0);
ADC3->CR2&=~(1<<0);
for (i = 0; i < 240; i++)
{
ADC_ConvertedValueLocal[j++]=ADC_ConvertedValue;
ADC_ConvertedValueLocal[j++]=(ADC_ConvertedValue)>>16;
}
for(i=0;i<240;i++)
{
printf("%d.add 1,0,%d\xff\xff\xff",i,(ADC_ConvertedValueLocal/16));
}
}
实际发现中断函数被执行了两次,也就是说第一次中断标志位未被清除,第二次进中断后才被清除。
本人非常疑惑,查了很多资料也没搞明白这个问题,望论坛里有大佬能解释一下原因
|
|