打印
[其他ST产品]

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

[复制链接]
217|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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 | 只看该作者
虽然你的基本理解是正确的,但实现细节和性能考虑对于编写高效、可靠的嵌入式系统至关重要。

使用特权

评论回复
5
laocuo1142| | 2024-7-29 21:26 | 只看该作者
如果你的系统中有多个中断源,并且它们可能同时发生,你需要考虑中断的优先级和嵌套问题。在某些情况下,你可能需要确保DMA传输完成中断具有足够的优先级,以便它能够及时响应。

使用特权

评论回复
6
申小林一号| | 2024-7-29 22:35 | 只看该作者
感谢分享

使用特权

评论回复
7
喂什么玩意| | 2024-7-31 11:43 | 只看该作者
当DMA传输完成500个数据后,会触发一次中断,然后进入中断服务函数。

使用特权

评论回复
8
AdaMaYun| | 2024-7-31 14:16 | 只看该作者
那DMA传输过程需要重新编写

使用特权

评论回复
9
为你转身| | 2024-8-31 13:46 | 只看该作者
在使用DMA进行数据传输时,理解DMA的中断机制以及数据传输的完成标志位行为是非常重要的。

使用特权

评论回复
10
为你转身| | 2024-8-31 13:46 | 只看该作者
范德萨发额 发表于 2024-7-29 15:46
只有在DMA完成了全部500个数据的传输后,才会触发一次中断服务函数。在进入中断服务函数时,所有500个数据 ...

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

使用特权

评论回复
11
为你转身| | 2024-8-31 13:46 | 只看该作者
kzlzqi 发表于 2024-7-29 15:09
当你配置DMA传输500个数据时,DMA会在500个数据全部传输完成后,触发传输完成中断(即DMA_IT_TCIFx位会置1 ...

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

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1476

主题

4226

帖子

6

粉丝