OpenEdv-开源电子网

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

关于DMA传输完成中断标志清除疑问(3重ADC寄存器版本)

[复制链接]

2

主题

5

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2021-4-20
在线时间
15 小时
发表于 2022-5-6 22:02:14 | 显示全部楼层 |阅读模式
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));
                }

               
}

实际发现中断函数被执行了两次,也就是说第一次中断标志位未被清除,第二次进中断后才被清除。


本人非常疑惑,查了很多资料也没搞明白这个问题,望论坛里有大佬能解释一下原因



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

使用道具 举报

0

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2022-4-21
在线时间
19 小时
发表于 2022-5-9 13:13:31 来自手机 | 显示全部楼层
你一进中断就清除了中断标志位,就意味着ADC又开始执行了,你的中断程序还没执行完成,第二次中断又进来了,所以要在中断程序最后才可以清除中断标志位,要不然你的程序会因为中断嵌套而死。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-25 18:06

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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