? ? ? ? CRC校驗在數據傳輸快,且量大的時候使用。下面是STM32F407VET6HAL庫使用CRC校驗的思路。
步驟實現:
- CubeMX配置
c
// 在CubeMX中啟用CRC模塊
// AHB總線時鐘自動啟用
- HAL庫代碼
c
// 初始化(main函數中)
CRC_HandleTypeDef hcrc;
hcrc.Instance = CRC;
hcrc.Init.DefaultPolynomialUse = DEFAULT_POLYNOMIAL_ENABLE; // 固定多項式0x04C11DB7
hcrc.Init.DefaultInitValueUse = DEFAULT_INIT_VALUE_ENABLE; // 初始值0xFFFFFFFF
HAL_CRC_Init(&hcrc);// 數據計算(32位對齊數據)
uint32_t data[] = {0x31323334}; // "1234"的ASCII十六進制形式
uint32_t crc = HAL_CRC_Calculate(&hcrc, data, 1); // 返回0x6F91C7CA// 適配標準CRC32
crc = ~crc; // 取反后得到0x906E3835
關鍵細節:
- 非對齊數據處理
c
uint8_t bytes[] = {1,2,3,4,5};
uint32_t tmp[2] = {0};
memcpy(tmp, bytes, 5); // 自動填充0到8字節
crc = ~HAL_CRC_Calculate(&hcrc, tmp, 2);
- 字節序修正
c
// 當數據源為大端序時:
uint32_t data_be = __REV(*(uint32_t*)bytes); // 字節序反轉
crc = ~HAL_CRC_Calculate(&hcrc, &data_be, 1);
- 驗證工具對比
c
// 使用在線CRC計算器驗證
// 輸入:ASCII "1234",選擇CRC32/MPEG-2模式
// 輸出:0x906E3835(與代碼結果一致)
優化建議:
- 大數據塊采用DMA模式(HAL_CRC_Calculate_DMA)
- 局部更新用
HAL_CRC_Accumulate
函數 - 使用
__CRC_DR
寄存器直接訪問加速計算
差異對照表:
項目 | STM32硬件CRC | 標準CRC32 |
---|---|---|
多項式 | 0x04C11DB7 | 0xEDB88320 |
初始值 | 0xFFFFFFFF | 0xFFFFFFFF |
結果處理 | 需取反(~) | 直接使用 |
輸入反射 | 無 | 有 |