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条回答
honami520
1楼-- · 2019-12-25 23:29
没玩到F7,还在F4呢。应该是还没搞明白,等搞明白了,估计就不麻烦了。
hpdell
2楼-- · 2019-12-26 00:37
honami520 发表于 2017-3-30 12:04
没玩到F7,还在F4呢。应该是还没搞明白,等搞明白了,估计就不麻烦了。

有这个可能吧

TBG3
3楼-- · 2019-12-26 05:14
F7 RAM有多快?
如果速度是F7速度的一半,就把数据CACHE关掉好了。因为用CACHE要解决数据一致性的问题。

仔细阅读一下ST的文档,看上面怎么说。
XA144F
4楼-- · 2019-12-26 10:14
 精彩回答 2  元偷偷看……
lusson
5楼-- · 2019-12-26 14:55
这是我的FATFS中使用DMA和不使用DMA的调用,你可以参考看看,开启DMA前和读完数据后都要无效下cache。我比较了下速度,没有相差很多,所以最后没用DMA了。
  1. DRESULT SD_read(BYTE lun, BYTE *buff, DWORD sector, UINT count)
  2. {
  3.   DRESULT res = RES_OK;
  4. #ifdef READ_SD_USE_DMA
  5.   u32 addr = (u32)buff;
  6.   u32 size = count * BLOCK_SIZE;
  7.   if (addr & 0x1F) {                // align 32 byte
  8.           addr &= ~((u32)0x1F);
  9.         size += 0x20;
  10.   }
  11.   SCB_InvalidateDCache_by_Addr((u32*)addr, size);
  12.   if(BSP_SD_ReadBlocks_DMA((uint32_t*)buff,
  13.                        ((uint64_t)sector)*BLOCK_SIZE,
  14.                        BLOCK_SIZE,
  15.                        count) != MSD_OK)
  16.   {
  17.     res = RES_ERROR;
  18.   }
  19.   SCB_InvalidateDCache_by_Addr((u32*)addr, size);
  20. #else
  21.   if(BSP_SD_ReadBlocks((uint32_t*)buff,
  22.                        ((uint64_t)sector)*BLOCK_SIZE,
  23.                        BLOCK_SIZE,
  24.                        count) != MSD_OK)
  25.   {
  26.     res = RES_ERROR;
  27.   }
  28. #endif
  29.   return res;
  30. }
复制代码
hpdell
6楼-- · 2019-12-26 18:18
lusson 发表于 2017-3-30 13:51
这是我的FATFS中使用DMA和不使用DMA的调用,你可以参考看看,开启DMA前和读完数据后都要无效下cache。我比 ...

你好,我现在的 sd 也是没有使用dma

一周热门 更多>