对于大多数项目,建议使用外部闪存,因为这允许应用程序使用多个大型图像。 即便最普通的应用程序,内部闪存也可能会很快被占用完。
1.配置QSPI(嵌入式基础知识,此处不做分析)
2.编写W25Q256配置代码(copy正点原子例程)
w25q256.c#include "w25q256.h"
#include "quadspi.h"#define QUAD_INOUT_FAST_READ_4_BYTE_ADDR_CMD 0xEC
void QSPI_MemoryMapped(void)
{QSPI_CommandTypeDef s_command = {0};QSPI_MemoryMappedTypeDef s_mem_mapped_cfg = {0};s_command.InstructionMode = QSPI_INSTRUCTION_1_LINE;s_command.AddressSize = QSPI_ADDRESS_32_BITS;s_command.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;s_command.DdrMode = QSPI_DDR_MODE_DISABLE;s_command.DdrHoldHalfCycle = QSPI_DDR_HHC_ANALOG_DELAY;s_command.SIOOMode = QSPI_SIOO_INST_EVERY_CMD;s_command.Instruction = QUAD_INOUT_FAST_READ_4_BYTE_ADDR_CMD;s_command.AddressMode = QSPI_ADDRESS_4_LINES;s_command.DataMode = QSPI_DATA_4_LINES;s_command.DummyCycles = 6;s_mem_mapped_cfg.TimeOutActivation = QSPI_TIMEOUT_COUNTER_DISABLE;s_mem_mapped_cfg.TimeOutPeriod = 0;if(HAL_QSPI_MemoryMapped(&hqspi, &s_command, &s_mem_mapped_cfg) != HAL_OK){Error_Handler();}
}
quadspi.c/* USER CODE BEGIN QUADSPI_Init 2 */QSPI_MemoryMapped();/* USER CODE END QUADSPI_Init 2 */
3.修改分散加载文件
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************LR_IROM1 0x08000000 0x00200000 { ; load region size_regionER_IROM1 0x08000000 0x00200000 { ; load address = execution address*.o (RESET, +First)*(InRoot$$Sections).ANY (+RO).ANY (+XO)}RW_IRAM1 0x20000000 0x00020000 { ; RW data.ANY (+RW +ZI)}RW_IRAM2 0x24000000 0x00080000 {*(.RAM_D1)}RW_IRAM3 0x30000000 0x00048000 {*(.RAM_D2)}RW_IRAM4 0x38000000 0x00010000 {*(.RAM_D3)}
; RW_IRAM5 0xC0000000 UNINIT 0x02000000 {
; *(.RAM_SDRAM)
; }
}LR_ROM1 0x90000000 0x02000000 {ER_ROM1 0x90000000 0x02000000 { ; load address = execution address*.o (ExtFlashSection)*.o (TextFlashSection)*.o (FontFlashSection)}
}
4.添加下载算法(嵌入式基础知识,此处不做分析)
5.创建变量,仿真运行
/* USER CODE BEGIN PV */
//uint16_t framebuffer[1024 * 200]; //16 bpp framebuffer
uint16_t *framebuffer = (uint16_t *)0xC0000000; //16 bpp framebuffer__attribute__((section ("ExtFlashSection"))) const unsigned char qspi_flash[100];
/* USER CODE END PV */