蓝天枫 发表于 2025-9-22 09:53

N32单片机CRC模块实现CRC16-mobus



N32单片机内置硬件CRC模块,可使用其CRC16计算功能实现工业控制常用的CRC16-mobus,提高计算效率,已验证,大家可以放心使用。
代码如下,需要先初始化CRC_Init,再执行计算。
// 初始化CRC外设
void CRC_Init(void)
{
    RCC_EnableAHBPeriphClk(RCC_AHB_PERIPH_CRC, ENABLE);//使能时钟
    CRC->CRC16CTRL = CRC16_CTRL_LITTLE | CRC->CRC16CTRL;//小端模式
}
//输出反转
uint16_t rt_reverse_16(uint32_t x)
{
    __asm("rbit %0, %0" : "+r"(x));// ARM rbit指令
    return (uint16_t)(x >> 16);                  // 取结果高16位
}
// 计算CRC16
uint16_t CRC16_Calculate(const uint8_t *data, uint16_t length)
{
    uint16_t i,r;
    // 重置CRC计算
    CRC->CRC16D = 0xffff; //init dat
    for (i = 0; i < length; i++)
    {
      // 写入数据到CRC数据寄存器
      CRC->CRC16DAT = data;
    }
    // 获取计算结果
    r = rt_reverse_16(CRC->CRC16D);
    return r;
}

页: [1]
查看完整版本: N32单片机CRC模块实现CRC16-mobus