# STM32G474VET6: ProtoCAN Boot v1 / CANdle Исходный проект: `https://git.rd12.ru/setcorp/CANdle_stm32.git`, commit `61a93c5`. Аппаратный код извлечён из `src/boot/g474_can_bootloader.c`, `src/can_boot_control.c` и `src/boot/g474_boot_startup.c`; локальная CAN state machine заменена единым `src/pcan_boot.c`. Лицензия исходного проекта сохранена в [`LICENSE.source.md`](LICENSE.source.md). | Область | Начало | Конец, исключён | Размер | |---|---|---|---:| | Загрузчик | `0x08000000` | `0x08008000` | 32 КиБ | | Single-slot приложение | `0x08008000` | `0x08080000` | 480 КиБ | | RAM проекта | `0x20000000` | `0x20013FF8` | 80 КиБ − 8 байт | | Одноразовый запрос CANB | `0x20013FFC` | `0x20014000` | 4 байта | `boot_profile.h` содержит единые адреса/magic и совместимый API приложения. Валидатор векторов допускает прежний MSP вплоть до физической границы `0x20014000`; новые linker/startup исключают последние восемь байт, чтобы не затереть запрос до чтения в main. RAM-COMMIT не сохраняется после питания. ## Состав и подключение - `pcan_boot_stm32g474.c/.h` — reusable HAL FDCAN/Flash-порт с single-slot, независимым CRC readback, doubleword записью и проверкой TXBTO перед reset. - `boot_main.c` — самостоятельный CAN/UART-загрузчик CANdle, без собственной реализации wire-протокола; использует `pcan_boot` и общий `rs485-boot`. - `boot_startup.c` — исходная схема Keil/GCC startup с безопасным initial MSP. - `boot_control.c` — вход из приложения по адресному ENTER_BOOT или UART BEGIN, совместимый UART PING/ACK и исходный USART1 IRQ. В проекте CANdle старые файлы стали include-обёртками из submodule `templates`. BOOT Keil и CMake компилируют дополнительно `pcan_boot.c` и `pcan_boot_stm32g474.c`. Приложение использует общий `boot_control.c` без подключения загрузочной state machine к USB–CAN приложению. Board-проект предоставляет `device.h`, `device_sysclock_config`, `HAL_FDCAN_MspInit`, CMSIS/HAL и linker. Исходная плата использует CPU 144 МГц, FDCAN kernel 48 МГц, FDCAN1 PB8/PB9 AF9, classic CAN 500 кбит/с, DeviceType=7 / DeviceID=15. UART — PA9/PA10 AF7, 512000 бод, TTL без DE. Для reusable API вызовите `HAL_FDCAN_Init` с двумя extended-фильтрами, затем `pcan_boot_stm32g474_init`, затем регулярно `poll` из main. FDCAN и его TX FIFO должны принадлежать этому порту, без конкурирующих TX IRQ. ## Flash и протокол Поддерживается реальная плотность 512 КиБ. DBANK=1 использует два банка по 256 КиБ и страницы 2 КиБ; DBANK=0 — один банк 512 КиБ и страницы 4 КиБ. Номера страниц считаются отдельно для каждого банка, с проверкой всей округлённой области до erase. BFB2 и SYSCFG FB_MODE bank swap отвергаются; Option Bytes не изменяются. Другие плотности требуют собственного профиля. Flash программируется doubleword по восемь байт. Неполный doubleword дополняется FF только в конце образа; повторная запись ECC-слова в середине потока не допускается. UART использует тот же writer, что CAN DATA. VERIFY перечитывает Flash, COMMIT повторяет проверку, REBOOT возможен только после COMMIT и физически подтверждённого TX. Кодирование DLC определяется константами используемой версии HAL; старый сдвиг 16 и новый сдвиг 0 не смешиваются. Стирание синхронное. Клиент должен допускать длительное Flash stall; BUSY до и после erase поддерживает сессию. Постоянного manifest, A/B-rollback, resume после питания и аутентификации в исходном single-slot профиле нет. [Подключённые проекты и проверки Keil/CMake](../../projects/STM32.md).