СодержаниеПоказать
Article Directory
Use SREC_CAT to convert the bin file into a SREC file
One of the things missing for Embedded in the GNU linker is that it cannot generate a CRC checksum. Luckily, there is the solution of using SRecord:
<img data-attachment-id=»14792″ data-permalink=»https://mcuoneclipse.com/2015/04/26/crc-checksum-generation-with-srecord-tools-for-gnu-and-eclipse/srecord-1-64-web-page/» data-orig-file=»https://mcuoneclipse.files.wordpress.com/2015/04/srecord-1-64-web-page.png» data-orig-size=»1018,602″ data-comments-opened=»1″ data-image-meta=»{«aperture»:»0″,»credit»:»»,»camera»:»»,»caption»:»»,»created_timestamp»:»0″,»copyright»:»»,»focal_length»:»0″,»iso»:»0″,»shutter_speed»:»0″,»title»:»»,»orientation»:»0″}» data-image-title=»SRecord 1.64 Web Page» data-image-description=»
SRecord 1.64 Web Page
” data-image-caption=”
SRecord 1.64 Web Page
” data-medium-file=”https://mcuoneclipse.files.wordpress.com/2015/04/srecord-1-64-web-page.png?w=300″ data-large-file=”https://mcuoneclipse.files.wordpress.com/2015/04/srecord-1-64-web-page.png?w=584″ src=”https://mcuoneclipse.files.wordpress.com/2015/04/srecord-1-64-web-page.png?w=584&h=345″ alt=”SRecord 1.64 Web Page” srcset=”https://mcuoneclipse.files.wordpress.com/2015/04/srecord-1-64-web-page.png?w=584&h=345 584w, https://mcuoneclipse.files.wordpress.com/2015/04/srecord-1-64-web-page.png?w=150&h=89 150w, https://mcuoneclipse.files.wordpress.com/2015/04/srecord-1-64-web-page.png?w=300&h=177 300w, https://mcuoneclipse.files.wordpress.com/2015/04/srecord-1-64-web-page.png?w=768&h=454 768w, https://mcuoneclipse.files.wordpress.com/2015/04/srecord-1-64-web-page.png 1018w” sizes=”(max-width: 584px) 100vw, 584px”>
SRecord 1.64 Web Page
1 Introduction
Embedded firmware is generally divided into BootLoader and App. BootLoader is used to start verification, App upgrade, App version rollback and other functions. BootLoader runs in the first stage of CPU power on, and then jumps to the App address to execute the application. Therefore, when the firmware is released, there will be BootLoader firmware and App firmware; at this time, we expect to merge the BootLoader firmware and App firmware into one firmware, so that it only needs to be burned once in mass production.
CRC_To_HEX_Py
Скрипт предназначен для вставки контрольной суммы CRC16 в конец hex файла прошивки для последующего самотестирования кода во FLASH памяти микроконтроллера.
Скрипт создан для среды разработки STM32CubeIDE.
Проект, который являлся исходным материалом для данного скрипта: https://github.com/ethanhuanginst/STM32CubeIDE-Workshop-2019/tree/master/hands-on/06_F746-DISCO-CRC
Подготовка (для Windows)
- Скачать и установить интерпретатор Python3 (при установке доабвить исполняемый файл python в переменную среды Path);
- Разместить файл crc_to_hex.py и srec_cat.exe в корневом каталоге проекта STM32CubeIDE;
Настройка выполнения скрипта
- Открыть проект STM32CubeIDE;
- Нажать правой кнопкой мыши на проект и выбрать Propierties;
- Открыть раздел C/C++ Build->Settings вкладка Build Steps;
- В поле “Command:” раздела “Post-build steps” вписать строку:
python ../crc_to_hex.py "${ProjName}.hex" "${ProjName}_CRC.hex"
Далее после компиляции проекта будет создаваться Hex файл прошивки с контрольной суммой в конце.
Настройка загрузки Hex файла с контрольной суммой при отладке
- Создать отладочную конфигурацию и зайти в раздел Startup;
- В поле Load Image and Symbols необходимо добавить новую строку с настройкой на Hex файл с контрольной суммой;
- Далее настройки произвести как на примере ниже:
Алгоритм вычисления CRC16 программой srec_cat
Используемый полином: 0x1021
Начальное значение контрольной суммы: 0x1D0F
Функция на Си:
<div data-snippet-clipboard-copy-content=»uint16_t Crc16(uint8_t *pcBlock, uint32_t len)
{
uint16_t crc = 0x1D0F;
uint8_t i;
while (len–)
{
crc ^= *pcBlock++ << 8;
for (i = 0; i < 8; i++)
crc = crc & 0x8000 ? (crc << 1) ^ 0x1021 : crc <
uint16_t Crc16(uint8_t *pcBlock, uint32_t len)
{
uint16_t crc = 0x1D0F;
uint8_t i;
while (len--)
{
crc ^= *pcBlock++ << 8;
for (i = 0; i < 8; i++)
crc = crc & 0x8000 ? (crc << 1) ^ 0x1021 : crc << 1;
}
return crc;
}