你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32H750使能内存保护后DMA异常问题。

[复制链接]
@47 提问时间:2023-12-5 15:38 / 未解决

STM32H750 在使能内存保护后启用cache 导致SPI+DMA传输不准确,具体就是调用HAL_SPI_TransmitReceive_DMA 这个函数,读到的数据全是0,但是拿逻辑分析仪看上面显示的数据是正确的。

收藏 评论5 发布时间:2023-12-5 15:38

举报

5个回答
xmshao 回答时间:2023-12-5 15:50:26
开启了D-Cache了话,你要么将相应的缓冲区配置透写属性,要么在读取数据前做CacheInvalidate操作,类似如下函数 SCB_InvalidateDCache_by_Addr ()
。另外,此时申请的内存还需注意32字节对齐,类似  ALIGN_32BYTES(uint8_t aRxBufferBUFFER_ALIGNED_SIZE])的写法。
@47 回答时间:2023-12-6 11:16:40

xmshao 发表于 2023-12-5 15:50
开启了D-Cache了话,你要么将相应的缓冲区配置透写属性,要么在读取数据前做CacheInvalidate操作,类似如下 ...

大佬帮忙看看我这里要咋改?

HAL_StatusTypeDef HAL_SPI_READ(uint32_t regAddr, uint8_t *pData, uint32_t dataLen)
{
    uint32_t left, offset, payload, address;
    uint32_t localBuffer[64+1]={0};
  //ALIGN_32BYTES (static uint32_t   readBuffer[SPI_MAX_BULK_32SIZE+1]) __attribute__((section(".ARM.__at_0x24000000")));
  uint32_t readBuffer[64+1]={0};
  //uint8_t RBuffer[SPI_MAX_BULK_SIZE+4];
    HAL_StatusTypeDef errorcode = 1;
  dataLen = (dataLen + 3)/4;
  offset = 0;

    while(offset < dataLen){

        left = dataLen - offset;
        payload = (left>64)?64:left;
        address = regAddr + offset*4;
        localBuffer[0] = address;
    localBuffer[0] = localBuffer[0]|0x01<<1;
    //SCB_InvalidateDCache();
    //SCB_InvalidateDCache_by_Addr((uint32_t*)readBuffer,72);
    errorcode = HAL_SPI_TransmitReceive_DMA(&SpiHandle, (uint8_t*)localBuffer, (uint8_t*)readBuffer,payload+1);
    //while (HAL_SPI_GetState(&SpiHandle) != HAL_SPI_STATE_READY) {}; 
    while (HAL_DMA_GetState(&hdma_spi2_rx) != HAL_DMA_STATE_READY) {}; 
    if(errorcode != HAL_OK)
    {
      printf("HAL_SPI_read Error: at 0x%x\r\n", address);
      //Spi_Cs_Dis();
      break;
    }
    for(int k=1;k<payload+1;k++)
    {
      readBuffer[k] = BSWAP_32(readBuffer[k]);
    }
        offset = offset + payload;
    memcpy(pData, (uint8_t *)&readBuffer[1], payload*4);
    pData = pData + payload*4;

    }

  return errorcode;
}
xmshao 回答时间:2023-12-6 13:41:50

@47 发表于 2023-12-6 11:16</p>
<p>大佬帮忙看看我这里要咋改?

[md]hi,

你在HAL_SPI_TransmitReceive_DMA(),要读取接收数据时做Invalidate操作验证下。

@47 回答时间:2024-2-18 11:39:23

xmshao 发表于 2023-12-6 13:41
hi,</p>
<p>你在HAL_SPI_TransmitReceive_DMA(),要读取接收数据时做Invalidate操作验证下。

[md]hi

我在你说的基础上在接受前加了SCB_InvalidateDCache_by_Addr这个函数接收的数据没有问题了,但是经过大量的测试,在程序运行一段时间后会导致usb断连,

@47 回答时间:2024-4-8 19:23:00

xmshao 发表于 2023-12-5 15:50
开启了D-Cache了话,你要么将相应的缓冲区配置透写属性,要么在读取数据前做CacheInvalidate操作,类似如下 ...

你好 我现在发现用H750 dma+spi读写数据时发现当spi速度大于8M时出现内存不一致的问题,我再读之前已经SCB_CleanInvalidateDCache_by_Addr这个函数无效化内存了,速度小于8M时没有这个问题,我这个程序是运行在外挂的flash里的

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版