CODE
Uint32 __flash *pchecksum;
#pragma location=0x60
__no_init volatile unsigned int Tictime;
Uint32 slow_crc32(Uint32 sum, Uint8 __flash *p, Uint16 len)
{
while (len--)
{
Uint8 i;
unsigned char byte = *p++;
for (i = 0; i < 8; ++i)
{
unsigned long osum = sum;
sum <<= 1;
if (byte & 0x80)
sum |= 1 ;
if (osum & 0x80000000)
sum ^= POLY;
byte <<= 1;
}
}
return sum;
}
#pragma vector=TIMER2_COMP_vect
__interrupt void TIMER2_COMP_isr(void)
{ Tictime++; }
__C_task void main(void)
{
__no_init Uint32 addr;
GICR = (1<<IVCE); // Таблицу векторов в область загрузчика
GICR = (1<<IVSEL);
__enable_interrupt();
/* ....Здесь идет кое-какой код.... В частности обмен по SPI.
Во время обмена по SPI прерывания запрещаются....*/
// Прилетела команда по SPI посчитать CRC32.
pchecksum = (Uint32 __flash *)(*((Uint16 __flash *)(0x00A2)));
addr = 0;
addr = slow_crc32(addr,(Uint8 __flash *)0, ((Uint16)pchecksum)&0x013FF);
addr = slow_crc32(addr,(Uint8 __flash *)&zero,4);
// далее addr посылаю по SPI.
/* ... продолжение программы...*/
}