我一个项目用了STM32H723,用了1年多,挺好
当时板子设计时预留了【ESP-PSRAM64H】这个芯片,主要是非常便宜,2块多一片
当时一直没把这个搞转,手工读/写是正常的,就是内存映射一直不正常,只有映射读,写一直不成功,后来就放在哪儿了
一直报这个错误
最近项目在优化,要采集16位AD约10秒钟,又把这个RAM用上去提上日程
想着这个芯片出来好几年了,资料应该多一些了。
然后一直在网上找资料,能搜到的都是STM32H743的内存映射资料,STM32H723只有在硬汉论坛唯一的一篇
在这里【[SPI/QSPI] 贡献一个H723外扩串行RAM的例子】【https://www.armbbs.cn/forum.php?mod=viewthread&tid=120719】
初步对比了一下,基本没区别,唯一的是它开了MPU,我没开,
然后我将我的MPU开启后再测试,错误依旧
来回折腾依旧不行
我不服气,网友不会骗我吧,
再将它的内存映射代码复制到我的项目中,
就这块
[C] 纯文本查看 复制代码 OSPI_RegularCmdTypeDef sCommand;
OSPI_MemoryMappedTypeDef sMemMappedCfg;
sCommand.FlashId = HAL_OSPI_FLASH_ID_1;
sCommand.InstructionMode = HAL_OSPI_INSTRUCTION_4_LINES;
sCommand.InstructionSize = HAL_OSPI_INSTRUCTION_8_BITS;
sCommand.InstructionDtrMode = HAL_OSPI_INSTRUCTION_DTR_DISABLE;
sCommand.AddressMode = HAL_OSPI_ADDRESS_4_LINES;
sCommand.AddressSize = HAL_OSPI_ADDRESS_24_BITS;
sCommand.AddressDtrMode = HAL_OSPI_ADDRESS_DTR_DISABLE;
sCommand.AlternateBytesMode = HAL_OSPI_ALTERNATE_BYTES_NONE;
sCommand.DataMode = HAL_OSPI_DATA_4_LINES;
sCommand.DataDtrMode = HAL_OSPI_DATA_DTR_DISABLE;
sCommand.SIOOMode = HAL_OSPI_SIOO_INST_EVERY_CMD;
sCommand.Address = 0;
sCommand.NbData = 1;
/* Memory-mapped mode configuration for Quad Read mode 4-4-4*/
sCommand.OperationType = HAL_OSPI_OPTYPE_READ_CFG;
sCommand.Instruction = FAST_READ_QUAD;
sCommand.DummyCycles = FAST_READ_QUAD_DUMMY_CYCLES;
if (HAL_OSPI_Command(&PS_OSPI, &sCommand, HAL_OSPI_TIMEOUT_DEFAULT_VALUE)
!= HAL_OK) {
Error_Handler();
}
/* Memory-mapped mode configuration for Quad Write mode 4-4-4*/
sCommand.OperationType = HAL_OSPI_OPTYPE_WRITE_CFG;
sCommand.Instruction = QUAD_WRITE;
sCommand.DummyCycles = WRITE_QUAD_DUMMY_CYCLES;
sCommand.DQSMode = HAL_OSPI_DQS_ENABLE;
if (HAL_OSPI_Command(&PS_OSPI, &sCommand, HAL_OSPI_TIMEOUT_DEFAULT_VALUE)
!= HAL_OK) {
Error_Handler();
}
/*Disable timeout counter for memory mapped mode*/
sMemMappedCfg.TimeOutActivation = HAL_OSPI_TIMEOUT_COUNTER_DISABLE;
/*Enable memory mapped mode*/
if (HAL_OSPI_MemoryMapped(&PS_OSPI, &sMemMappedCfg) != HAL_OK) {
Error_Handler();
}
然后,就是TMD奇迹生效了,好了,内存映射能写入了
我再一点点对比,还是没有区别
我再把代码还原,对比,找出了唯一一个区别,就是这个
sCommand.DQSMode = HAL_OSPI_DQS_ENABLE;
我的没启用,它的启用了,我百思不得其解,这个DQS是用于HyperBus里的一个信号,普通4线制的用不上啊
我再反复测试了好几次,发现只要打勾了就正常,不打勾就不正常。
好了,我也不纠结这个问题了,反正好了就行,网友如果有此问题不防试试这个选项。
折腾了一年多的问题,其间隔三差五的我就要试试这个内存映射,今天终于好了。

谢谢 【regsofweb】网友。
|