diff --git a/APP/Clock.c b/APP/Clock.c index 57991f8..461aca5 100644 --- a/APP/Clock.c +++ b/APP/Clock.c @@ -106,8 +106,8 @@ static void Bsp_SCG_Init(void) { .bLock = false, .bCm = false, .bTrEn = false, - .bLpen = false, - .bSten = false, + .bLpen = true, + .bSten = true, .eDivH = SCG_ASYNCCLOCKDIV_BY1, .eDivM = SCG_ASYNCCLOCKDIV_BY1, .eDivL = SCG_ASYNCCLOCKDIV_BY2, @@ -165,6 +165,14 @@ static void Bsp_PCC_Init(void) { bSP_PCC_Config.eDivider = PCC_CLK_UNINVOLVED; PCC_SetPcc(&bSP_PCC_Config); + + // PCC_CLK_WKU0 + bSP_PCC_Config.eClockName = PCC_CLK_WKU0; + bSP_PCC_Config.bEn = true; + bSP_PCC_Config.eClkSrc = PCC_CLKGATE_UNINVOLVED; + bSP_PCC_Config.eDivider = PCC_CLK_UNINVOLVED; + + PCC_SetPcc(&bSP_PCC_Config); } void Bsp_Systick_Init(void) diff --git a/APP/main.c b/APP/main.c index f9e9371..4dda84d 100644 --- a/APP/main.c +++ b/APP/main.c @@ -62,8 +62,6 @@ const DMA_InitType dmaInitCfg = }; - - static _Noreturn void MainTransmitter_Thread(tBootMma *env) { DMA_Init(DMA_INSTANCE_0, &dmaInitCfg); @@ -90,6 +88,12 @@ static _Noreturn void MainTransmitter_Thread(tBootMma *env) { LoggerInfoStatic(&env->slog.logger, LOG_SIGN, "Initialization of subsystems") + if (RGM_SRS_WAKEUP_MASK == (RGM->SRS & RGM_SRS_WAKEUP_MASK)) { + + LoggerInfoStatic(&env->slog.logger, LOG_SIGN, "The bootloader is ignored (waking up)") + + } else { + // StorageOnFlash_Init(&env->slog.logger); // NVM_STORAGE.nf_storage_param.logger = &env->slog.logger; @@ -98,63 +102,66 @@ static _Noreturn void MainTransmitter_Thread(tBootMma *env) { // &env->slog.logger); - FirmwareLoader_Init(&env->FIRMWARE_HVAC, FIRMWARE_MAIN_AREA_LENGTH, FIRMWARE_MAIN_ADDR, - FIRMWARE_MAIN_UPDATE_ADDR); + FirmwareLoader_Init(&env->FIRMWARE_HVAC, FIRMWARE_MAIN_AREA_LENGTH, FIRMWARE_MAIN_ADDR, + FIRMWARE_MAIN_UPDATE_ADDR); - bool isMain = FirmwareLoader_CheckBlock(&env->FIRMWARE_HVAC, &env->FIRMWARE_HVAC.main); + bool isMain = FirmwareLoader_CheckBlock(&env->FIRMWARE_HVAC, &env->FIRMWARE_HVAC.main); - if (isMain) { - LoggerInfoStatic(&env->slog.logger, LOG_SIGN, "Main firmware: Checksum is correct") - } else { - LoggerInfoStatic(&env->slog.logger, LOG_SIGN, "Main firmware: Checksum is not correct") + if (isMain) { + LoggerInfoStatic(&env->slog.logger, LOG_SIGN, "Main firmware: Checksum is correct") + } else { + LoggerInfoStatic(&env->slog.logger, LOG_SIGN, "Main firmware: Checksum is not correct") - if (*env->FIRMWARE_HVAC.main.metadata.crc == 0) { - LoggerInfoStatic(&env->slog.logger, LOG_SIGN, "Main firmware: Checksum not found (The program may have been flashed using JTAG ?)") - } - } - - bool isUpdate = FirmwareLoader_CheckBlock(&env->FIRMWARE_HVAC, &env->FIRMWARE_HVAC.update); - - if (isUpdate) { - LoggerInfoStatic(&env->slog.logger, LOG_SIGN, "Recovery firmware: Checksum is correct") - } else { - LoggerInfoStatic(&env->slog.logger, LOG_SIGN, "Recovery firmware: Checksum is not correct") - } - - // Есть обновление - if (isUpdate) { - - // Если текущая прошивка (isMain) неисправна (не загружена) или в секции обновления находится отличная от текущей прошивка - bool isNewFirmware = FirmwareLoader_IsUpdateAndMainAreDifferent(&env->FIRMWARE_HVAC); - - // !isMain - Не совпадает crc основной прошивки isNewFirmware - есть рабочая прошивка в обновлении, которая отличается от основной (main) - if ((!isMain) || (isNewFirmware)) { - - LoggerInfoStatic(&env->slog.logger, LOG_SIGN, "Update detected") - LoggerInfoStatic(&env->slog.logger, LOG_SIGN, "Starting the update process") - - // Обновление -// FirmwareLoader_CopyUpdateToMain(&env->FIRMWARE_HVAC); - - LoggerInfoStatic(&env->slog.logger, LOG_SIGN, "Update complete") - - // Проверка crc - isMain = FirmwareLoader_CheckBlock(&env->FIRMWARE_HVAC, &env->FIRMWARE_HVAC.main); - - if (isMain) { - LoggerInfoStatic(&env->slog.logger, LOG_SIGN, "Main firmware (after update): Checksum is correct") - } else { - LoggerInfoStatic(&env->slog.logger, LOG_SIGN, "Main firmware (after update): Checksum is not correct") + if (*env->FIRMWARE_HVAC.main.metadata.crc == 0) { + LoggerInfoStatic(&env->slog.logger, LOG_SIGN, + "Main firmware: Checksum not found (The program may have been flashed using JTAG ?)") } } - } + bool isUpdate = FirmwareLoader_CheckBlock(&env->FIRMWARE_HVAC, &env->FIRMWARE_HVAC.update); + if (isUpdate) { + LoggerInfoStatic(&env->slog.logger, LOG_SIGN, "Recovery firmware: Checksum is correct") + } else { + LoggerInfoStatic(&env->slog.logger, LOG_SIGN, "Recovery firmware: Checksum is not correct") + } + + // Есть обновление + if (isUpdate) { + + // Если текущая прошивка (isMain) неисправна (не загружена) или в секции обновления находится отличная от текущей прошивка + bool isNewFirmware = FirmwareLoader_IsUpdateAndMainAreDifferent(&env->FIRMWARE_HVAC); + + // !isMain - Не совпадает crc основной прошивки isNewFirmware - есть рабочая прошивка в обновлении, которая отличается от основной (main) + if ((!isMain) || (isNewFirmware)) { + + LoggerInfoStatic(&env->slog.logger, LOG_SIGN, "Update detected") + LoggerInfoStatic(&env->slog.logger, LOG_SIGN, "Starting the update process") + + // Обновление +// FirmwareLoader_CopyUpdateToMain(&env->FIRMWARE_HVAC); + + LoggerInfoStatic(&env->slog.logger, LOG_SIGN, "Update complete") + + // Проверка crc + isMain = FirmwareLoader_CheckBlock(&env->FIRMWARE_HVAC, &env->FIRMWARE_HVAC.main); + + if (isMain) { + LoggerInfoStatic(&env->slog.logger, LOG_SIGN, "Main firmware (after update): Checksum is correct") + } else { + LoggerInfoStatic(&env->slog.logger, LOG_SIGN, + "Main firmware (after update): Checksum is not correct") + } + } + + } + } SystemDelayMs(10); BootJumpToAddress(FIRMWARE_MAIN_ADDR); for (;;) { + LoggerInfoStatic(&env->slog.logger, LOG_SIGN, "Bootloader error") SystemDelayMs(1000); } } @@ -171,6 +178,7 @@ int main(void) { NVIC_SetPriorityGrouping(NVIC_PRIORITY_GROUP_4); + osKernelInitialize(); tBootMma *env = &MAIN_BOOT_ENV;