ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Воскресенье
30 июня
1444965 Топик полностью
Ig_Ra (25.06.2024 14:10, просмотров: 46) ответил POV на Во всяких црц и прочих хешах не силён. Но как-то нашёл программную реализацию расчёта совместимую с аппаратной у стм32. А на ат32 это не прокатило.
Вот кусок кода из моего проекта. Проверено и на STM32 и на AT32F403A. В ESP32 считаю так CRC программно, прежде чем сравнить новый бинарник для загрузки с уже загруженной версией в STM или AT32. 

//-------------------------------------------------------------------------------

// Подсчет CRC32 как в STM32 по умолчанию. (CRC32_POLY 0x04C11DB7) ???

static const uint32_t Crc32Table[] = {

0x00000000,0x04C11DB7,0x09823B6E,0x0D4326D9, 0x130476DC,0x17C56B6B,0x1A864DB2,0x1E475005,

0x2608EDB8,0x22C9F00F,0x2F8AD6D6,0x2B4BCB61, 0x350C9B64,0x31CD86D3,0x3C8EA00A,0x384FBDBD

};

uint32_t DR; // (Data Register) Так в STM32 называется аппаратный регистр CRC

void crc32_ini(void) {DR = 0xFFFFFFFF;}

void crc32_upd(uint32_t data) {

DR = DR ^ data;

DR = (DR << 4) ^ Crc32Table[DR >> 28];

DR = (DR << 4) ^ Crc32Table[DR >> 28];

DR = (DR << 4) ^ Crc32Table[DR >> 28];

DR = (DR << 4) ^ Crc32Table[DR >> 28];

DR = (DR << 4) ^ Crc32Table[DR >> 28];

DR = (DR << 4) ^ Crc32Table[DR >> 28];

DR = (DR << 4) ^ Crc32Table[DR >> 28];

DR = (DR << 4) ^ Crc32Table[DR >> 28];

}

uint32_t crc32_get(void) {return DR;}

uint32_t crc32_calc(uint32_t *pData, int size) {

crc32_ini();

while(size > 0) {

crc32_upd(*pData++);

size -= 4;

}

uint32_t crc32 = crc32_get();

return crc32;

}

//-------------------------------------------------------------------------------