OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3403|回复: 2

【求助】DMA缓冲区被锁???

[复制链接]

3

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2018-3-29
在线时间
21 小时
发表于 2018-5-3 20:02:08 | 显示全部楼层 |阅读模式
5金钱
   在使用dma进行spi读写操作的过程中发现,定义的Rx_Buffer在dma传输完成后,如果被操作,例如将Rx_Buffer中所有数据赋值给另一个数组,那么后续dma就无法将数据传输到Rx_Buffer里了。而如果单独对Rx_Buffe[0]进行操作,例如判断Rx_Buffe[0]是否等于0x0F,那么后续仅有Rx_Buffe[0]无法通过dma更新数据。
   其中dma采用非循环模式,每传输完一次重新对NTDR寄存器赋值。如果不对Rx_Buffer操作,keil仿真查看memory可以看到数据都是正常的。但是一旦操作Rx_Buffer,缓冲区就像被锁住一样,数据不会再更新。
  网上都找不到类似的问题,太奇葩了,求大佬指点迷津

最佳答案

查看完整内容[请看2#楼]

这个应该是F7才会遇到的问题,F7拥有独立的指令和数据高速缓冲存储器,,也就是L1-cache。具体原因如下: DMA 造成的数据不一致问题   DMA 操作直接访问主存,而不会更新 cache 和写缓冲区中相应的内容,这样就可能造成数据的不一致。   如果 DMA 从主存中读取的数据已经包含在 cache 中,而且 cache 中对应的数据已经被更新,这样 DMA 读到的将不是系统中最新的数据。同样,DMA 写操作直接更新主存中的数据,如果该数据 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2018-3-29
在线时间
21 小时
 楼主| 发表于 2018-5-3 20:02:09 | 显示全部楼层
这个应该是F7才会遇到的问题,F7拥有独立的指令和数据高速缓冲存储器,,也就是L1-cache。具体原因如下:
DMA 造成的数据不一致问题
  DMA 操作直接访问主存,而不会更新 cache 和写缓冲区中相应的内容,这样就可能造成数据的不一致。
  如果 DMA 从主存中读取的数据已经包含在 cache 中,而且 cache 中对应的数据已经被更新,这样 DMA 读到的将不是系统中最新的数据。同样,DMA 写操作直接更新主存中的数据,如果该数据已经包含在 cache 中,则 cache 中的数据将会比主存中对应的数据“老”,也将造成数据不一致。
  为了避免这种数据不一致的情况的发生,根据系统的具体情况,执行下面的操作序列中的一种或几种。

1 将 DMA 访问的存储区域设置成非缓冲的(uncachable 及 unbufferable);
2 将 DMA 访问的存储区域所涉及的数据 cache 中的块设置为无效,或者清空数据 cache;
3 清空写缓冲区(执行写缓冲区中延迟的所有写操作);
4 在 DMA 操作期间限制处理器访问 DMA 所访问的存储区域。
回复

使用道具 举报

3

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2018-3-29
在线时间
21 小时
 楼主| 发表于 2018-5-3 21:51:16 | 显示全部楼层
本帖最后由 嘬腮怪人 于 2018-5-4 00:46 编辑

找到问题了....操作完Rx_Buffer之后加一句 SCB_CleanInvalidateDCache();就好了

好像是Cache一致性的问题?但并没有很理解这为什么会导致我的这种情况。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-8 17:49

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表