我在使用 NUCLEO-F412ZG 和连接的 Winbond W25Q80DV QuadSPI 闪存直接从 QSPI 执行时遇到了一些问题,我们正在研究将其作为组件短缺的解决方法(将是 L4 变体,但使用 F4 进行测试)。
启用内存映射后读取内存工作正常,但一旦我们从引导加载程序跳转到地址 0x90000000,一切都会停止(试图在 SystemInit 中切换一个引脚,但没有做到这一点)。我们正在使用 Mbed OS,但问题似乎与此无关(我可以从我们的引导加载程序跳转到引导加载程序地址,并且 QSPI 仍然可以访问,因此似乎没有被重置)。为了进行测试,我将链接描述文件中的闪存地址从 0x8000000 更改为 0x90000000。
附加调试器时,它指出地址 0xe000ed0b。在 Mbed 中禁用 MPU 支持时,它声明地址 0x90000000 但只是挂起和变量。下面是启用内存映射的函数。
你们有什么提示吗?刚刚订购了一个安装了 QSPI 闪存的
STM32L496 DISCOVERY 套件,也只是为了检查不同的平台。非常感谢你提前。非常感谢所有的投入。
- qspi_status_t qspi_enable_memory_mode(qspi_t *obj)
- {
- QSPI_CommandTypeDef st_command;
- st_command.InstructionMode = QSPI_INSTRUCTION_1_LINE;
- st_command.Instruction = 0xEB;
- st_command.AddressMode = QSPI_ADDRESS_4_LINES;
- st_command.Address = 0;
- st_command.AddressSize = QSPI_ADDRESS_24_BITS;
- st_command.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
- st_command.DataMode = QSPI_DATA_4_LINES;
- st_command.DummyCycles = 10;
- st_command.DdrMode = QSPI_DDR_MODE_DISABLE;
- st_command.DdrHoldHalfCycle = QSPI_DDR_HHC_ANALOG_DELAY;
- st_command.SIOOMode = QSPI_SIOO_INST_EVERY_CMD;
- st_command.NbData = 1;
- QSPI_MemoryMappedTypeDef st_memory;
- st_memory.TimeOutPeriod = 0xFFFF;
- st_memory.TimeOutActivation = QSPI_TIMEOUT_COUNTER_DISABLE;
- if (HAL_QSPI_MemoryMapped(&obj->handle, &st_command, &st_memory) != HAL_OK) {
- return QSPI_STATUS_ERROR;
- }
- return QSPI_STATUS_OK;
- }