@47 发表于 2023-12-5 15:38:44

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

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

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={0};
//ALIGN_32BYTES (static uint32_t   readBuffer) __attribute__((section(".ARM.__at_0x24000000")));
uint32_t readBuffer={0};
//uint8_t RBuffer;
        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 = address;
    localBuffer = localBuffer|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 = BSWAP_32(readBuffer);
    }
                offset = offset + payload;
    memcpy(pData, (uint8_t *)&readBuffer, payload*4);
    pData = pData + payload*4;

        }

return errorcode;
}
```

xmshao 发表于 2023-12-6 13:41:50

@47 发表于 2023-12-6 11:16


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


hi,

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

@47 发表于 2024-2-18 11:39:23

xmshao 发表于 2023-12-6 13:41
hi,

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


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里的
页: [1]
查看完整版本: STM32H750使能内存保护后DMA异常问题。