需求
使用 STM32U575 主控芯片,使用 QSPI 读写 W25Q128,简单的读写测试没有问题。但是在后面调试中发现,当按照 11 个字节一组进行读写,从 4352 这个地址开始写,写入到 4605 的时候,就超时状态了。 HAL_OSPI_STATE_ERROR
然后我单独从 4605 写入 11 个字节,确实会超时,但是前面写入并没有超时,很奇怪。
然后,我测试了一下,从0开始写,每次写 11 个字节,当从 1023 开始写入 11 个字节会超时。感觉好像是在 256字节的页边界出写入会出问题,但是又不是每个 256 边界都会出问题。
解决
先使用 16个字节为一组进行测试,没有跨界问题。然后又使用了4字节写入,写入了 400多万组,也没有任何问题。 这基本就说明了,是软件或者库的某个层面,因为32位对齐产生的这个 bug.
解决的方法也很简单,我原来写入 11 个字节是对结构体使用了 pragma pack(1)
,只要不用这个字节对齐命令,编译器会自动进行 32位对齐,重新测试,数据就可以正常读写,没有问题了。
参考
- stm32: QSPI flash driver concurrent access issue
- STM32L4使用QSPI驱动spiFLASH(W25Q64)
- {SPI/QSPI} 正确理解STM32H7驱动QSPI W25Q手册中时钟后缀1-2-2,1-4-4等代表的含义
- AN4760 Quad-SPI interface on STM32 microcontrollers and microprocessors
- HAL_QSPI_AutoPolling() fail when polling the SR of NOR flash in QPI mode
- Stm32h7 Hal qspi autpolling timeout
- stm32u575rit6 qspi driver
- ST external loader learning
- w25q flash series part 8 quadspi external loader