Paderboy 发表于 2017-3-30 18:03:46

zhang_mike2000 发表于 2017-3-30 14:23
我还想请教一下,你说“你开启DMA,对应的dam中断就会被开启。。但是,这个不是这个外设的中断。。。别混肴 ...



这个是我这个帖子的cube工程里NVI I2C的截图,默认是cube自动勾选的,我在cube里无法修改的。。也就是说,我配置了i2c dma接收数据,那么cube就自动帮我开启了对应的dma通道中断。。。



这个是我修改后的 Rx Tx的截图



应该是不同系列的cube的配置方案不同。。如果cube没有自动配置对应的dma通道中断,那只能自己手动打勾。。。

zhang_mike2000 发表于 2017-3-31 10:46:54

Paderboy 发表于 2017-3-30 18:03
这个是我这个帖子的cube工程里NVI I2C的截图,默认是cube自动勾选的,我在cube里无法修改的。。也就是 ...

谢谢你的回复,我又看了一下,发现了一个问题,我之前的cube版本是4.18,结果配置时就出现了10楼的截屏。后来我把cube升级到最新的4.20 就出现了你在11楼的截屏。
也就是说,4.20把dma的interrupt给打钩了,我们要做的就是把event interrupt打钩。

这样 在i2c的callback里面写回调程序就可以了。

另外还有个问题,就是dma接受时的dma buffer大小和mode中normal circular的问题。
这个问题是由于在uart接收中,比如一帧10bytes,某种原因受到干扰,这着一帧数据有丢失了几个byte,比如受到9bytes,那么是不是dma就是在那里等着,直到下次再来一帧时,凑够10bytes就触发中断?但是问题是下一帧本来的10bytes,被前一次的dma用掉了一个byte,就剩下9个bytes,这就全乱了。这个问题如何解决?是不是有个dma计数器定时清理的机制呢?

Paderboy 发表于 2017-3-31 12:06:17

本帖最后由 Paderboy 于 2017-3-31 12:07 编辑

zhang_mike2000 发表于 2017-3-31 10:46
谢谢你的回复,我又看了一下,发现了一个问题,我之前的cube版本是4.18,结果配置时就出现了10楼的截屏。 ...

1.用串口中断空闲标志+dma接收(接收数据,但是接收的buff要尽量的大一些,然后自己判断数据是否可用。)

2.串口超时关闭接收(超过设置时间,就关闭接收,复位相关的标志位后继续接收)

阳道爷 发表于 2017-10-20 22:14:23

很钦佩楼主的开源精神

企鹅不会飞000 发表于 2017-10-31 14:39:12

谢谢楼主分享,学习了

zdhtmp 发表于 2017-12-3 21:43:35

讲述的很细致,学习了,谢谢楼主分享了

looven 发表于 2018-3-13 16:42:50

不错!适合初学者学习。

小光_ 发表于 2018-3-13 17:06:49

现在再用标准库做

loseboy0516 发表于 2018-3-16 15:03:11

这个必须赞一下!

QWPOY 发表于 2018-6-25 17:08:03

谢谢楼主,下载参考参考
页: 1 [2]
查看完整版本: STM32F446RE+Cube_I2C_DMA 玩转DS3231