ST意法半导体
直播中

杜喜喜

7年用户 1510经验值
私信 关注
[问答]

使用NUCLEO-F412ZG从QSPI Flash执行时报错的问题求解

我在使用 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;
  • }







回帖(1)

申根换

2022-12-14 11:38:13
我发现了问题。问题是由错误的虚拟周期数引起的,导致内存映射区域的第一个字节错误,因此堆栈指针完全关闭(使用 10 个周期时前两个字节丢失)。QuadSPI 闪存减少到 6 个周期,现在可以使用了。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分