ST社区自助问题 发表于 2017-5-8 15:34:30

STM32的GPIO中断开启DMA读取数据发生移位怎么解决?

设置PC6为上升沿触发中断,触发后中断回调函数开启DMA读取9个数据,然后下降沿时关闭DMA,但是读取到的数据会发生右移,这是什么原因,怎么解决呢?

any012 发表于 2017-5-8 17:00:31

本帖最后由 any012 于 2017-5-9 08:44 编辑

感谢帮我发求助帖,补充下问题描述。
接收到正确的数据是: Spi2 DMA recived OK. 3a08, 010a, 0200, 01ff, 03ff, 07ff, 0fff, 5d71, 0000
出错时有时是这样的: Spi2 DMA recived OK. 03a0, 8010, a020, 001f, f03f, f07f, f0ff, f5d7, 1000
这样是最后一个16位数据跑到了第一个位置,其他的依次后移了。算是右移了2个字节。

我用示波器表笔碰触SCL管脚,有时候出现右移1个字节的情况。
但也有时候出现的数据较乱,感觉像是移动了几个bit,而不是整个字节。


PC6上升沿和下降沿都离MOSI数据产生有很大的时间间隔。

SPI2初始化函数:





fury-roar 发表于 2017-5-8 17:30:37

开启dma之前,试试将dma_req信号清除。具体dma_req信号对应的寄存器查看响应手册。

waiman-156411 发表于 2017-5-9 09:58:57

楼主是用什么编程环境(编写软件)配色很cool

any012 发表于 2017-5-9 10:16:48

本帖最后由 any012 于 2017-5-9 11:44 编辑

waiman-156411 发表于 2017-5-9 09:58
楼主是用什么编程环境(编写软件)配色很cool
eclipse+ac6插件。
然后eclipse市场里有各种主题。

eclipse装上AC6插件后,可以打开CUBEMX生成的SW4STM32工程。
eclipse界面挺好的,不过使用上遇到问题的话,就不知道该去哪里求助了,现在用AC6的还比较少。
下载安装AC6也挺慢的,尝鲜是需要付出代价的。

waiman-156411 发表于 2017-5-9 10:42:06

any012 发表于 2017-5-9 10:16
eclipse+ac6插件。
然后eclipse市场里有各种主题。

先谢谢你,可以直接用Eclipse打开 STM32 CubeMx生成的工程吗?

any012 发表于 2017-5-9 10:53:33

fury-roar 发表于 2017-5-8 17:30
开启dma之前,试试将dma_req信号清除。具体dma_req信号对应的寄存器查看响应手册。 ...

DMA_REQ信号是什么?是说DMA_ISR吗?

any012 发表于 2017-5-9 11:12:51

本帖最后由 any012 于 2017-5-9 11:45 编辑

希望朋友们帮忙分析下原因及解决办法。

fury-roar 发表于 2017-5-9 14:43:47

本帖最后由 fury-roar 于 2017-5-9 14:47 编辑

any012 发表于 2017-5-9 10:53
DMA_REQ信号是什么?是说DMA_ISR吗?
不是dma_isr.
你的问题是不是:
dma搬移的第一个数据错误,有效数据从第二个开始?
spi准备好数据,请求dma搬数前,会将信号dma_req置为有效值,然后dma开始数据的搬移。你这种情况是不是dma使能后,此时SPI还未准备好数据但dma_req信号为有效值,导致dma错误地搬移了一个数据。可以在dma使能前,先将dma_req信号置为无效值将其清除。
你在spi相应的寄存器中找找看,有没有关于dma_req的描述。
页: [1]
查看完整版本: STM32的GPIO中断开启DMA读取数据发生移位怎么解决?