STM32H750使能内存保护后DMA异常问题。
STM32H750 在使能内存保护后启用cache 导致SPI+DMA传输不准确,具体就是调用HAL_SPI_TransmitReceive_DMA 这个函数,读到的数据全是0,但是拿逻辑分析仪看上面显示的数据是正确的。开启了D-Cache了话,你要么将相应的缓冲区配置透写属性,要么在读取数据前做CacheInvalidate操作,类似如下函数 SCB_InvalidateDCache_by_Addr ()
。另外,此时申请的内存还需注意32字节对齐,类似ALIGN_32BYTES(uint8_t aRxBufferBUFFER_ALIGNED_SIZE])的写法。 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;
}
```
@47 发表于 2023-12-6 11:16
大佬帮忙看看我这里要咋改?
hi,
你在HAL_SPI_TransmitReceive_DMA(),要读取接收数据时做Invalidate操作验证下。
xmshao 发表于 2023-12-6 13:41
hi,
你在HAL_SPI_TransmitReceive_DMA(),要读取接收数据时做Invalidate操作验证下。
hi
我在你说的基础上在接受前加了`SCB_InvalidateDCache_by_Addr`这个函数接收的数据没有问题了,但是经过大量的测试,在程序运行一段时间后会导致usb断连,
xmshao 发表于 2023-12-5 15:50
开启了D-Cache了话,你要么将相应的缓冲区配置透写属性,要么在读取数据前做CacheInvalidate操作,类似如下 ...
你好 我现在发现用H750 dma+spi读写数据时发现当spi速度大于8M时出现内存不一致的问题,我再读之前已经`SCB_CleanInvalidateDCache_by_Addr`这个函数无效化内存了,速度小于8M时没有这个问题,我这个程序是运行在外挂的flash里的
页:
[1]