У Вас используются абсолютная адресация, но не в этом суть, сделал аналогично: 1. В исходниках:
__root const uint16_t __checksum @ ".checksum";
extern const uint8_t __vector_table;
void test_flash(unsigned char Start)
{
uint16_t Crc16;
Crc16 = crc16(0x0000, (uint8_t *)&__vector_table, (unsigned long) ((uint8_t *)&__checksum - &__vector_table));
if (Crc16 != __checksum) ErrFlashProgram = 1;
else ErrFlashProgram = 0;
return;
}
2. В stm32f4xx_flash.icf объявляю и размещаю блок:
define block CHECKSUM { ro section .checksum };
place in ROM_region { ro, last block CHECKSUM };
3. Вкладка "Build Actions/Output/Output filename":
$PROJ_FNAME$.out
отладочная информация включена
4. Вкладка "Build Actions/Post build command line" добавлено:
ielftool.exe --fill 0xff;__vector_table-__checksum --checksum __checksum:2,crc16:i,0x0000;__vector_table-__checksum
--verbose $TARGET_PATH$ $TARGET_PATH$
5. Вкладка "Linker/Extra Options" выключено.
Ситуация полностью аналогична предыдущей в памяти crc16 есть (в симуляторе CRC совпадают), а в hex файле crc16=0x0000 (место выделено!). Даже не понимаю куда нужно двигаться, может попробовать сгенерить hex повторно?