HVAC_BOOT_M7/APP/main.c

122 lines
3.0 KiB
C

//
// Created by cfif on 22.09.2025.
//
#include "Clock.h"
#include "LoggerToSerialPort.h"
#include "LoggerInterface.h"
#include "StorageOnFlash.h"
#include "Rtcs.h"
#include "SerialPorts.h"
#include "CmsisRtosThreadUtils.h"
#include "SystemDelayInterface.h"
#include "DeviceStorage.h"
#include "BootJump.h"
#define BOOT_AREA_LENGTH (256 * 1024)
#define FIRMWARE_MAIN_ADDR (0x01000000 + BOOT_AREA_LENGTH)
#define FIRMWARE_MAIN_RECOVERY_ADDR (FIRMWARE_MAIN_ADDR + FIRMWARE_MAIN_AREA_LENGTH)
typedef struct {
tLoggerToSerialPort slog;
tDeviceStorage storage;
struct {
osThreadId_t id;
uint32_t stack[2048];
StaticTask_t controlBlock;
osThreadAttr_t attr;
} thread;
} tBootMma;
tBootMma MAIN_BOOT_ENV;
#define LOGGER &MAIN_ENV.slog.logger
#define LOG_SIGN "Boot"
_Noreturn void stop() {
while (1) {
asm("nop");
}
}
#define STOP stop();
#if (configCHECK_FOR_STACK_OVERFLOW > 0)
void vApplicationStackOverflowHook(TaskHandle_t xTask, const char *pcTaskName) {
PROCESS_UNUSED_VAR(xTask);
PROCESS_UNUSED_VAR(pcTaskName);
STOP
}
#endif
const DMA_InitType dmaInitCfg =
{
.eArbitrationAlgorithm = DMA_ARBITRATION_ALGORITHM_FIXED_PRIORITY,
.bHaltOnError = false
};
static _Noreturn void MainTransmitter_Thread(tBootMma *env) {
DMA_Init(DMA_INSTANCE_0, &dmaInitCfg);
StorageOnFlash_Init();
Rtcs_Init();
SerialPorts_Init();
// Настройка таймера реального времени
time_t set_timestamp = 0;
RtcSet(&RTCS.rtcI0, &set_timestamp);
LoggerToSerialPort_Init(
&env->slog,
0,
&SERIAL_PORTS.cliVirtualPortOut_Io,
&SERIAL_PORTS.SerialPortLog_IO,
&RTCS.rtcI0,
SERIAL_LOGGER_SHOW_TIME | SERIAL_LOGGER_SHOW_AUTHOR | SERIAL_LOGGER_SHOW_LOG_LEVEL,
1000
);
LoggerInfoStatic(&env->slog.logger, LOG_SIGN, "Start logging")
LoggerInfoStatic(&env->slog.logger, LOG_SIGN, "Initialization of subsystems")
NVM_STORAGE.nf_storage_param.logger = &env->slog.logger;
NVM_STORAGE.nf_storage_calib.logger = &env->slog.logger;
bool result = DeviceStorage_Init(&env->storage, true, &NVM_STORAGE.interface_calib, &NVM_STORAGE.interface_param,
&env->slog.logger);
BootJumpToAddress(FIRMWARE_MAIN_ADDR);
for (;;) {
SystemDelayMs(1000);
}
}
void MainTransmitter_StartThread(tBootMma *env) {
if (!env->thread.id) {
env->thread.id = osThreadNew((osThreadFunc_t) (MainTransmitter_Thread), (void *) (env), &env->thread.attr);
}
}
int main(void) {
Bsp_CLOCK_Init();
NVIC_SetPriorityGrouping(NVIC_PRIORITY_GROUP_4);
osKernelInitialize();
tBootMma *env = &MAIN_BOOT_ENV;
InitThreadAtrStatic(&env->thread.attr, "BootMma", env->thread.controlBlock, env->thread.stack,
osPriorityNormal);
MainTransmitter_StartThread(env);
osKernelStart();
STOP
}