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

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管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版