跳转到主要内容

6. 外部可寻址闪存

动机

在这一步,我们将在存储映射模式下使能外部的Quad或Octo SPI闪存。 对于大多数项目,建议使用外部闪存,因为这允许应用程序使用多个大型图像。 即便最普通的应用程序,内部闪存也可能会很快被占用完。

Note
若开发板不支持外部闪存,请跳过此步骤。

如需将数据存放在外部闪存,保证MCU可以读取外部闪存非常重要。 外部闪存应以所需速度(通常为最大速度) 运行,以获得最佳性能。

目标

本节旨在使能外部闪存,并使用存储器映射模式,从中读取数据。 由于外部闪存的读取速度对图形处理非常重要,因此您还应该测试读取速度。

验证

以下是本节的验证点:

验证点基本原理
外部闪存可读外部闪存可用于图像存储
外部闪存性能图形处理性能在很大程度上取决于存储器性能

先决条件

以下是此步骤的先决条件:

  • 有关闪存的信息,查阅数据手册
  • 有关MCU和外部闪存之间的连接的信息

执行

在STM32CubeMX中,QSPI控制器在“连接”->“QUADSPI”下进行配置:

配置QSPI闪存

在模式部分,您可以将闪存配置为单/双/四数据线。 四数据线最快。 与外部RAM相似,这里还需选择和配置用于数据线、片选和时钟信号的GPIO。

块模式

使能闪存后,我们可以通过从中读取数据来对其进行测试。 STM32Cube固件包包含有关示例。

存储器映射模式

使能闪存的块模式对其进行测试后,必须将其更改为存储器映射模式。 这将允许CPU直接从闪存中获取数据。

STM32 STM32Cube HAL包含用于更改为存储器映射模式的函数。 这里给出了一个示例。 必须通过查阅数据手册来获取配置数据。 MCU的STM32Cube固件包包含更多示例。

main.c
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.AddressMode = QSPI_ADDRESS_4_LINES;
s_command.AddressSize = QSPI_ADDRESS_24_BITS;
s_command.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
s_command.DataMode = QSPI_DATA_4_LINES;
s_command.DummyCycles = N25Q128A_DUMMY_CYCLES_READ_QUAD;
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;

if (HAL_QSPI_MemoryMapped(&QSPIHandle, &s_command, &s_mem_mapped_cfg) != HAL_OK)
{
return QSPI_ERROR;
}

如果您使用了与STM32评估套件相同的闪存,则这些板的BSP软件包 (也在STM32Cube固件中) 中包含有价值示例,可经过修改后用于您的硬件上。

当闪存处于存储器映射模式时,您可以像使用外部RAM中的代码那样对外部闪存的代码进行测试(在MCU数据表手册中查找地址):

volatile uint32_t *externalFlash = 0x90000000;
const uint32_t size = 1000;
volatile uint32_t result = 0;

//read external Flash
for(int i = 0; i < size; i++)
{
result += externalFlash[i];
}

重新使用先前步骤所做的存储器性能测试,以测试外部闪存的性能。