初级会员 
  
	- 积分
 - 50
 
        - 金钱
 - 50 
 
       - 注册时间
 - 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)); 
                } 
 
                 
} 
 
实际发现中断函数被执行了两次,也就是说第一次中断标志位未被清除,第二次进中断后才被清除。 
 
 
本人非常疑惑,查了很多资料也没搞明白这个问题,望论坛里有大佬能解释一下原因 
 
 
 
 |   
 
 
 
 
 
 |