#include "wk_crc.h"
void wk_crc_init(void) {
crm_periph_clock_enable(CRM_CRC_PERIPH_CLOCK, TRUE); //使能 CRC 外设时钟
crc_poly_size_set(CRC_POLY_SIZE_16B); //设置生成多项式位宽为 16 位
crc_init_data_set(0xFFFF); //设置初始值为 0xFFFF (Modbus RTU 标准)
crc_poly_value_set(0x8005); //设置生成多项式为 0x8005 (Modbus RTU 标准)
crc_reverse_input_data_set(CRC_REVERSE_INPUT_BY_BYTE); //设置输入数据反转方式为"按字节反转" (Modbus RTU 标准)
crc_reverse_output_data_set(CRC_REVERSE_OUTPUT_DATA); //设置输出数据反转 (Modbus RTU 标准)
crc_data_reset(); //复位 CRC 计算单元,使上述配置生效
}
//使用硬件 CRC 计算字节数组的 Modbus CRC-16 值
uint16_t crc16_modbus_calc(uint8_t *buf, uint16_t len) {
crc_data_reset(); // 每次计算前,将CRC寄存器重置为初始值 0xFFFF
for (uint16_t i = 0; i < len; i++) // 将数据逐字节写入 CRC 数据寄存器
{
(*(uint8_t *)&CRC->dt) = buf[i]; // 只写低8位
}
uint16_t result = (uint16_t)CRC->dt; //读取数据寄存器,获取最终的 CRC 计算结果
return result; //返回低16位有效数据
}
|