STM32L443xx HAL User Manual
stm32l4xx_ll_crc.h
Go to the documentation of this file.
00001 /**
00002   ******************************************************************************
00003   * @file    stm32l4xx_ll_crc.h
00004   * @author  MCD Application Team
00005   * @brief   Header file of CRC LL module.
00006   ******************************************************************************
00007   * @attention
00008   *
00009   * Copyright (c) 2017 STMicroelectronics.
00010   * All rights reserved.
00011   *
00012   * This software is licensed under terms that can be found in the LICENSE file
00013   * in the root directory of this software component.
00014   * If no LICENSE file comes with this software, it is provided AS-IS.
00015   *
00016   ******************************************************************************
00017   */
00018 
00019 /* Define to prevent recursive inclusion -------------------------------------*/
00020 #ifndef STM32L4xx_LL_CRC_H
00021 #define STM32L4xx_LL_CRC_H
00022 
00023 #ifdef __cplusplus
00024 extern "C" {
00025 #endif
00026 
00027 /* Includes ------------------------------------------------------------------*/
00028 #include "stm32l4xx.h"
00029 
00030 /** @addtogroup STM32L4xx_LL_Driver
00031   * @{
00032   */
00033 
00034 #if defined(CRC)
00035 
00036 /** @defgroup CRC_LL CRC
00037   * @{
00038   */
00039 
00040 /* Private types -------------------------------------------------------------*/
00041 /* Private variables ---------------------------------------------------------*/
00042 /* Private constants ---------------------------------------------------------*/
00043 /* Private macros ------------------------------------------------------------*/
00044 
00045 /* Exported types ------------------------------------------------------------*/
00046 /* Exported constants --------------------------------------------------------*/
00047 /** @defgroup CRC_LL_Exported_Constants CRC Exported Constants
00048   * @{
00049   */
00050 
00051 /** @defgroup CRC_LL_EC_POLYLENGTH Polynomial length
00052   * @{
00053   */
00054 #define LL_CRC_POLYLENGTH_32B              0x00000000U                              /*!< 32 bits Polynomial size */
00055 #define LL_CRC_POLYLENGTH_16B              CRC_CR_POLYSIZE_0                        /*!< 16 bits Polynomial size */
00056 #define LL_CRC_POLYLENGTH_8B               CRC_CR_POLYSIZE_1                        /*!< 8 bits Polynomial size */
00057 #define LL_CRC_POLYLENGTH_7B               (CRC_CR_POLYSIZE_1 | CRC_CR_POLYSIZE_0)  /*!< 7 bits Polynomial size */
00058 /**
00059   * @}
00060   */
00061 
00062 /** @defgroup CRC_LL_EC_INDATA_REVERSE Input Data Reverse
00063   * @{
00064   */
00065 #define LL_CRC_INDATA_REVERSE_NONE         0x00000000U                              /*!< Input Data bit order not affected */
00066 #define LL_CRC_INDATA_REVERSE_BYTE         CRC_CR_REV_IN_0                          /*!< Input Data bit reversal done by byte */
00067 #define LL_CRC_INDATA_REVERSE_HALFWORD     CRC_CR_REV_IN_1                          /*!< Input Data bit reversal done by half-word */
00068 #define LL_CRC_INDATA_REVERSE_WORD         (CRC_CR_REV_IN_1 | CRC_CR_REV_IN_0)      /*!< Input Data bit reversal done by word */
00069 /**
00070   * @}
00071   */
00072 
00073 /** @defgroup CRC_LL_EC_OUTDATA_REVERSE Output Data Reverse
00074   * @{
00075   */
00076 #define LL_CRC_OUTDATA_REVERSE_NONE        0x00000000U                               /*!< Output Data bit order not affected */
00077 #define LL_CRC_OUTDATA_REVERSE_BIT         CRC_CR_REV_OUT                            /*!< Output Data bit reversal done by bit */
00078 /**
00079   * @}
00080   */
00081 
00082 /** @defgroup CRC_LL_EC_Default_Polynomial_Value    Default CRC generating polynomial value
00083   * @brief    Normal representation of this polynomial value is
00084   *           X^32 + X^26 + X^23 + X^22 + X^16 + X^12 + X^11 + X^10 +X^8 + X^7 + X^5 + X^4 + X^2 + X + 1 .
00085   * @{
00086   */
00087 #define LL_CRC_DEFAULT_CRC32_POLY          0x04C11DB7U                               /*!< Default CRC generating polynomial value */
00088 /**
00089   * @}
00090   */
00091 
00092 /** @defgroup CRC_LL_EC_Default_InitValue    Default CRC computation initialization value
00093   * @{
00094   */
00095 #define LL_CRC_DEFAULT_CRC_INITVALUE       0xFFFFFFFFU                               /*!< Default CRC computation initialization value */
00096 /**
00097   * @}
00098   */
00099 
00100 /**
00101   * @}
00102   */
00103 
00104 /* Exported macro ------------------------------------------------------------*/
00105 /** @defgroup CRC_LL_Exported_Macros CRC Exported Macros
00106   * @{
00107   */
00108 
00109 /** @defgroup CRC_LL_EM_WRITE_READ Common Write and read registers Macros
00110   * @{
00111   */
00112 
00113 /**
00114   * @brief  Write a value in CRC register
00115   * @param  __INSTANCE__ CRC Instance
00116   * @param  __REG__ Register to be written
00117   * @param  __VALUE__ Value to be written in the register
00118   * @retval None
00119   */
00120 #define LL_CRC_WriteReg(__INSTANCE__, __REG__, __VALUE__) WRITE_REG(__INSTANCE__->__REG__, __VALUE__)
00121 
00122 /**
00123   * @brief  Read a value in CRC register
00124   * @param  __INSTANCE__ CRC Instance
00125   * @param  __REG__ Register to be read
00126   * @retval Register value
00127   */
00128 #define LL_CRC_ReadReg(__INSTANCE__, __REG__) READ_REG(__INSTANCE__->__REG__)
00129 /**
00130   * @}
00131   */
00132 
00133 /**
00134   * @}
00135   */
00136 
00137 
00138 /* Exported functions --------------------------------------------------------*/
00139 /** @defgroup CRC_LL_Exported_Functions CRC Exported Functions
00140   * @{
00141   */
00142 
00143 /** @defgroup CRC_LL_EF_Configuration CRC Configuration functions
00144   * @{
00145   */
00146 
00147 /**
00148   * @brief  Reset the CRC calculation unit.
00149   * @note   If Programmable Initial CRC value feature
00150   *         is available, also set the Data Register to the value stored in the
00151   *         CRC_INIT register, otherwise, reset Data Register to its default value.
00152   * @rmtoll CR           RESET         LL_CRC_ResetCRCCalculationUnit
00153   * @param  CRCx CRC Instance
00154   * @retval None
00155   */
00156 __STATIC_INLINE void LL_CRC_ResetCRCCalculationUnit(CRC_TypeDef *CRCx)
00157 {
00158   SET_BIT(CRCx->CR, CRC_CR_RESET);
00159 }
00160 
00161 /**
00162   * @brief  Configure size of the polynomial.
00163   * @rmtoll CR           POLYSIZE      LL_CRC_SetPolynomialSize
00164   * @param  CRCx CRC Instance
00165   * @param  PolySize This parameter can be one of the following values:
00166   *         @arg @ref LL_CRC_POLYLENGTH_32B
00167   *         @arg @ref LL_CRC_POLYLENGTH_16B
00168   *         @arg @ref LL_CRC_POLYLENGTH_8B
00169   *         @arg @ref LL_CRC_POLYLENGTH_7B
00170   * @retval None
00171   */
00172 __STATIC_INLINE void LL_CRC_SetPolynomialSize(CRC_TypeDef *CRCx, uint32_t PolySize)
00173 {
00174   MODIFY_REG(CRCx->CR, CRC_CR_POLYSIZE, PolySize);
00175 }
00176 
00177 /**
00178   * @brief  Return size of the polynomial.
00179   * @rmtoll CR           POLYSIZE      LL_CRC_GetPolynomialSize
00180   * @param  CRCx CRC Instance
00181   * @retval Returned value can be one of the following values:
00182   *         @arg @ref LL_CRC_POLYLENGTH_32B
00183   *         @arg @ref LL_CRC_POLYLENGTH_16B
00184   *         @arg @ref LL_CRC_POLYLENGTH_8B
00185   *         @arg @ref LL_CRC_POLYLENGTH_7B
00186   */
00187 __STATIC_INLINE uint32_t LL_CRC_GetPolynomialSize(CRC_TypeDef *CRCx)
00188 {
00189   return (uint32_t)(READ_BIT(CRCx->CR, CRC_CR_POLYSIZE));
00190 }
00191 
00192 /**
00193   * @brief  Configure the reversal of the bit order of the input data
00194   * @rmtoll CR           REV_IN        LL_CRC_SetInputDataReverseMode
00195   * @param  CRCx CRC Instance
00196   * @param  ReverseMode This parameter can be one of the following values:
00197   *         @arg @ref LL_CRC_INDATA_REVERSE_NONE
00198   *         @arg @ref LL_CRC_INDATA_REVERSE_BYTE
00199   *         @arg @ref LL_CRC_INDATA_REVERSE_HALFWORD
00200   *         @arg @ref LL_CRC_INDATA_REVERSE_WORD
00201   * @retval None
00202   */
00203 __STATIC_INLINE void LL_CRC_SetInputDataReverseMode(CRC_TypeDef *CRCx, uint32_t ReverseMode)
00204 {
00205   MODIFY_REG(CRCx->CR, CRC_CR_REV_IN, ReverseMode);
00206 }
00207 
00208 /**
00209   * @brief  Return type of reversal for input data bit order
00210   * @rmtoll CR           REV_IN        LL_CRC_GetInputDataReverseMode
00211   * @param  CRCx CRC Instance
00212   * @retval Returned value can be one of the following values:
00213   *         @arg @ref LL_CRC_INDATA_REVERSE_NONE
00214   *         @arg @ref LL_CRC_INDATA_REVERSE_BYTE
00215   *         @arg @ref LL_CRC_INDATA_REVERSE_HALFWORD
00216   *         @arg @ref LL_CRC_INDATA_REVERSE_WORD
00217   */
00218 __STATIC_INLINE uint32_t LL_CRC_GetInputDataReverseMode(CRC_TypeDef *CRCx)
00219 {
00220   return (uint32_t)(READ_BIT(CRCx->CR, CRC_CR_REV_IN));
00221 }
00222 
00223 /**
00224   * @brief  Configure the reversal of the bit order of the Output data
00225   * @rmtoll CR           REV_OUT       LL_CRC_SetOutputDataReverseMode
00226   * @param  CRCx CRC Instance
00227   * @param  ReverseMode This parameter can be one of the following values:
00228   *         @arg @ref LL_CRC_OUTDATA_REVERSE_NONE
00229   *         @arg @ref LL_CRC_OUTDATA_REVERSE_BIT
00230   * @retval None
00231   */
00232 __STATIC_INLINE void LL_CRC_SetOutputDataReverseMode(CRC_TypeDef *CRCx, uint32_t ReverseMode)
00233 {
00234   MODIFY_REG(CRCx->CR, CRC_CR_REV_OUT, ReverseMode);
00235 }
00236 
00237 /**
00238   * @brief  Return type of reversal of the bit order of the Output data
00239   * @rmtoll CR           REV_OUT       LL_CRC_GetOutputDataReverseMode
00240   * @param  CRCx CRC Instance
00241   * @retval Returned value can be one of the following values:
00242   *         @arg @ref LL_CRC_OUTDATA_REVERSE_NONE
00243   *         @arg @ref LL_CRC_OUTDATA_REVERSE_BIT
00244   */
00245 __STATIC_INLINE uint32_t LL_CRC_GetOutputDataReverseMode(CRC_TypeDef *CRCx)
00246 {
00247   return (uint32_t)(READ_BIT(CRCx->CR, CRC_CR_REV_OUT));
00248 }
00249 
00250 /**
00251   * @brief  Initialize the Programmable initial CRC value.
00252   * @note   If the CRC size is less than 32 bits, the least significant bits
00253   *         are used to write the correct value
00254   * @note   LL_CRC_DEFAULT_CRC_INITVALUE could be used as value for InitCrc parameter.
00255   * @rmtoll INIT         INIT          LL_CRC_SetInitialData
00256   * @param  CRCx CRC Instance
00257   * @param  InitCrc Value to be programmed in Programmable initial CRC value register
00258   * @retval None
00259   */
00260 __STATIC_INLINE void LL_CRC_SetInitialData(CRC_TypeDef *CRCx, uint32_t InitCrc)
00261 {
00262   WRITE_REG(CRCx->INIT, InitCrc);
00263 }
00264 
00265 /**
00266   * @brief  Return current Initial CRC value.
00267   * @note   If the CRC size is less than 32 bits, the least significant bits
00268   *         are used to read the correct value
00269   * @rmtoll INIT         INIT          LL_CRC_GetInitialData
00270   * @param  CRCx CRC Instance
00271   * @retval Value programmed in Programmable initial CRC value register
00272   */
00273 __STATIC_INLINE uint32_t LL_CRC_GetInitialData(CRC_TypeDef *CRCx)
00274 {
00275   return (uint32_t)(READ_REG(CRCx->INIT));
00276 }
00277 
00278 /**
00279   * @brief  Initialize the Programmable polynomial value
00280   *         (coefficients of the polynomial to be used for CRC calculation).
00281   * @note   LL_CRC_DEFAULT_CRC32_POLY could be used as value for PolynomCoef parameter.
00282   * @note   Please check Reference Manual and existing Errata Sheets,
00283   *         regarding possible limitations for Polynomial values usage.
00284   *         For example, for a polynomial of degree 7, X^7 + X^6 + X^5 + X^2 + 1 is written 0x65
00285   * @rmtoll POL          POL           LL_CRC_SetPolynomialCoef
00286   * @param  CRCx CRC Instance
00287   * @param  PolynomCoef Value to be programmed in Programmable Polynomial value register
00288   * @retval None
00289   */
00290 __STATIC_INLINE void LL_CRC_SetPolynomialCoef(CRC_TypeDef *CRCx, uint32_t PolynomCoef)
00291 {
00292   WRITE_REG(CRCx->POL, PolynomCoef);
00293 }
00294 
00295 /**
00296   * @brief  Return current Programmable polynomial value
00297   * @note   Please check Reference Manual and existing Errata Sheets,
00298   *         regarding possible limitations for Polynomial values usage.
00299   *         For example, for a polynomial of degree 7, X^7 + X^6 + X^5 + X^2 + 1 is written 0x65
00300   * @rmtoll POL          POL           LL_CRC_GetPolynomialCoef
00301   * @param  CRCx CRC Instance
00302   * @retval Value programmed in Programmable Polynomial value register
00303   */
00304 __STATIC_INLINE uint32_t LL_CRC_GetPolynomialCoef(CRC_TypeDef *CRCx)
00305 {
00306   return (uint32_t)(READ_REG(CRCx->POL));
00307 }
00308 
00309 /**
00310   * @}
00311   */
00312 
00313 /** @defgroup CRC_LL_EF_Data_Management Data_Management
00314   * @{
00315   */
00316 
00317 /**
00318   * @brief  Write given 32-bit data to the CRC calculator
00319   * @rmtoll DR           DR            LL_CRC_FeedData32
00320   * @param  CRCx CRC Instance
00321   * @param  InData value to be provided to CRC calculator between between Min_Data=0 and Max_Data=0xFFFFFFFF
00322   * @retval None
00323   */
00324 __STATIC_INLINE void LL_CRC_FeedData32(CRC_TypeDef *CRCx, uint32_t InData)
00325 {
00326   WRITE_REG(CRCx->DR, InData);
00327 }
00328 
00329 /**
00330   * @brief  Write given 16-bit data to the CRC calculator
00331   * @rmtoll DR           DR            LL_CRC_FeedData16
00332   * @param  CRCx CRC Instance
00333   * @param  InData 16 bit value to be provided to CRC calculator between between Min_Data=0 and Max_Data=0xFFFF
00334   * @retval None
00335   */
00336 __STATIC_INLINE void LL_CRC_FeedData16(CRC_TypeDef *CRCx, uint16_t InData)
00337 {
00338   __IO uint16_t *pReg;
00339 
00340   pReg = (__IO uint16_t *)(__IO void *)(&CRCx->DR);                             /* Derogation MisraC2012 R.11.5 */
00341   *pReg = InData;
00342 }
00343 
00344 /**
00345   * @brief  Write given 8-bit data to the CRC calculator
00346   * @rmtoll DR           DR            LL_CRC_FeedData8
00347   * @param  CRCx CRC Instance
00348   * @param  InData 8 bit value to be provided to CRC calculator between between Min_Data=0 and Max_Data=0xFF
00349   * @retval None
00350   */
00351 __STATIC_INLINE void LL_CRC_FeedData8(CRC_TypeDef *CRCx, uint8_t InData)
00352 {
00353   *(uint8_t __IO *)(&CRCx->DR) = (uint8_t) InData;
00354 }
00355 
00356 /**
00357   * @brief  Return current CRC calculation result. 32 bits value is returned.
00358   * @rmtoll DR           DR            LL_CRC_ReadData32
00359   * @param  CRCx CRC Instance
00360   * @retval Current CRC calculation result as stored in CRC_DR register (32 bits).
00361   */
00362 __STATIC_INLINE uint32_t LL_CRC_ReadData32(CRC_TypeDef *CRCx)
00363 {
00364   return (uint32_t)(READ_REG(CRCx->DR));
00365 }
00366 
00367 /**
00368   * @brief  Return current CRC calculation result. 16 bits value is returned.
00369   * @note   This function is expected to be used in a 16 bits CRC polynomial size context.
00370   * @rmtoll DR           DR            LL_CRC_ReadData16
00371   * @param  CRCx CRC Instance
00372   * @retval Current CRC calculation result as stored in CRC_DR register (16 bits).
00373   */
00374 __STATIC_INLINE uint16_t LL_CRC_ReadData16(CRC_TypeDef *CRCx)
00375 {
00376   return (uint16_t)READ_REG(CRCx->DR);
00377 }
00378 
00379 /**
00380   * @brief  Return current CRC calculation result. 8 bits value is returned.
00381   * @note   This function is expected to be used in a 8 bits CRC polynomial size context.
00382   * @rmtoll DR           DR            LL_CRC_ReadData8
00383   * @param  CRCx CRC Instance
00384   * @retval Current CRC calculation result as stored in CRC_DR register (8 bits).
00385   */
00386 __STATIC_INLINE uint8_t LL_CRC_ReadData8(CRC_TypeDef *CRCx)
00387 {
00388   return (uint8_t)READ_REG(CRCx->DR);
00389 }
00390 
00391 /**
00392   * @brief  Return current CRC calculation result. 7 bits value is returned.
00393   * @note   This function is expected to be used in a 7 bits CRC polynomial size context.
00394   * @rmtoll DR           DR            LL_CRC_ReadData7
00395   * @param  CRCx CRC Instance
00396   * @retval Current CRC calculation result as stored in CRC_DR register (7 bits).
00397   */
00398 __STATIC_INLINE uint8_t LL_CRC_ReadData7(CRC_TypeDef *CRCx)
00399 {
00400   return (uint8_t)(READ_REG(CRCx->DR) & 0x7FU);
00401 }
00402 
00403 /**
00404   * @brief  Return data stored in the Independent Data(IDR) register.
00405   * @note   This register can be used as a temporary storage location.
00406   * @note   Refer to the Reference Manual to get the authorized data length in bits.
00407   * @rmtoll IDR          IDR           LL_CRC_Read_IDR
00408   * @param  CRCx CRC Instance
00409   * @retval Value stored in CRC_IDR register
00410   */
00411 __STATIC_INLINE uint32_t LL_CRC_Read_IDR(CRC_TypeDef *CRCx)
00412 {
00413   return (uint32_t)(READ_REG(CRCx->IDR));
00414 }
00415 
00416 /**
00417   * @brief  Store data in the Independent Data(IDR) register.
00418   * @note   This register can be used as a temporary storage location.
00419   * @note   Refer to the Reference Manual to get the authorized data length in bits.
00420   * @rmtoll IDR          IDR           LL_CRC_Write_IDR
00421   * @param  CRCx CRC Instance
00422   * @param  InData value to be stored in CRC_IDR register
00423   * @retval None
00424   */
00425 __STATIC_INLINE void LL_CRC_Write_IDR(CRC_TypeDef *CRCx, uint32_t InData)
00426 {
00427 #if (CRC_IDR_IDR == 0x0FFU)
00428   *((uint8_t __IO *)(&CRCx->IDR)) = (uint8_t) InData;
00429 #else
00430   WRITE_REG(CRCx->IDR, InData);
00431 #endif
00432 }
00433 /**
00434   * @}
00435   */
00436 
00437 #if defined(USE_FULL_LL_DRIVER)
00438 /** @defgroup CRC_LL_EF_Init Initialization and de-initialization functions
00439   * @{
00440   */
00441 
00442 ErrorStatus LL_CRC_DeInit(CRC_TypeDef *CRCx);
00443 
00444 /**
00445   * @}
00446   */
00447 #endif /* USE_FULL_LL_DRIVER */
00448 
00449 /**
00450   * @}
00451   */
00452 
00453 /**
00454   * @}
00455   */
00456 
00457 #endif /* defined(CRC) */
00458 
00459 /**
00460   * @}
00461   */
00462 
00463 #ifdef __cplusplus
00464 }
00465 #endif
00466 
00467 #endif /* STM32L4xx_LL_CRC_H */