stm32F7,开启 cache 后,uart+idl+dma 接收失败?

2019-12-25 18:49发布

本帖最后由 hpdell 于 2017-3-30 12:05 编辑

F7的单片机,开启 cache 后,uart-idl+dma接收不到数据,中断可以进入,

SCB_EnableICache();   //使能I-Cache
SCB_EnableDCache();   //使能D-Cache    后,

使用usart+dma 接收就不行
屏蔽后uart+dam可以,但sd卡又不行

该如何处理啊 ??

sd卡使用 查询模式,

感觉这个f7的 cache 使用起来很麻烦,

其他的 mpu 保护还没有进行任何设置
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
26条回答
lusson
1楼-- · 2019-12-27 17:44
hpdell 发表于 2017-3-30 19:03
你好,

只找到这个函数

数量对不代表数据对,数据可能被cache掉了。我这个是Core_cm7.h中的函数啊。HAL库

/**
  fn          void SCB_InvalidateDCache_by_Addr(volatile uint32_t *addr, int32_t dsize)
  rief       D-Cache Invalidate by address
  param[in]   addr    address (aligned to 32-byte boundary)
  param[in]   dsize   size of memory block (in number of bytes)
*/
__STATIC_INLINE void SCB_InvalidateDCache_by_Addr (uint32_t *addr, int32_t dsize)
{
  #if (__DCACHE_PRESENT == 1)
    int32_t  op_size = dsize;
    uint32_t op_addr = (uint32_t)addr;
    uint32_t linesize = 32UL;               // in Cortex-M7 size of cache line is fixed to 8 words (32 bytes)

    __DSB();

    while (op_size > 0) {
      SCB->DCIMVAC = op_addr;
      op_addr +=          linesize;
      op_size -= (int32_t)linesize;
    }

    __DSB();
    __ISB();
  #endif
}
hpdell
2楼-- · 2019-12-27 17:58
 精彩回答 2  元偷偷看……
lusson
3楼-- · 2019-12-27 20:24
hpdell 发表于 2017-3-31 09:13
你好,按照你的这个方法 终于搞定了,你兄台对这个研究的很透彻啊,多谢多谢了  ...


我也是从F4用到F7的时候遇到了这些坑,网上查资料以及看M7的手册,M7手册中好像有这一点的介绍,特别是关于使用DMA的时候要注意
不使能D-cache的话,我实际跑下来的速度连F4都不如。
hpdell
4楼-- · 2019-12-28 00:20
lusson 发表于 2017-3-31 09:16
我也是从F4用到F7的时候遇到了这些坑,网上查资料以及看M7的手册,M7手册中好像有这一点的介绍,特别是关 ...

确实是这样的啊,我在刷屏时,如果不开启 cache ,刷屏速度很慢,开启cache 后,刷屏速度那是快的不要不要的
XA144F
5楼-- · 2019-12-28 01:51
标记一下!最近在裸奔sama5d3,sd卡用dma读取总是不正确,估计也是这样。
security
6楼-- · 2019-12-28 06:36
我没用接触过过 STM32,更别说是 F7 系列,但我从理论上扯几句:
- 使用 DMA,就要注意 cache 一致性的问题。
- DMA 是绕过 CPU,直接进行的数据搬运操作。
- 如果开启数据 cache 的话,CPU 对于内存的认知来源,是源自 cache,cache 的数据分布,是由 CPU 管控的。
- 而 DMA,却自己改变了物理内存的数据分布,此时 CPU 一无所知,CPU 依旧认为内存数据木有变化, 也就不会去无效化、重新刷新 cache。
- 此时,就会出现 cache 数据与物理内存数据的不一致问题。
- 因此,DMA 操作,要嘛关闭 cache,要嘛就是要注意主动去无效化 cache,而不是什么也不做,因为你不做,CPU 也不会去做什么(它压根就感知不到数据有变化)。

一周热门 更多>