Загрузчик при запуске проверяет:
- CRC основной прошивки
- Регистр 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
-
В файле system_stm32f1xx.с надо изменить #define VECT_TAB_OFFSET 0x00000000 -> 0x00006000
-
В настройках среды (я использую IAR) надо включить добавление CRC суммы в конце файла прошивки
-
В линкер файле *.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 };
-
Чтобы вызвать загрузчик из основной программы, необходимо записать в регистр RTC_BKP_DR1 число, отличное от нуля (а) и перезагрузить микроконтроллер (б).
а) HAL_RTCEx_BKUPWrite(&RtcHandle, RTC_BKP_DR1, 1);
б) while(1) {} //ждём, когда сработает сторожевой таймер и перезагрузит МК
П.С. Не забыть настроить wdg и backup registers.
-
В настройках среды (я использую IAR) надо включить генерацию hex файла
-
Далее, из полученного hex файла надо сгенерировать dfu файл, используя программу Dfuse File Maneger, из комплекта http://www.st.com/en/development-tools/stsw-stm32080.html





