|
STM32G474xx HAL User Manual
|
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