ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Вторник
26 ноября
1041977 Топик полностью
Aleksey_75 (03.10.2020 23:47, просмотров: 419) ответил Aleksey_75 на stm32f1x Может попадалась кому или есть в наличии функция табличного расчета crc как на stm32. Поделитесь плиз! Без таблицы у меня есть, но она тормозная ...
Всем спасибо! Отдельная благодарность SciFi! Научился готовить hw crc. унутри готовая функция, авось кому пригодится 
uint32_t calc_hw_crc32(uint32_t crc32, uint8_t * buf, size_t byte_len)
{
    uint32_t last_data = { 0 };
    uint32_t dword_len = (byte_len >> 2);
    uint32_t tail_byte_len = (byte_len & 3);
  
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC, ENABLE); 
    CRC_ResetDR();    

    if (crc32 != DEF_CRC32)
    {
        CRC_ResetDR();
        
        for(uint8_t i = 0; i < 32; i ++)
        {
            if (crc32 & 0x00000001)
            {
                crc32 = ((crc32 ^ 0x04C11DB7) >> 1) | 0x80000000; // Long form
            }
            else
            {
                crc32 = (crc32 >> 1);
            }
        }
        
        crc32 = CRC_CalcCRC(crc32 ^ DEF_CRC32); 
    }
       
    crc32 = CRC_CalcBlockCRC((uint32_t  *)buf, dword_len);
    
    if (tail_byte_len == 0)
    {
        return crc32;
    }
    else
    {
        memcpy(&last_data, &buf[byte_len - tail_byte_len], tail_byte_len); 
    }
    
    switch ( tail_byte_len )
    {
        case 1:
        {
            last_data = buf[byte_len - tail_byte_len] << 24;
        } break;
        
        case 2:
        {
            last_data = *( (uint16_t *)(&buf[byte_len - tail_byte_len]) );
            last_data <<= 16;
        } break;
        
        case 3:
        {
            last_data = *( (uint16_t *)(&buf[byte_len - tail_byte_len]) );
            last_data <<= 8;
            last_data += buf[byte_len - tail_byte_len + 2]<<24;
        } break;
    }
    
    crc32 = CRC_CalcCRC(last_data);
    
    return crc32; 
}