这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » [学习笔记]CRC-16校验CCITT算法之STM32官方

共1条 1/1 1 跳转至

[学习笔记]CRC-16校验CCITT算法之STM32官方

院士
2024-07-18 10:23:27     打赏

最近在玩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;
}

看上去算法也是非常精简,效率应该也是非常高吧!





关键词: 学习     笔记     CRC-16     校验     CCITT     算法    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]