坑爹的D 您所在的位置:网站首页 icache和dcache 坑爹的D

坑爹的D

2024-05-12 02:04| 来源: 网络整理| 查看: 265

我也是遇到了这样的问题,我是在做STM32H750VBT6的DMA-ADC采样USB发送的时候遇到的。我是用的按键触发定时器,然后定时外部触发ADC采样,采样结果经过DMA传输进一个Buffer,然后USB发送这个Buffer。我遇到的问题主要是两个,当然是开启D-Cache的时候遇到的。

1,猜到的ADC数据用DMA传输,但是这个Buffer总是传不满。举个例子,在Buffer容量足够的情况下,我ADC和DMA共传输16个数据,结果只有Buffer前两位有数据;传输17个数据,那么Buffer前17位都有数据;传输32个数据,只有Buffer前18个位有数据;传输33个数据,那么Buffer前33个位都有数据。我当时没有想到是D-Cache的问题,只是以为是我DMA配置的问题。然后我在调试的是否发现,我的Buffer基地址是0x240001DC,填数据的时候总是停止到后一个位为0的时候就停止了,然后我突然意识到了难道是这就是原因?我之前也有STM32F103做过,但是就没有这个问题,我有一点点怀疑,但还是尝试直接把Buffer的基地址设置在了0x24000200上。改完之后无论传输多少数据,数据都会正常传输到Buffer之中。

2,虽然我解决了数据传输的问题,但是当我把Buffer的数据利用USB发送到PC上时还是出问题了。我按下按钮,定时器触发ADC采样,然后DMA把数据传到Buffer,然后USB发送,第一次数据发送正常。然而当我第二次按下按钮,Buffer数据不更新,DMA正常传输完成中断,当然USB发送的数据也没有更新。既然DMA正常的传输完成中断,而ADC数据也正常更新,那么按道理Buffer数据也应当正常更新,然后不管我怎么调试,怎么重启DMA,Buffer就是不更新。这是就很蹊跷了,我在网上偶然看到一个帖子,就是说DMA经常有数据不一致的问题,主要是由DCache导致的,我不懂Cache,然后就直接把DCache关掉了,然后一切数据正常。后来我想,问题1也很蹊跷,然后我取消手动指定Buffer的地址,让编译器自动分配在0x240001DC上,数据传输也没问题了,可恶的D-Cache!

本来半天就可以搞定的事情最后花费了两天,看来自己还是对STM32H750不太熟悉,不过也确实学到了很多。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有