Обеспечь единый процесс обновления для STM32F103/F407/G474 и TMS320F2812/F28335: discovery, служебные ответы, BUSY, тайм-аут сессии и подтверждение приложения. Добавь самостоятельные проекты CCS, аппаратные хранилища и Python-клиент. Совместимость: структуры конфигурации и порта расширены, поэтому потребители должны пересобраться и обнулить новые поля. Для C28x callbacks используют pcan_boot_byte_t; периодический pcan_boot_poll обслуживает discovery и настроенный тайм-аут.
31 lines
4.6 KiB
C
31 lines
4.6 KiB
C
#include "boot_profile.h" /* Использует общий адресный профиль CANdle G474 и исключённое слово SRAM-запроса. */
|
||
#include "stm32g4xx.h" /* Получает CMSIS регистры и SystemInit выбранного STM32G474. */
|
||
#include "stm32g4xx_hal.h" /* Связывает SysTick самостоятельного загрузчика с HAL_GetTick. */
|
||
extern uint32_t __StackTop, __data_start, __data_end, __data_source, __bss_start, __bss_end; /* GNU linker задаёт границы runtime-инициализации и вершину отдельного стека. */
|
||
extern int main(void); /* Передаёт управление общему boot main после инициализации C runtime. */
|
||
void SysTick_Handler(void); /* Объявляет публичное имя обработчика до определения, как требует standalone startup. */
|
||
__attribute__((noreturn)) void Reset_Handler(void); /* Объявляет безвозвратную аппаратную точку входа GNU/Keil. */
|
||
static __attribute__((noreturn)) void fault(void) { for (;;) {} } /* Не выполняет произвольный переход при необработанном IRQ либо исключении загрузчика. */
|
||
void SysTick_Handler(void) { HAL_IncTick(); } /* Обеспечивает реальные миллисекундные тайм-ауты UART/FDCAN/HAL. */
|
||
__attribute__((noreturn)) void Reset_Handler(void) /* Сохраняет совместимость исходного startup с Arm Compiler 6 и GNU toolchain. */
|
||
{ /* На Arm Compiler runtime и scatter-loading предоставляет библиотечная функция __main. */
|
||
#if defined(__ARMCC_VERSION) /* Выбирает штатный C runtime Keil, не дублируя ZI/RW инициализацию. */
|
||
extern void __main(void); SystemInit(); __main(); /* Настраивает базовый MCU и запускает runtime перед main. */
|
||
#else /* GNU-вариант использует символы исходного linker script CANdle. */
|
||
uint32_t *source = &__data_source, *destination = &__data_start; /* Сохраняет Flash-источник и SRAM-назначение инициализированных данных. */
|
||
while (destination < &__data_end) *destination++ = *source++; /* Копирует только объявленную секцию data, не затрагивая исключённый SRAM-маркер. */
|
||
for (destination = &__bss_start; destination < &__bss_end; ++destination) *destination = 0U; /* Обнуляет ZI только внутри RAM-региона, согласованного с linker. */
|
||
SystemInit(); (void)main(); /* Запускает базовую конфигурацию MCU и общую загрузочную программу. */
|
||
#endif /* Завершает выбор C runtime для двух поддерживаемых toolchain. */
|
||
for (;;) {} /* Не допускает возврат из main в несуществующий вызывающий код reset. */
|
||
} /* Завершает Reset_Handler самостоятельного загрузчика. */
|
||
typedef void (*vector_t)(void); /* Описывает Thumb-обработчик аппаратного исключения Cortex-M4. */
|
||
static __attribute__((used, section(".vectors"))) const vector_t vectors[118] = { /* Сохраняет таблицу из 118 записей в начале 32-КиБ загрузочной Flash без ненужного внешнего символа. */
|
||
#if defined(__ARMCC_VERSION) /* Keil получает fixed MSP, совпадающий с ARM_LIB_STACK в общем scatter script. */
|
||
(vector_t)0x20013FF8UL, Reset_Handler, fault, fault, /* Резервирует последние восемь байт SRAM, чтобы пролог main не уничтожил маркер CANB до чтения. */
|
||
#else /* GNU linker вычисляет вершину стека по RAM_SIZE, также уменьшенному на восемь байт. */
|
||
(vector_t)&__StackTop, Reset_Handler, fault, fault, /* Использует linker-определение без жёсткого адреса для GNU сборки. */
|
||
#endif /* Завершает выбор совместимого initial MSP. */
|
||
[4 ... 14] = fault, [15] = SysTick_Handler, [16 ... 117] = fault /* Разрешает только SysTick; загрузочные UART/FDCAN обслуживаются опросом. */
|
||
}; /* Завершает извлечённую таблицу векторов CANdle G474. */
|