Connect with us

Hi, what are you looking for?

Авто

1. Use environment

1. Use environment

СодержаниеПоказать

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)

  1. Скачать и установить интерпретатор Python3 (при установке доабвить исполняемый файл python в переменную среды Path);
  2. Разместить файл crc_to_hex.py и srec_cat.exe в корневом каталоге проекта STM32CubeIDE;

Настройка выполнения скрипта

  1. Открыть проект STM32CubeIDE;
  2. Нажать правой кнопкой мыши на проект и выбрать Propierties;
  3. Открыть раздел C/C++ Build->Settings вкладка Build Steps;
  4. В поле “Command:” раздела “Post-build steps” вписать строку:
python ../crc_to_hex.py "${ProjName}.hex" "${ProjName}_CRC.hex"

Заглушка колеса лада веста св кросс на дискСкриншот настройки выполнения

Далее после компиляции проекта будет создаваться Hex файл прошивки с контрольной суммой в конце.

Настройка загрузки Hex файла с контрольной суммой при отладке

  1. Создать отладочную конфигурацию и зайти в раздел Startup;
  2. В поле Load Image and Symbols необходимо добавить новую строку с настройкой на Hex файл с контрольной суммой;
  3. Далее настройки произвести как на примере ниже:

Заглушка колеса лада веста св кросс на дискСкриншот настройки загрузки

Алгоритм вычисления 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;
}