你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

DMA的传输完成中断疑问???

[复制链接]
dh2964169 提问时间:2018-3-8 20:10 /
本帖最后由 dh2964169 于 2018-3-8 20:14 编辑

请问下各位:  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("%d\n",ADC_ConvertedValue[j]);
              }
               DMA_ClearITPendingBit(DMA1_Stream0,DMA_IT_TCIF0);         //清除完成中断标志位
       }

     程序调试过程中,使能SPI后,再执行  data=SPIx_ReadWriteByte();  不管你缓存的数据再多,都马上进入DMA传输完成中断服务函数。所以我疑惑,到底是采集完整个数据后进入中断服务函数,还是采集一个数据就进入中断函数。所以仿真不出来效果。




收藏 评论7 发布时间:2018-3-8 20:10

举报

7个回答
黑皮男 回答时间:2018-3-8 21:02:07
本帖最后由 黑皮男 于 2018-3-8 21:03 编辑

DMA传输是自动触发的,不需要再在代码中显示的提供时钟信号。楼主这个传输过程不对,应该是使能DMA,并使能SPI的DMA传输请求就可以了

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

wenyangzeng 回答时间:2018-3-8 21:29:58
建议楼主在中断中设立一个标志位就退出,然后在主函数中检测标志位为1时打印500个数据后清标志位。在中断中尽量不要调用子函数,特别是打印这种慢函数。如果你在中断函数中打印500个数据,估计会与下一次中断冲突。

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

butterflyspring 回答时间:2018-3-9 01:11:57
wenyangzeng 发表于 2018-3-8 21:29
建议楼主在中断中设立一个标志位就退出,然后在主函数中检测标志位为1时打印500个数据后清标志位。在中断中 ...

元老同学的编程习惯很好呀....
PS:楼主,为什么不用cubeMx呢?为什么不用cubeMx呢?为什么不用cubeMx呢?

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

zengxuzhong 回答时间:2018-3-9 02:59:10
学习了
dh2964169 回答时间:2018-3-9 09:05:08
butterflyspring 发表于 2018-3-9 01:11
元老同学的编程习惯很好呀....
PS:楼主,为什么不用cubeMx呢?为什么不用cubeMx呢?为什么不用cubeMx呢? ...

我已经下好了,cubeMx了,只不过还没有去学习呢;难道使用不同的编程方式,这个会不会有所改善呢;
确实呢,不管如何,也要去试试
dh2964169 回答时间:2018-3-9 11:11:00
黑皮男 发表于 2018-3-8 21:02
DMA传输是自动触发的,不需要再在代码中显示的提供时钟信号。楼主这个传输过程不对,应该是使能DMA,并使能 ...

首先谢谢您的指点啊疑问代码:
    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);                                                                //延时时间稍长,为的是让CS=1前,关闭SPI,否则CS=1与sck有重合
                GPIO_SetBits(AD_CS_GPIO_PORT,AD_CS_PIN);                 //CS置1
                    i--;
                    Delay(5);                                                                  
        }


       先前也稍稍尝试过,不用data=SPIx_ReadWriteByte(); 但是狗血的是我这款AD7357它需要满足:cs=0,16个周期SCLK,cs=1这个循环的过程,才能有输出数据,不能够将CS拉低后AD一直出数据;所以采用这样的方式,
      请问下@黑皮男 ,有没有更好的解决方法呢,谢谢你啦


黑皮男 回答时间:2018-3-9 11:22:37
本帖最后由 黑皮男 于 2018-3-9 11:26 编辑
dh2964169 发表于 2018-3-9 11:11
首先谢谢您的指点啊疑问代码:
    while (1)
        {                 

这个需要用到定时器了,使用pwm来驱动cs,pwm溢出事件触发dma的数据传输,这个我没试过,理论上是可行的

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版