STM32
直播中

刘艳

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

STM32H750把QSPI映射成内存模式,一对0x9000000UL进行读,就进入HardFault_Handler怎么解决?

我想用QSPI FLASH 作OTA,选用的是W25Q64,现在对QSPI的读写都正常,但是把QSPI 映射成内存模式,一对 0x9000000UL 进行读,就进入HardFault_Handler, 下面是我配置映射的代码,哪位大侠能帮看看有什么问题没有我芯片是用的STM32H750VB   用的STM32CUBE


static unsigned int QSPI_EnableMemoryMappedMode(QSPI_HandleTypeDef *QSPIHandle)
{
  QSPI_CommandTypeDef      s_command;
  QSPI_MemoryMappedTypeDef s_mem_mapped_cfg;

  // Configure the command for the read instruction
  s_command.InstructionMode   = QSPI_INSTRUCTION_1_LINE;
  s_command.Instruction       = QUAD_INOUT_FAST_READ_CMD;
        s_command.Address           = 0;        
  s_command.AddressMode       = QSPI_ADDRESS_4_LINES;
  s_command.AddressSize       = QSPI_ADDRESS_24_BITS;
        s_command.AlternateBytes                 = 0x00;        
  s_command.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
        s_command.AlternateBytesSize = QSPI_ALTERNATE_BYTES_8_BITS;        
  s_command.DataMode          = QSPI_DATA_4_LINES;
        s_command.NbData            = 1;   //???????        
  s_command.DummyCycles       = 6;
  s_command.DdrMode           = QSPI_DDR_MODE_DISABLE;
  s_command.DdrHoldHalfCycle  = QSPI_DDR_HHC_ANALOG_DELAY;
  s_command.SIOOMode          = QSPI_SIOO_INST_EVERY_CMD;

  // Configure the memory mapped mode
  s_mem_mapped_cfg.TimeOutActivation = QSPI_TIMEOUT_COUNTER_DISABLE;
  s_mem_mapped_cfg.TimeOutPeriod     = 0;

  return HAL_QSPI_MemoryMapped(QSPIHandle,  s_command,  s_mem_mapped_cfg);
}
*/
static unsigned int QSPI_EnableMemoryMappedMode(QSPI_HandleTypeDef *QSPIHandle)
{
  QSPI_CommandTypeDef      s_command;
  QSPI_MemoryMappedTypeDef s_mem_mapped_cfg;

  // Configure the command for the read instruction
  s_command.InstructionMode   = QSPI_INSTRUCTION_4_LINES;
  s_command.Instruction       = QUAD_INOUT_FAST_READ_CMD;
        s_command.Address           = 0;        
  s_command.AddressMode       = QSPI_ADDRESS_4_LINES;
  s_command.AddressSize       = QSPI_ADDRESS_32_BITS; //  24 32 都试过
        s_command.AlternateBytes                 = 0x00;        
  s_command.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
        s_command.AlternateBytesSize = QSPI_ALTERNATE_BYTES_8_BITS;        
  s_command.DataMode          = QSPI_DATA_4_LINES;
        s_command.NbData            = 1;   //???????        
  s_command.DummyCycles       = 6;
  s_command.DdrMode           = QSPI_DDR_MODE_DISABLE;
  s_command.DdrHoldHalfCycle  = QSPI_DDR_HHC_ANALOG_DELAY;
  s_command.SIOOMode          = QSPI_SIOO_INST_EVERY_CMD;

  // Configure the memory mapped mode
  s_mem_mapped_cfg.TimeOutActivation = QSPI_TIMEOUT_COUNTER_DISABLE;
  s_mem_mapped_cfg.TimeOutPeriod     = 0;

  return HAL_QSPI_MemoryMapped(QSPIHandle,  s_command,  s_mem_mapped_cfg);
}



回帖(1)

贾小龙

2024-4-1 16:53:12
从您提供的代码段来看,设置QSPI的内存映射模式需要进行以下步骤:

1. 为QSPI命令配置结构体s_command:
   
   ```
   QSPI_CommandTypeDef s_command;
   ```

2. 配置QSPI命令的有关参数,如地址、数据长度、读模式等等:

   ```
   s_command.InstructionMode = QSPI_INSTRUCTION_1_LINE;
   s_command.Instruction = READ_CMD;
   s_command.AddressMode = QSPI_ADDRESS_1_LINE;
   s_command.AddressSize = QSPI_ADDRESS_24_BITS;
   s_command.DataMode = QSPI_DATA_4_LINES;
   s_command.DummyCycles = 0;
   s_command.DdrMode = QSPI_DDR_MODE_DISABLE;
   s_command.SIOOMode = QSPI_SIOO_INST_EVERY_CMD;
   s_command.NbData = buffer_size;
   s_command.Address = 0x90000000UL; // 这里需要修改成您要读取的地址
   
   // 使用QSPI发送读命令
   HAL_QSPI_Command(&QSPIHandle, &s_command, HAL_QPSI_TIMEOUT_DEFAULT_VALUE);
   ```

3. 配置QSPI内存映射:
   
   ```
   QSPI_MemoryMappedTypeDef s_mem_mapped_cfg;
   s_mem_mapped_cfg.TimeOutActivation = QSPI_TIMEOUT_COUNTER_DISABLE;
   s_mem_mapped_cfg.TimeOutPeriod = 0;
   
   HAL_QSPI_MemoryMapped(&QSPIHandle, &s_mem_mapped_cfg);
   ```

请仔细检查以上步骤是否正确设置,特别要注意地址、读模式等参数是否正确。如果仍然进入HardFault_Handler,请检查QSPI配置是否正确,如时钟配置、引脚配置等等。可能需要进一步调试并查看硬件手册和库文档以找到问题。
举报

更多回帖

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