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]