UKSVEP_23550.2/Core/Bootloader/bootloader.h
Razvalyaev 320cce09ec сделано (проверено на can):
отправка ошибок бутлоадера по uart/can
проверка crc принятой страницы
проверка на бесконечное попадание в hardfault

в целом структура бута все еще в процессе разработки
2025-09-11 16:57:20 +03:00

94 lines
3.6 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef __BOOTLOADER_H
#define __BOOTLOADER_H
#include "boot_project_setup.h"
#include "string.h"
#define BL_KEY_APP_WRITTEN 0xAAAA5555
// ERROR DEFINES
/**
* @brief Комманды бутлоадера
*/
typedef enum {
CMD_ERASE = 0x01, ///< Команда на стирание прошивки
CMD_START_RECEIVE, ///< Команда на старт приема прошивки
CMD_WRITE, ///< Команда на запись блока прошивки
CMD_VERIFY, ///< Команда на проверку прошивки
CMD_GOTOAPP, ///< Команда на переход в приложение
CMD_RESET, ///< Команда на переход в приложение
CMD_GOTOBOOT, ///< Команда на переход в приложение
}BootloaderCommand_t;
/**
* @brief Состояние бутлоадера
*/
typedef enum {
BL_STATE_INIT = 0, ///< Состояние: инициализация
BL_STATE_JUMP_TO_APP, ///< Состояние: запуск приложения
BL_STATE_IDLE, ///< Состояние: ожидание команд
BL_STATE_ERASE, ///< Состояние: стирание флеша
BL_STATE_RECEIVE_UART, ///< Состояние: прием прошивки по UART
BL_STATE_RECEIVE_CAN, ///< Состояние: прием прошивки по CAN
BL_STATE_WRITE, ///< Состояние: запись данных
BL_STATE_VERIFY, ///< Состояние: проверка прошивки
BL_STATE_ERROR, ///< Состояние: ошибка
BL_STATE_RESET, ///< Состояние: сброс контролллера
BL_STATE_JUMP_TO_BOOT, ///< Состояние: запуск приложения
} BootloaderState_t;
/**
* @brief Ошибки бутлоадера
*/
typedef union {
uint16_t all;
struct {
unsigned unknown_cmd:1;
unsigned erase_err:1;
unsigned write_err:1;
unsigned verify_err:1;
unsigned timeout_receive:1;
unsigned crc_err:1;
unsigned hardfault_cycle:1;
unsigned memmanage_cycle:1;
}bit;
} BootloaderError_t;
typedef struct {
BootloaderState_t state; ///< текущее состояние бутлоадера
BootloaderError_t error;
uint32_t addr; ///< текущий адрес прошивки
uint8_t fw_size; ///< размер прошивки
uint8_t fw_buffer[PAGE_SIZE]; ///< буфер для приема прошивки (UART/CAN)
uint32_t fw_len; ///< длина принятого пакета
uint32_t fw_crc; ///< контрольная сумма прошивки
UART_HandleTypeDef *huart; ///< хендлер UART
CAN_HandleTypeDef *hcan; ///< хендер CAN
CAN_TxHeaderTypeDef TxHeader; ///< Заголовок CAN сообщения для отправки
BootloaderState_t prev_state; ///< предыдущее состояние бутлоадера
} Bootloader_t;
extern uint32_t TxMailBoxBoot;
extern uint8_t TXDataBoot[8];
void ResetKey(void);
void JumpToBootloader(void);
void SaveErrorCode(uint32_t code);
uint32_t LoadErrorCode(void);
uint32_t LoadErrorCnt(void);
void ClearErrorCode(void);
void Boot_SystemClock_Config(void);
void Bootloader_Task(Bootloader_t *bl);
uint8_t Receive_FW_Command(Bootloader_t *bl);
void Error_Handler(void);
#endif //__BOOTLOADER_H