ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Вторник
26 ноября
1041959 Топик полностью
POV_ (03.10.2020 22:55, просмотров: 8) ответил Aleksey_75 на stm32f1x Может попадалась кому или есть в наличии функция табличного расчета crc как на stm32. Поделитесь плиз! Без таблицы у меня есть, но она тормозная ...
Блин, ниже код от стм привёл ))... 
static uint32_t crc32_table[256];
static uint32_t crc32r_table[256];

#define CRC32_POLY 0x04C11DB7
#define CRC32_POLY_R 0xEDB88320

static void crc32_init(void)
{
    int i, j;
    uint32_t c, cr;
    for (i = 0; i < 256; ++i)
    {
        cr = i;
        c = i << 24;
        for (j = 8; j > 0; --j)
        {
            c = c & 0x80000000 ? (c << 1) ^ CRC32_POLY : (c << 1);
            cr = cr & 0x00000001 ? (cr >> 1) ^ CRC32_POLY_R : (cr >> 1);
        }
        crc32_table[i] = c;
        crc32r_table[i] = cr;
    }
}

uint32_t crc32_stm32(uint32_t init_crc, uint32_t* buf, int len)
{
    uint32_t v;
    uint32_t crc;
    crc = ~init_crc;
    while (len >= 4)
    {
        v = htonl(*buf++);
        crc = (crc << 8) ^ crc32_table[0xFF & ((crc >> 24) ^ (v))];
        crc = (crc << 8) ^ crc32_table[0xFF & ((crc >> 24) ^ (v >> 8))];
        crc = (crc << 8) ^ crc32_table[0xFF & ((crc >> 24) ^ (v >> 16))];
        crc = (crc << 8) ^ crc32_table[0xFF & ((crc >> 24) ^ (v >> 24))];
        len -= 4;
    }
    if (len)
    {
        switch (len)
        {
        case 1:
            v = 0xFF000000 & htonl(*buf++);
            break;
        case 2:
            v = 0xFFFF0000 & htonl(*buf++);
            break;
        case 3:
            v = 0xFFFFFF00 & htonl(*buf++);
            break;
        }
        crc = (crc << 8) ^ crc32_table[0xFF & ((crc >> 24) ^ (v))];
        crc = (crc << 8) ^ crc32_table[0xFF & ((crc >> 24) ^ (v >> 8))];
        crc = (crc << 8) ^ crc32_table[0xFF & ((crc >> 24) ^ (v >> 16))];
        crc = (crc << 8) ^ crc32_table[0xFF & ((crc >> 24) ^ (v >> 24))];
    }
    return ~crc;
}

Вначале вызываешь

crc32_init();


затем что-то типа

uint32_t crc1;
crc1 = crc32_stm32(0, (uint32_t*)&buf, len);