STM32G474xx HAL User Manual
stm32g4xx_hal_crc.c
转到该文件文档。
00001 /**
00002   ******************************************************************************
00003   * @file    stm32g4xx_hal_crc.c
00004   * @author  MCD Application Team
00005   * @brief   CRC HAL 模块驱动程序。
00006   *          本文件提供固件功能以管理循环冗余校验(CRC)外设的以下功能:
00007   *           + 初始化和反初始化函数
00008   *           + 外设控制函数
00009   *           + 外设状态函数
00010   *
00011   ******************************************************************************
00012   * @attention
00013   *
00015   * Copyright (c) 2019 STMicroelectronics.
00016   * All rights reserved.
00017   *
00018   * This software is licensed under terms that can be found in the LICENSE file
00019   * in the root directory of this software component.
00020   * If no LICENSE file comes with this software, it is provided AS-IS.
00021   *
00022   ******************************************************************************
00023   @verbatim
00024  ===============================================================================
00025                      ##### 如何使用此驱动程序 #####
00026  ===============================================================================
00027     [..]
00028          (+) 使用 __HAL_RCC_CRC_CLK_ENABLE(); 启用 CRC AHB 时钟
00029          (+) 初始化 CRC 计算器
00030              (++) 指定生成多项式(外设默认值或非默认值)
00031              (++) 指定初始化值(外设默认值或非默认值)
00032              (++) 指定输入数据格式
00033              (++) 如有需要,指定输入或输出数据反转模式
00034          (+) 使用 HAL_CRC_Accumulate() 函数计算输入数据缓冲区的 CRC 值,
00035              从先前计算的 CRC 作为初始化值开始
00036          (+) 使用 HAL_CRC_Calculate() 函数计算输入数据缓冲区的 CRC 值,
00038              从定义的初始化值(默认值或非默认值)开始以启动 CRC 计算

00040   @endverbatim
00041   ******************************************************************************
00042   */
00043 
00044 /* Includes ------------------------------------------------------------------*/
00046 #include "stm32g4xx_hal.h"
00047 
00048 /** @addtogroup STM32G4xx_HAL_Driver
00049   * @{
00050   */
00051 
00052 /** @defgroup CRC CRC
00053   * @brief CRC HAL 模块驱动程序。
00055   * @{
00056   */
00057 
00058 #ifdef HAL_CRC_MODULE_ENABLED
00060 
00061 /* Private typedef -----------------------------------------------------------*/
00062 /* Private define ------------------------------------------------------------*/
00063 /* Private macro -------------------------------------------------------------*/
00064 /* Private variables ---------------------------------------------------------*/
00065 /* Private function prototypes -----------------------------------------------*/
00066 /** @defgroup CRC_Private_Functions CRC Private Functions
00067   * @{
00068   */
00069 static uint32_t CRC_Handle_8(CRC_HandleTypeDef *hcrc, uint8_t const pBuffer[], uint32_t BufferLength);
00070 static uint32_t CRC_Handle_16(CRC_HandleTypeDef *hcrc, uint16_t const pBuffer[], uint32_t BufferLength);
00071 /**
00072   * @}
00073   */
00074 
00075 /* Exported functions --------------------------------------------------------*/
00076 
00077 /** @defgroup CRC_Exported_Functions CRC Exported Functions
00078   * @{
00079   */
00080 
00081 /** @defgroup CRC_Exported_Functions_Group1 Initialization and de-initialization functions
00082   *  @brief    初始化和配置函数。
00084   *
00086 @verbatim
00087  ===============================================================================
00088             ##### 初始化和反初始化函数 #####
00089  ===============================================================================
00091     [..]  本节提供的函数允许:
00092       (+) 根据 CRC_InitTypeDef 中指定的参数初始化 CRC,并创建关联的句柄
00093       (+) 反初始化 CRC 外设
00094       (+) 初始化 CRC MSP(MCU特定包)
00096       (+) 反初始化 CRC MSP

00098 @endverbatim
00099   * @{
00100   */
00101 
00102 /**
00103   * @brief  根据 CRC_InitTypeDef 中指定的参数初始化 CRC,并创建关联的句柄。
00104   * @param  hcrc CRC 句柄
00105   * @retval HAL 状态
00107   */
00108 HAL_StatusTypeDef HAL_CRC_Init(CRC_HandleTypeDef *hcrc)
00109 {
00110   /* 检查 CRC 句柄分配 */
00111   if (hcrc == NULL)
00112   {
00113     return HAL_ERROR;
00115   }
00116 
00117   /* 检查参数 */
00118   assert_param(IS_CRC_ALL_INSTANCE(hcrc->Instance));
00119 
00120   if (hcrc->State == HAL_CRC_STATE_RESET)
00121   {
00122     /* 分配锁资源并初始化 */
00123     hcrc->Lock = HAL_UNLOCKED;
00124     /* 初始化底层硬件 */
00125     HAL_CRC_MspInit(hcrc);
00127   }
00128 
00129   hcrc->State = HAL_CRC_STATE_BUSY;
00130 
00131   /* 检查用户是否选择了非默认生成多项式 */
00133   assert_param(IS_DEFAULT_POLYNOMIAL(hcrc->Init.DefaultPolynomialUse));
00135   if (hcrc->Init.DefaultPolynomialUse == DEFAULT_POLYNOMIAL_ENABLE)
00137   {
00138     /* 使用默认生成多项式初始化外设 */
00139     WRITE_REG(hcrc->Instance->POL, DEFAULT_CRC32_POLY);
00141     MODIFY_REG(hcrc->Instance->CR, CRC_CR_POLYSIZE, CRC_POLYLENGTH_32B);
00143   }
00145   else
00147   {
00148     /* 使用用户定义的生成多项式初始化 CRC 外设 */
00149     if (HAL_CRCEx_Polynomial_Set(hcrc, hcrc->Init.GeneratingPolynomial, hcrc->Init.CRCLength) != HAL_OK)
00151     {
00152       return HAL_ERROR;
00154     }
00156   }
00157 
00159   /* 检查用户是否选择了非默认 CRC 初始值 */
00161   assert_param(IS_DEFAULT_INIT_VALUE(hcrc->Init.DefaultInitValueUse));
00163   if (hcrc->Init.DefaultInitValueUse == DEFAULT_INIT_VALUE_ENABLE)
00165   {
00166     WRITE_REG(hcrc->Instance->INIT, DEFAULT_CRC_INITVALUE);
00168   }
00170   else
00171   {
00172     WRITE_REG(hcrc->Instance->INIT, hcrc->Init.InitValue);
00174   }
00175 
00176 
00177   /* 设置输入数据反转模式 */
00178   assert_param(IS_CRC_INPUTDATA_INVERSION_MODE(hcrc->Init.InputDataInversionMode));
00179   MODIFY_REG(hcrc->Instance->CR, CRC_CR_REV_IN, hcrc->Init.InputDataInversionMode);
00181 
00182   /* 设置输出数据反转模式 */
00183   assert_param(IS_CRC_OUTPUTDATA_INVERSION_MODE(hcrc->Init.OutputDataInversionMode));
00184   MODIFY_REG(hcrc->Instance->CR, CRC_CR_REV_OUT, hcrc->Init.OutputDataInversionMode);
00187   /* 确保输入数据格式(字节、半字或字流)
00188    * 由用户正确指定 */
00189   assert_param(IS_CRC_INPUTDATA_FORMAT(hcrc->InputDataFormat));
00190 
00191   /* 改变 CRC 外设状态 */
00192   hcrc->State = HAL_CRC_STATE_READY;
00193 
00194   /* 返回函数状态 */
00196   return HAL_OK;
00197 }
00198 
00199 /**
00200   * @brief  反初始化 CRC 外设。
00201   * @param  hcrc CRC 句柄
00202   * @retval HAL 状态
00204   */
00205 HAL_StatusTypeDef