Merge pull request #3 from spam-receiver/main

XIP-режим
This commit is contained in:
khristolyubov 2024-08-16 17:44:45 +07:00 committed by GitHub
commit 5b077eb2b6
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -4,7 +4,7 @@
#include "power_manager.h" #include "power_manager.h"
#include "uart.h" #include "uart.h"
#include "pad_config.h" #include "pad_config.h"
#include "mcu32_memory_map.h" #include "mik32_memory_map.h"
#include "riscv_csr_encoding.h" #include "riscv_csr_encoding.h"
#include "csr.h" #include "csr.h"
@ -16,6 +16,7 @@
"jalr ra" \ "jalr ra" \
); );
#define CHIP_MODE 1 /* Режим работы МФП (SPIFI Memory Mode): 0 = QSPI или 1 = QPI */
#define ACK 0x0F /* Подтверждение */ #define ACK 0x0F /* Подтверждение */
#define NACK 0xF0 /* Нет подтверждения */ #define NACK 0xF0 /* Нет подтверждения */
@ -27,7 +28,7 @@ typedef enum
{ {
PACKAGE_SIZE = 0x30, /* Команда размера пакета */ PACKAGE_SIZE = 0x30, /* Команда размера пакета */
SEND_PACKAGE = 0x60, /* Команда отправить пакет */ SEND_PACKAGE = 0x60, /* Команда отправить пакет */
FULL_ERASE = 0xFE /* Команда стирания spifi*/ FULL_ERASE = 0xFE /* Команда стирания spifi */
} BotloaderComand; } BotloaderComand;
typedef enum typedef enum
@ -316,13 +317,36 @@ void Bootloader_Commands()
void SystemClock_Config(); void SystemClock_Config();
int main() int main()
{ {
SystemClock_Config(); SystemClock_Config();
HAL_SPIFI_MspInit(&spifi); HAL_SPIFI_MspInit(&spifi);
HAL_SPIFI_Reset(&spifi); HAL_SPIFI_Reset(&spifi);
/* Переключение флеш-памяти в нормальный режим с командами, передав ей "0" в промежуточном байте */
const uint32_t cmd_chip_read_xip_init =
SPIFI_DIRECTION_INPUT |
#if CHIP_MODE == 1
SPIFI_CONFIG_CMD_INTLEN(1) |
#else
SPIFI_CONFIG_CMD_INTLEN(3) |
#endif
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);
#if CHIP_MODE == 1
/* Переключение флеш-памяти из режима QPI в обычный режим SPI */
const uint32_t cmd_qpi_disable =
SPIFI_DIRECTION_INPUT |
SPIFI_CONFIG_CMD_INTLEN(0) |
SPIFI_CONFIG_CMD_FIELDFORM(SPIFI_FIELDFORM_ALL_PARALLEL) |
SPIFI_CONFIG_CMD_FRAMEFORM(SPIFI_FRAMEFORM_OPCODE) |
SPIFI_CONFIG_CMD_OPCODE(0xFF);
HAL_SPIFI_SendCommand_LL(&spifi, cmd_qpi_disable, 0, 0, 0, 0, 0, HAL_SPIFI_TIMEOUT);
#endif
Bootloader_UART_Init(); // Инициализация UART. НАстройка выводов и тактирования Bootloader_UART_Init(); // Инициализация UART. НАстройка выводов и тактирования
@ -380,21 +404,55 @@ void SPIFI_Init()
uint8_t sreg1 = HAL_SPIFI_W25_ReadSREG(&spifi, W25_SREG1); uint8_t sreg1 = HAL_SPIFI_W25_ReadSREG(&spifi, W25_SREG1);
HAL_SPIFI_W25_WriteSREG(&spifi, sreg1, sreg2 | (1 << 1)); // ? HAL_SPIFI_W25_QuadEnable(&spifi); HAL_SPIFI_W25_WriteSREG(&spifi, sreg1, sreg2 | (1 << 1)); // ? HAL_SPIFI_W25_QuadEnable(&spifi);
} }
/* Количество промежуточных данных в команде 4READ = 0xEB равно 3 байта (в cmd_mem). */ #if CHIP_MODE == 1
/* Переключение флеш-памяти в режим QPI, когда весь обмен четырёхпроводной */
const uint32_t cmd_qpi_enable =
SPIFI_DIRECTION_INPUT |
SPIFI_CONFIG_CMD_INTLEN(0) |
SPIFI_CONFIG_CMD_FIELDFORM(SPIFI_FIELDFORM_ALL_SERIAL) |
SPIFI_CONFIG_CMD_FRAMEFORM(SPIFI_FRAMEFORM_OPCODE) |
SPIFI_CONFIG_CMD_OPCODE(0x38);
HAL_SPIFI_SendCommand_LL(&spifi, cmd_qpi_enable, 0, 0, 0, 0, 0, HAL_SPIFI_TIMEOUT);
/* Переключение флеш-памяти в режим без последующих команд чтения, передав ей "0x20" в промежуточном байте */
const uint32_t cmd_chip_read_qpi_xip_init =
SPIFI_DIRECTION_INPUT |
SPIFI_CONFIG_CMD_INTLEN(1) |
SPIFI_CONFIG_CMD_FIELDFORM(SPIFI_FIELDFORM_ALL_PARALLEL) |
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_qpi_xip_init, 0, 1, tmp_byte_xip_init, 0, 0x20, HAL_SPIFI_TIMEOUT);
#else
/* Переключение флеш-памяти в режим без последующих команд чтения, передав ей "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);
#endif
/* Режим SPIFI без передачи команд, но с "0x20" в первых промежуточных байтах. */
SPIFI_MemoryCommandTypeDef cmd_mem = { SPIFI_MemoryCommandTypeDef cmd_mem = {
.OpCode = 0xEB, .OpCode = 0xEB,
.FieldForm = SPIFI_CONFIG_CMD_FIELDFORM_OPCODE_SERIAL, .FieldForm = SPIFI_CONFIG_CMD_FIELDFORM_ALL_PARALLEL,
.FrameForm = SPIFI_CONFIG_CMD_FRAMEFORM_OPCODE_3ADDR, .FrameForm = SPIFI_CONFIG_CMD_FRAMEFORM_NOOPCODE_3ADDR,
.InterimData = 0, .InterimData = 0x20,
.InterimLength = 3, #if CHIP_MODE == 1
.InterimLength = 1 /* Количество промежуточных данных в команде 0xEB режима QPI равно 1 байт. */
#else
.InterimLength = 3 /* Количество промежуточных данных в команде 0xEB режима QSPI равно 3 байта. */
#endif
}; };
SPIFI_MemoryModeConfig_HandleTypeDef spifi_mem = { SPIFI_MemoryModeConfig_HandleTypeDef spifi_mem = {
.Instance = spifi.Instance, .Instance = spifi.Instance,
.CacheEnable = SPIFI_CACHE_ENABLE, .CacheEnable = SPIFI_CACHE_ENABLE,
.CacheLimit = 0x00010000, .CacheLimit = 0x00010000,
.Command = cmd_mem, .Command = cmd_mem
}; };
HAL_SPIFI_MemoryMode_Init(&spifi_mem); HAL_SPIFI_MemoryMode_Init(&spifi_mem);