Quick example for ARM PK60N512.
#include<stdio.h> #define CRC16START 0xFEF // CRC16/Checksum Start Value (seed value according to .crc file) unsigned char CalcCRC16(void); unsigned int crc16calc(unsigned short crc16, unsigned char data); unsigned long Memory[]={0x00000800,0x00000801,0x00000802,0x00000803,0x00000804}; //Array of addresses for which we want to calculate checksum unsigned char CalcCRC16(void) { unsigned short checked_data = CRC16START; // Start value of CRC16/Check-Sum unsigned char data; // current data to be calculated int index,SIZE; unsigned long checksum_address=0x7F400; //Destination address from calc_crc.crc file unsigned short checksum_value; checksum_value=*(unsigned short *)checksum_address; SIZE=(sizeof(Memory)/sizeof(long)); for (index=0; index<SIZE; index++) { data = *(unsigned char *)Memory[index]; checked_data = crc16calc(checked_data, data); // Calculate Checksum for each byte in current memory block } return (checked_data != checksum_value); // is calculated value equal to stored value } /*function to calculate checksum */ unsigned int crc16calc(unsigned short crc16, unsigned char next) { unsigned char token1, token2; unsigned short quick1, quick2; token1 = (unsigned char)((crc16 >> 8) ^ next); token2= (unsigned char)crc16; crc16= (unsigned short)(token2 << 8); quick1 = (unsigned short)(token1 ^ (token1 >> 4)); crc16 ^= quick1; quick2 = quick1 << 4; crc16 ^= quick2 << 1; crc16 = crc16 ^ quick2 << 8; return crc16; } int main(void) { if (CalcCRC16()) printf("CRC fail!"); else printf("CRC pass"); return 0; }