XIP-режим

Работа c внешней флеш-памятью через SPIFI без передачи команд (XIP-режим — execute-in-place). Передаётся только адрес с тремя промежуточными байтами, первый из которых "0x20". Таким образом достигнута максимльная производительность с флеш-памятью типа W25Q64JV. Быстрее могут работать версии с поддержкой режима QPI, типа W25Q64FV, потому что у них в таком режиме один промежуточный байт, а не три.
This commit is contained in:
spam-receiver 2024-07-19 19:48:04 +03:00 committed by GitHub
parent 0338620acb
commit c3ac6fe729
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -323,6 +323,15 @@ int main()
HAL_SPIFI_MspInit(&spifi);
HAL_SPIFI_Reset(&spifi);
/* Переключение флеш-памяти в нормальный режим с командами, передав ей "0" в первом промежуточном байте */
const uint32_t cmd_chip_read_xip_init =
SPIFI_DIRECTION_INPUT |
SPIFI_CONFIG_CMD_INTLEN(3) |
SPIFI_CONFIG_CMD_FIELDFORM(SPIFI_FIELDFORM_ALL_PARALLEL) |
SPIFI_CONFIG_CMD_FRAMEFORM(SPIFI_FRAMEFORM_3ADDR) |
SPIFI_CONFIG_CMD_OPCODE(0xEB);
uint8_t tmp_byte_xip_init[1] = {0};
HAL_SPIFI_SendCommand_LL(&spifi, cmd_chip_read_xip_init, 0, 1, tmp_byte_xip_init, 0, 0, HAL_SPIFI_TIMEOUT);
Bootloader_UART_Init(); // Инициализация UART. НАстройка выводов и тактирования
@ -381,20 +390,31 @@ void SPIFI_Init()
HAL_SPIFI_W25_WriteSREG(&spifi, sreg1, sreg2 | (1 << 1)); // ? HAL_SPIFI_W25_QuadEnable(&spifi);
}
/* Количество промежуточных данных в команде 4READ = 0xEB равно 3 байта (в cmd_mem). */
/* Переключение флеш-памяти в режим без последующих команд чтения, передав ей "0x20" в первом промежуточном байте */
const uint32_t cmd_chip_read_xip_init =
SPIFI_DIRECTION_INPUT |
SPIFI_CONFIG_CMD_INTLEN(3) |
SPIFI_CONFIG_CMD_FIELDFORM(SPIFI_FIELDFORM_OPCODE_SERIAL) |
SPIFI_CONFIG_CMD_FRAMEFORM(SPIFI_FRAMEFORM_OPCODE_3ADDR) |
SPIFI_CONFIG_CMD_OPCODE(0xEB);
uint8_t tmp_byte_xip_init[1] = {0};
HAL_SPIFI_SendCommand_LL(&spifi, cmd_chip_read_xip_init, 0, 1, tmp_byte_xip_init, 0, 0x20, HAL_SPIFI_TIMEOUT);
/* Режим SPIFI без передачи команд, но с "0x20" в первых промежуточных байтах.
Количество промежуточных данных в команде 4READ = 0xEB равно 3 байта (в cmd_mem). */
SPIFI_MemoryCommandTypeDef cmd_mem = {
.OpCode = 0xEB,
.FieldForm = SPIFI_CONFIG_CMD_FIELDFORM_OPCODE_SERIAL,
.FrameForm = SPIFI_CONFIG_CMD_FRAMEFORM_OPCODE_3ADDR,
.InterimData = 0,
.InterimLength = 3,
.FieldForm = SPIFI_CONFIG_CMD_FIELDFORM_ALL_PARALLEL,
.FrameForm = SPIFI_CONFIG_CMD_FRAMEFORM_NOOPCODE_3ADDR,
.InterimData = 0x20,
.InterimLength = 3
};
SPIFI_MemoryModeConfig_HandleTypeDef spifi_mem = {
.Instance = spifi.Instance,
.CacheEnable = SPIFI_CACHE_ENABLE,
.CacheLimit = 0x00010000,
.Command = cmd_mem,
.Command = cmd_mem
};
HAL_SPIFI_MemoryMode_Init(&spifi_mem);