А какой у Вас IAR (версия)? В разных версиях немного разные настройки.
У меня в проектах на IAR6.50 так (и см. скриншоты):
Для IAR5.50 первый скриншот будет немного другим (всё остальное - так же).
Соответствущий расчёт CRC:
CODE
//Расчёт CRC32 полином == 0xEDB88320L
u32 CRC32(void const *buf, int len, u32 crc)
{
static const u32 t[] = {
0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA,
0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,
0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,
0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,
0x00000000, 0x1DB71064, 0x3B6E20C8, 0x26D930AC,
0x76DC4190, 0x6B6B51F4, 0x4DB26158, 0x5005713C,
0xEDB88320, 0xF00F9344, 0xD6D6A3E8, 0xCB61B38C,
0x9B64C2B0, 0x86D3D2D4, 0xA00AE278, 0xBDBDF21C};
u8 const *p = (u8 const *)buf;
while (--len >= 0) {
u32 c = crc ^ *p++;
crc = t[c & 15] ^ t[(c >> 4 & 15) + 16] ^ crc >> 8;
}
return crc;
}
static u32 crch;
//Программная эмуляция аппаратного вычислителя CRC
u32 HCRC32(void const *data, int len)
{
return ~(crch = CRC32(data, len, crch));
}
void InitPrgCRC() { crch = 0; }
В LPC177x/8x возможно задействовать аппаратный вычислитель CRC.
У меня в проектах он используется, но здесь я его вырезал, оставил только ту часть дефайна, которая для случая отсутствия аппаратного вычислителя.
Вызов (в начале main()):
CODE
...
//проверка, что весь образ ПО во FLASH защищён CRC в IAR
if ((u8 *)&__codetail[ncell(__codetail)] - (u8 *)__vector_table >
__checksum_end + 1 - __checksum_begin + 32 + 4) trap(TRAP_PRG_IMAGE);
InitPrgCRC();
u32 const seed = ~0;
HCRC32(&seed, sizeof(seed));
if (HCRC32(__checksum_begin, __checksum_end - __checksum_begin + 1) !=
__checksum) trap(TRAP_PRG_IMAGE);
...
Участок .icf, описывающий флешь (защищённую CRC):
Код
...
define block IMAGE_HEAD with fixed order {section .intvec, section .checksum,
section .codehead, section .intvecTail, section .icc_signature};
place in FLASH_region {ro, first block IMAGE_HEAD, last section .codetail};
...
В хидерах определено:
Код
extern "C" vct const __vector_table[];
extern "C" u8 const __checksum_begin[];
extern "C" u8 const __checksum_end[];
extern "C" u32 const __checksum;
extern "C" u32 const __codetail[1];
В asm-файле:
CODE
...
PUBLIC __codetail
EXTERN __checksum_begin, __checksum_end
SECTION .codetail:CONST:NOROOT(2)
__codetail DC32 __checksum_begin
DC32 __checksum_end
DC32 FIRMWARE_TARGET
PUBLIC __codehead
SECTION .codehead:CONST:NOROOT(2)
__codehead DC32 __codetail
DC32 0
...
CRC покрывает весь образ прошивки во флеш, за исключением первых векторов таблицы прерываний.
Для них IAR считает контрольную сумму и с этим у меня возникли конфликты. Так что первые вектора я исключил из расчёта CRC.
Как видите - образ прошивки начинается с адреса 0x1000 (первой идёт секция с векторами прерываний).
Конечный адрес заполнения (первый скриншот) задаёте так, чтобы он покрывал весь образ прошивки с запасом (программа будет расти).
Все дырки заполняются кодом заполнения.
Вот как-то так примерно