в функции обновления теперь берется реальный размер прошивки с небольшим запасом, ограничивается сверху по размеру флешки и записывается в лимит кеша

This commit is contained in:
KLASSENTS 2025-05-30 11:44:46 +07:00
parent dba235e839
commit 8d9cca1503

View File

@ -3,23 +3,39 @@
#include "mik32_hal_irq.h" #include "mik32_hal_irq.h"
#include "Arduino.h" #include "Arduino.h"
// --------------------- change flash cache limit --------------------- // // --------------------- flash cache limit --------------------- //
#include "mcu32_memory_map.h" #include "mcu32_memory_map.h"
#include "mik32_hal_spifi_w25.h" #include "mik32_hal_spifi_w25.h"
#define CLIMIT_NEW (2 * 256 * 1024) // Новый предел кэширования
// Объявляем, что эта функция исполняется из RAM // define board flash size
#if defined(ARDUINO_START_MIK32_V1)
#define FLASH_SIZE 0x00400000 // 4 Mb
#elif defined(ARDUINO_ACE_UNO_16MB)
#define FLASH_SIZE 0x01000000 // 16 Mb
#elif defined(ARDUINO_ACE_UNO_32MB)
#define FLASH_SIZE 0x02000000 // 32 Mb
#else
#define FLASH_SIZE 0x00800000 // 8 Mb
#endif
// define margin from flash end
#define FLASH_END_OFFSET 0x1000
// values from ld script
extern uint8_t __TEXT_START__[];
extern uint8_t __TEXT_END__[];
// RAM-function for updating flash cache limit by app size to improve performance
__attribute__((section(".ram_text"))) void updateCacheLimit(void) __attribute__((section(".ram_text"))) void updateCacheLimit(void)
{ {
uint32_t MCMDbackup = SPIFI_CONFIG->MCMD; // Прочитать текущие настройки из регистра MCMD uint32_t new_limit = (uintptr_t)__TEXT_END__ - (uintptr_t)__TEXT_START__ + 128; // 128 byte for margin
SPIFI_CONFIG->STAT |= SPIFI_CONFIG_STAT_RESET_M; // Сброс режима MCMD: установить бит RESET // limit cache size by flash size with margin
SPIFI_CONFIG->CLIMIT = CLIMIT_NEW; // Установить новое значение CLIMIT if (new_limit > (FLASH_SIZE - FLASH_END_OFFSET))
SPIFI_CONFIG->MCMD = MCMDbackup; // Вернуть обратно значение в регистр MCMD new_limit = FLASH_SIZE - FLASH_END_OFFSET;
}
uint32_t getCLimit(void) uint32_t MCMDbackup = SPIFI_CONFIG->MCMD; // save current value from MCMD
{ SPIFI_CONFIG->STAT |= SPIFI_CONFIG_STAT_RESET_M; // reset MCMD mode for writing new CLIMIT
return SPIFI_CONFIG->CLIMIT; SPIFI_CONFIG->CLIMIT = new_limit; // set new CLIMIT
SPIFI_CONFIG->MCMD = MCMDbackup; // restore MCMD value
} }
// --------------------- init --------------------- // // --------------------- init --------------------- //
@ -39,6 +55,8 @@ extern "C" void SystemInit(void)
// for delays // for delays
SysTick_Init(); SysTick_Init();
// update flash cache limit by app size
updateCacheLimit();
} }
// called after setup() // called after setup()