Skip to content

Repository files navigation

CAN Firmware Downloader

Библиотека для приёма и программирования прошивки через CAN-интерфейс. Предназначена для загрузки firmware во флеш-память микроконтроллера.

Описание

Данный модуль обеспечивает приём данных прошивки, передаваемых по CAN-протоколу, их буферизацию и последующую запись во флеш-память по секторам. Поддерживается потоковый режим приёма с автоматической синхронизацией блоков данных.

Структура потока данных

Данные прошивки передаются в следующем формате:

Заголовок (18 байт)

Смещение Размер Описание
0 2 байта Ключ (0x08AA)
2 16 байт Зарезервировано (8 слов по 2 байта)

Блоки данных

Каждый блок имеет следующую структуру:

Поле Размер Описание
Точка входа (Entry Point) 4 байта Адрес начала выполнения после загрузки (только в первом блоке)
Размер блока 2 байта Размер блока в 16-битных словах
Адрес назначения 4 байта Адрес во флеш-памяти для загрузки блока
Данные переменный Непосредственно данные прошивки (размер = размер блока * 2 байта)

Завершение загрузки

Блок с размером = 0 сигнализирует об окончании передачи данных.

Пример потока данных

AA 08 00 00 00 00 00 00 ; Ключ (0x08AA) + резерв 00 00 00 00 00 00 00 00 00 00 00 00 3F 00 00 80 ; Точка входа (0x003F8000) 05 00 3F 00 10 90 ; Блок 1: размер=5 слов, адрес=0x003F9010 01 00 02 00 03 00 04 00 ; Данные блока 1 (5 слов) 05 00 02 00 3F 00 00 80 ; Блок 2: размер=2 слова, адрес=0x003F8000 00 77 25 76 ; Данные блока 2 (2 слова) 00 00 ; Завершение загрузки

API функции

void initFirmwareDownload(void)

Инициализирует процесс загрузки прошивки. Должна быть вызвана один раз перед началом приёма данных.

Параметры: нет

Возвращает: нет

void processCANFirmwareData(uint8_t* rx_buff_from_can, uint16_t length)

Основная функция обработки принятых CAN-данных. Вызывается каждый раз при получении нового CAN-сообщения.

Параметры:

  • rx_buff_from_can - указатель на буфер с принятыми данными
  • length - длина данных в байтах (обычно 8 для CAN)

Возвращает: нет

Примечание: Функция сохраняет состояние между вызовами, что позволяет обрабатывать данные, разбитые на несколько CAN-сообщений.

void XLNX_CAN_sendMessage(int32_t id, uint16_t* data, int32_t length)

Функция-заглушка для отправки CAN-сообщений. Должна быть реализована пользователем для конкретной CAN-периферии.

Параметры:

  • id - идентификатор CAN-сообщения
  • data - указатель на данные для отправки
  • length - длина данных в 16-битных словах

Коды ответных сообщений

Функция XLNX_CAN_sendMessage отправляет следующие сообщения:

Код Описание
0x0001 Готовность принять следующий сектор
0x0002 Завершение загрузки прошивки

Структуры данных

Глобальное состояние g_progState

static struct {
    uint32_t currentAddr;       // Текущий адрес для записи
    uint16_t blockSizeWords;    // Размер текущего блока (в словах)
    uint16_t wordCount;         // Счётчик принятых слов
    uint8_t buffer[256];        // Буфер для накопления данных
    uint8_t bufferIndex;        // Индекс в буфере
    uint8_t state;              // 0=ожидание, 1=приём данных
    uint8_t sectorBuffer[0x4000]; // Буфер сектора (16KB)
    uint32_t sectorAddr;        // Адрес текущего сектора
    uint16_t sectorOffset;      // Смещение в секторе
    uint16_t remainingBytes;    // Остаток байт в блоке
    uint16_t skipBytes;         // Байты для пропуска
    uint32_t entriPoint;        // Точка входа
} g_progState;

About

Программа по тестированию функции загрузки прошивки в процессор

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages