Skip to content

denruss/stm32_MyDfu

Repository files navigation

Как работает загрузчик

Загрузчик при запуске проверяет:

  1. CRC основной прошивки
  2. Регистр RTC_BKP_DR1

Если CRC совпадает и регистр RTC_BKP_DR1 == 0, тогда запускается основная программа. Если же CRC не совпадает или RTC_BKP_DR1 != 0, тогда загрузчик ждёт файл прошивки *.dfu. Отправить ему файл прошивки можно программой DfuSeDemo из комплекта http://www.st.com/en/development-tools/stsw-stm32080.html

Что надо сделать в проекте основной программы

  1. В файле system_stm32f1xx.с надо изменить #define VECT_TAB_OFFSET 0x00000000 -> 0x00006000

  2. В настройках среды (я использую IAR) надо включить добавление CRC суммы в конце файла прошивки

  3. В линкер файле *.icf изменить адреса программы и добавить секцию checksum

/*###ICF### Section handled by ICF editor, don't touch! ****/

/-Editor annotation file-/

/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */

/-Specials-/

define symbol ICFEDIT_intvec_start = 0x08006000;

/-Memory Regions-/

define symbol ICFEDIT_region_ROM_start = 0x08006000;

define symbol ICFEDIT_region_ROM_end = 0x0800FBFF;

define symbol ICFEDIT_region_RAM_start = 0x20000000;

define symbol ICFEDIT_region_RAM_end = 0x20004FFF;

/-Sizes-/

define symbol ICFEDIT_size_cstack = 0x800;

define symbol ICFEDIT_size_heap = 0x800;

/**** End of ICF editor section. ###ICF###*/

define memory mem with size = 4G;

define region ROM_region = mem:[from ICFEDIT_region_ROM_start to ICFEDIT_region_ROM_end];

define region RAM_region = mem:[from ICFEDIT_region_RAM_start to ICFEDIT_region_RAM_end];

define block CSTACK with alignment = 8, size = ICFEDIT_size_cstack { };

define block HEAP with alignment = 8, size = ICFEDIT_size_heap { };

initialize by copy { readwrite };

do not initialize { section .noinit };

place at address mem:ICFEDIT_intvec_start { readonly section .intvec };

place in ROM_region { readonly };

place in RAM_region { readwrite, block CSTACK, block HEAP };

/*place at address mem:ICFEDIT_region_ROM_end-3 { readonly section .checksum }; */

place at end of ROM_region { readonly section .checksum };

  1. Чтобы вызвать загрузчик из основной программы, необходимо записать в регистр RTC_BKP_DR1 число, отличное от нуля (а) и перезагрузить микроконтроллер (б).

    а) HAL_RTCEx_BKUPWrite(&RtcHandle, RTC_BKP_DR1, 1);

    б) while(1) {} //ждём, когда сработает сторожевой таймер и перезагрузит МК

П.С. Не забыть настроить wdg и backup registers.

Как сделать файл для загрузки, *.dfu

  1. В настройках среды (я использую IAR) надо включить генерацию hex файла

  2. Далее, из полученного hex файла надо сгенерировать dfu файл, используя программу Dfuse File Maneger, из комплекта http://www.st.com/en/development-tools/stsw-stm32080.html

Проект, который работает с этим загрузчиком

https://github.com/denruss/usb_gen_v2_stm32

Схема

About

dfu

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages