#include "mik32_hal.h"
#include "mik32_hal_spifi.h"
void SPIFI_Config();
void main()
{
// Конфигурация кэш памяти
// SPIFI переключаем в полный QPI режим
SPIFI_Config();
/* Загрузка из внешней flash по SPIFI */
asm volatile( "la ra, 0x80000000\n\t"
"jalr ra"
);
while (1)
{
}
}
void SPIFI_Config()
{
uint8_t tmp;
SPIFI_HandleTypeDef spifi;
SPIFI_CommandTypeDef spifi_enable_qpi;
SPIFI_MemoryCommandTypeDef spifi_qpi_memory_read;
SPIFI_MemoryModeConfig_HandleTypeDef spifi_mem_config;
spifi.Instance = SPIFI_CONFIG;
HAL_SPIFI_MspInit(&spifi); //делает ноги флешечным интерфейсом!
//сброс контроллера и его прерываний
SPIFI_CONFIG->STAT |= SPIFI_CONFIG_STAT_INTRQ_M | SPIFI_CONFIG_STAT_RESET_M;
//сбрасывает регистры на дефолтное значение
SPIFI_CONFIG->ADDR = 0x00;
SPIFI_CONFIG->IDATA = 0x00;
SPIFI_CONFIG->CLIMIT = 0x00000000;
spifi_enable_qpi.Direction = SPIFI_DIRECTION_INPUT;
spifi_enable_qpi.InterimLength = 0;
spifi_enable_qpi.FieldForm = SPIFI_FIELDFORM_ALL_SERIAL;
spifi_enable_qpi.FrameForm = SPIFI_FRAMEFORM_OPCODE;
spifi_enable_qpi.InterimData = 0;
spifi_enable_qpi.OpCode = 0x38; //команда "Enable QPI"
//врубаем QPI-режим
HAL_SPIFI_SendCommand(&spifi, &spifi_enable_qpi, 0, 0, &tmp);
//заполняем шаблон команды
spifi_qpi_memory_read.InterimLength = 3;
spifi_qpi_memory_read.FieldForm = SPIFI_FIELDFORM_ALL_PARALLEL;
spifi_qpi_memory_read.FrameForm = SPIFI_FRAMEFORM_OPCODE_3ADDR;
spifi_qpi_memory_read.InterimData = 0;
spifi_qpi_memory_read.OpCode = 0xEB; //команда "Quad I/O Fast Read" Полноценный QPI режим
spifi_mem_config.CacheEnable = SPIFI_CACHE_ENABLE;
spifi_mem_config.CacheLimit = 0x90000000; //не кэшировать всё, чей адрес выше 2,5 гигов?
spifi_mem_config.Instance = SPIFI_CONFIG;
spifi_mem_config.Command = spifi_qpi_memory_read;
HAL_SPIFI_MemoryMode_Init(&spifi_mem_config); //забиваем настройки кэша и команду, которая будет делать чтение из флэхи
}