STM32應用:使用STM32 CRC加速MODBUS的設計

關鍵字 :STM32CRCMODBUS
在MODBUS解碼中,其中需要計算CRC來驗證傳送/接收區塊的正確性。一般是利用CPU來計算這部分的資料,透過適當的設置,可以利用STM32內建的CRC模組來取代這部分的工作,從而減少CPU計算資源的開銷。
在部分的STM32中,有內建CRC模組,其中除了部分型號的CRC不支援自定義多項式外,其餘的型號皆可自定義多項式,本範例使用MCU為STM32L432KCU6,若是轉換到其他具備有CRC功能的STM32 MCU,需先確認該型號是否可以自定義多項式。


  大大购相关商品   NUCLEO-L476RG >>查询存货及售价


MODBUS的CRC要求如下,CRC-16、多項式為 X16 + X15 + X2 + 1、 初始值為0xFFFF,故在STM32CubeMX中,將預設的CRC配置作如下的修改。


透過以上配置,STM32CubeMX產生的程式碼如下:
/**
* @brief CRC Initialization Function
* @param None
* @retval None
*/
static void MX_CRC_Init(void)
{

/* USER CODE BEGIN CRC_Init 0 */

/* USER CODE END CRC_Init 0 */

/* USER CODE BEGIN CRC_Init 1 */

/* USER CODE END CRC_Init 1 */
hcrc.Instance = CRC;
hcrc.Init.DefaultPolynomialUse = DEFAULT_POLYNOMIAL_DISABLE;
hcrc.Init.DefaultInitValueUse = DEFAULT_INIT_VALUE_DISABLE;
hcrc.Init.GeneratingPolynomial = 32773; // 0x8005
hcrc.Init.CRCLength = CRC_POLYLENGTH_16B;
hcrc.Init.InitValue = 0xFFFF;
hcrc.Init.InputDataInversionMode = CRC_INPUTDATA_INVERSION_BYTE;
hcrc.Init.OutputDataInversionMode = CRC_OUTPUTDATA_INVERSION_ENABLE;
hcrc.InputDataFormat = CRC_INPUTDATA_FORMAT_BYTES;
if (HAL_CRC_Init(&hcrc) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN CRC_Init 2 */

/* USER CODE END CRC_Init 2 */
}

設置好CRC參數後,之後只需要呼叫HAL_CRC_Calculate就可以得到適用於MODBUS的CRC值,同理,若是需要計算其他種類的CRC時,只需要重設定CRC參數即可。
另外,以下是STM32 CRC HAL driver中,兩個計算函式的差別。
HAL_CRC_Calculate,在計算前都會重置Data Register,恢復到hcrc.Init.InitValue的設置值後開始計算CRC值
HAL_CRC_Accumulate,從最後一次的結果繼續計算CRC值。

技術文檔

類型標題檔案
硬件IOC

★博文內容均由個人提供,與平台無關,如有違法或侵權,請與網站管理員聯繫。

★文明上網,請理性發言。內容一周內被舉報5次,發文人進小黑屋喔~

評論