最近在玩IAP,以研究一下OTA嘛。
所以参考了STM32官方的IAP下载程序的源代码。我发现STM32官方对于CRC16校验算法的实现是纯计算方案,其实对于主频已经达到50MHz以上,这点时间还是等得起的。下面我们就来看看STM32官方是如何实现CRC-16 CCITT算法的吧!
/** * @brief Update CRC16 for input byte * @param crc_in input value * @param input byte * @retval None */ uint16_t UpdateCRC16(uint16_t crc_in, uint8_t byte) { uint32_t crc = crc_in; uint32_t in = byte | 0x100; do { crc <<= 1; in <<= 1; if(in & 0x100) ++crc; if(crc & 0x10000) crc ^= 0x1021; } while(!(in & 0x10000)); return crc & 0xffffu; } /** * @brief Cal CRC16 for YModem Packet * @param data * @param length * @retval None */ uint16_t Cal_CRC16(const uint8_t* p_data, uint32_t size) { uint32_t crc = 0; const uint8_t* dataEnd = p_data+size; while(p_data < dataEnd) crc = UpdateCRC16(crc, *p_data++); crc = UpdateCRC16(crc, 0); crc = UpdateCRC16(crc, 0); return crc&0xffffu; }
看上去算法也是非常精简,效率应该也是非常高吧!