[其他ST产品] 请问是DMA将500个完全缓存到内存中后然后中断完成标志位置1再进入中断服务函数打印出500个数据吗?

[复制链接]
 楼主| jcky001 发表于 2024-7-28 14:00 | 显示全部楼层 |阅读模式
请问下各位:  DMA的中断完成标志位问题??
     总体描述: DMA存储来自SPI的500个数据,我检测中断传输完成标志位,然后再到中断服务函数中,打印出这500个数据;
       问题是:是DMA将500个完全缓存到内存中后,然后中断完成标志位置1,再进入中断服务函数,打印出500个数据?还是DMA接收1个数据后,就进入中断函数打印这个数据,然后循环进行直到取满500个数据呢?
程序例子如下:
         while (1)
        {                 
                GPIO_ResetBits(AD_CS_GPIO_PORT,AD_CS_PIN);        //CS置0                  
                         Delay(5);                                               
                SPI_Cmd(AD_SPI, ENABLE);                                        //SPI开启        
                       data=SPIx_ReadWriteByte();                                //产生16个周期的读取数据
                SPI_Cmd(AD_SPI, DISABLE);                                       //SPI关闭
                    Delay(140);                                                   
                GPIO_SetBits(AD_CS_GPIO_PORT,AD_CS_PIN);          //CS置1
                    Delay(5);                                                                  
        }

///////////////////////////中断服务函数//////////////////////////////////
        void DMA1_Stream0_IRQHandler(void)  

       {        
                 for (j=500;j>1;j--)
              {        
                printf("%dn",ADC_ConvertedValue[j]);
              }
               DMA_ClearITPendingBit(DMA1_Stream0,DMA_IT_TCIF0);         //清除完成中断标志位
       }

     程序调试过程中,使能SPI后,再执行  data=SPIx_ReadWriteByte();  不管你缓存的数据再多,都马上进入DMA传输完成中断服务函数。所以我疑惑,到底是采集完整个数据后进入中断服务函数,还是采集一个数据就进入中断函数。所以仿真不出来效果。
kzlzqi 发表于 2024-7-29 15:09 | 显示全部楼层
当你配置DMA传输500个数据时,DMA会在500个数据全部传输完成后,触发传输完成中断(即DMA_IT_TCIFx位会置1)。
范德萨发额 发表于 2024-7-29 15:46 | 显示全部楼层
只有在DMA完成了全部500个数据的传输后,才会触发一次中断服务函数。在进入中断服务函数时,所有500个数据已经全部被传输到了目标内存位置。
classroom 发表于 2024-7-29 21:25 | 显示全部楼层
虽然你的基本理解是正确的,但实现细节和性能考虑对于编写高效、可靠的嵌入式系统至关重要。
laocuo1142 发表于 2024-7-29 21:26 | 显示全部楼层
如果你的系统中有多个中断源,并且它们可能同时发生,你需要考虑中断的优先级和嵌套问题。在某些情况下,你可能需要确保DMA传输完成中断具有足够的优先级,以便它能够及时响应。
申小林一号 发表于 2024-7-29 22:35 | 显示全部楼层
感谢分享
喂什么玩意 发表于 2024-7-31 11:43 | 显示全部楼层
当DMA传输完成500个数据后,会触发一次中断,然后进入中断服务函数。
AdaMaYun 发表于 2024-7-31 14:16 | 显示全部楼层
那DMA传输过程需要重新编写
为你转身 发表于 2024-8-31 13:46 | 显示全部楼层
在使用DMA进行数据传输时,理解DMA的中断机制以及数据传输的完成标志位行为是非常重要的。
为你转身 发表于 2024-8-31 13:46 | 显示全部楼层
范德萨发额 发表于 2024-7-29 15:46
只有在DMA完成了全部500个数据的传输后,才会触发一次中断服务函数。在进入中断服务函数时,所有500个数据 ...

在DMA配置中,当设置了传输数据的数量(如500个数据)后,DMA会在完成所有数据的传输后才触发一次中断。

为你转身 发表于 2024-8-31 13:46 | 显示全部楼层
kzlzqi 发表于 2024-7-29 15:09
当你配置DMA传输500个数据时,DMA会在500个数据全部传输完成后,触发传输完成中断(即DMA_IT_TCIFx位会置1 ...

在中断服务函数中,你可以处理传输完成后的数据,如读取和处理已经缓存的数据。由于DMA已经完成所有数据传输,因此在进入ISR时,所有500个数据都已存储在内存中。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1636

主题

5575

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部