Я собираюсь порекомендовать другой рабочий процесс для достижения того же формата изображения:
<ISR Table> <FW-Header@FixedAddress0x200> <RestFWCode> " + CRC32
После установки процесс сборки будет:
- Построить образ FW длясоздать необработанный двоичный файл без значения CRC-32
- Вычислить CRC-32 на необработанном двоичном изображении, сторонний инструмент
- Вставить вычисленный CRC-32 в скрипт компоновщика, перестроить образ FW
Примечание. Для STM32CubeIDE вам потребуется собственный проект *.elf
, включающий проект STM32CubeMX в качестве статической библиотеки. В противном случае, STM32CubeMX будет перезаписывать ваш скрипт компоновщика каждый раз, когда генерирует новый код.
Поскольку каждый проект имеет свой скрипт компоновщика, который немного отличается, я собираюсь продемонстрировать использование сектора .test_crc
. Вставьте следующее в ваш скрипт компоновщика *.ld
:
.test_crc :
{
_image_start = .;
BYTE( 0x31)
BYTE( 0x32)
BYTE( 0x33)
BYTE( 0x34)
BYTE( 0x35)
BYTE( 0x36)
BYTE( 0x37)
BYTE( 0x38)
BYTE( 0x39)
/* FW Image Header */
LONG( _image_end - _image_start ) /* Size of FW image */
LONG( _image_start ) /* Base address to load FW image */
/* Place this at the end of the FW image */
_image_end = .;
_IMAGE_CRC = ABSOLUTE(0x0); /* Using CRC-32C (aka zip checksum) */
/*LONG( (-_IMAGE_CRC) - 1 ) /* Uncomment to append value, comment to calculate new value */
} >FLASH
Добавьте следующее как шаг после сборки в STM32CubeIDE (генерирует необработанное двоичное изображение):
arm-none-eabi-objcopy -S -O binary -j .test_crc ${ProjName}.elf ${ProjName}.bin
Теперь вашготов протестировать / оценить процесс:
- Перестройте проект, чтобы сгенерировать файл
*.bin
. - Используя сторонний инструмент, рассчитайте контрольную сумму CRC-32. Я использую интерфейс командной строки 7-Zip для генерации значения CRC-32C для
*.bin
файла - Добавьте вычисленный CRC-32C. В сценарии компоновщика установите
0x0
в следующем _IMAGE_CRC = ABSOLUTE(0x0)
, чтобы оно соответствовало вашему вычисленному значению. Раскомментируйте следующее:
LONG( (-_IMAGE_CRC) - 1 ) /* Uncomment to append value, comment to calculate new value */
Перестройте ваш образ и запустите стороннюю утилиту CRC, теперь она должна сообщить
0xFFFFFFFF
для значения CRC-32C.
Когда вы будете готовы применить это к вашему реальному образу FW, выполните следующие действия:
- Измените шаг после сборки, чтобы сбросить полный двоичный файл:
arm-none-eabi-objcopy -S -O binary ${ProjName}.elf ${ProjName}.bin
- Переместите
_image_start = .;
перед таблицей векторов. - Переместите следующее после таблицы векторов:
/* FW Image Header */
LONG( _image_end - _image_start ) /* Size of FW image */
LONG( _image_start ) /* Base address to load FW image */
Переместите следующее в конец последнего сектора:
/* Place this at the end of the FW image */
_image_end = .;
_IMAGE_CRC = ABSOLUTE(0x0); /* Using CRC-32C (aka zip checksum) */<br>
/*LONG( (-_IMAGE_CRC) - 1 ) /* Uncomment to append value, comment to calculate new value */
Вы можете обнаружить, что на самом деле вам не нужно значение CRC, встроенное в изображение, и можетепросто добавьте значение CRC к *.bin
. Затем предоставьте *.bin
вашему загрузчику. *.bin
будет по-прежнему содержать адрес загрузки и размер изображения FW, +4 байта для добавленного значения CRC.