Back to home page

LXR

 
 

    


File indexing completed on 2025-05-11 08:23:37

0001 /**
0002   ******************************************************************************
0003   * @file    stm32h7xx_ll_crc.h
0004   * @author  MCD Application Team
0005   * @brief   Header file of CRC LL module.
0006   ******************************************************************************
0007   * @attention
0008   *
0009   * Copyright (c) 2017 STMicroelectronics.
0010   * All rights reserved.
0011   *
0012   * This software is licensed under terms that can be found in the LICENSE file
0013   * in the root directory of this software component.
0014   * If no LICENSE file comes with this software, it is provided AS-IS.
0015   *
0016   ******************************************************************************
0017   */
0018 
0019 /* Define to prevent recursive inclusion -------------------------------------*/
0020 #ifndef STM32H7xx_LL_CRC_H
0021 #define STM32H7xx_LL_CRC_H
0022 
0023 #ifdef __cplusplus
0024 extern "C" {
0025 #endif
0026 
0027 /* Includes ------------------------------------------------------------------*/
0028 #include "stm32h7xx.h"
0029 
0030 /** @addtogroup STM32H7xx_LL_Driver
0031   * @{
0032   */
0033 
0034 #if defined(CRC)
0035 
0036 /** @defgroup CRC_LL CRC
0037   * @ingroup RTEMSBSPsARMSTM32H7
0038   * @{
0039   */
0040 
0041 /* Private types -------------------------------------------------------------*/
0042 /* Private variables ---------------------------------------------------------*/
0043 /* Private constants ---------------------------------------------------------*/
0044 /* Private macros ------------------------------------------------------------*/
0045 
0046 /* Exported types ------------------------------------------------------------*/
0047 /* Exported constants --------------------------------------------------------*/
0048 /** @defgroup CRC_LL_Exported_Constants CRC Exported Constants
0049   * @ingroup RTEMSBSPsARMSTM32H7
0050   * @{
0051   */
0052 
0053 /** @defgroup CRC_LL_EC_POLYLENGTH Polynomial length
0054   * @ingroup RTEMSBSPsARMSTM32H7
0055   * @{
0056   */
0057 #define LL_CRC_POLYLENGTH_32B              0x00000000U                              /*!< 32 bits Polynomial size */
0058 #define LL_CRC_POLYLENGTH_16B              CRC_CR_POLYSIZE_0                        /*!< 16 bits Polynomial size */
0059 #define LL_CRC_POLYLENGTH_8B               CRC_CR_POLYSIZE_1                        /*!< 8 bits Polynomial size */
0060 #define LL_CRC_POLYLENGTH_7B               (CRC_CR_POLYSIZE_1 | CRC_CR_POLYSIZE_0)  /*!< 7 bits Polynomial size */
0061 /**
0062   * @}
0063   */
0064 
0065 /** @defgroup CRC_LL_EC_INDATA_REVERSE Input Data Reverse
0066   * @ingroup RTEMSBSPsARMSTM32H7
0067   * @{
0068   */
0069 #define LL_CRC_INDATA_REVERSE_NONE         0x00000000U                              /*!< Input Data bit order not affected */
0070 #define LL_CRC_INDATA_REVERSE_BYTE         CRC_CR_REV_IN_0                          /*!< Input Data bit reversal done by byte */
0071 #define LL_CRC_INDATA_REVERSE_HALFWORD     CRC_CR_REV_IN_1                          /*!< Input Data bit reversal done by half-word */
0072 #define LL_CRC_INDATA_REVERSE_WORD         (CRC_CR_REV_IN_1 | CRC_CR_REV_IN_0)      /*!< Input Data bit reversal done by word */
0073 /**
0074   * @}
0075   */
0076 
0077 /** @defgroup CRC_LL_EC_OUTDATA_REVERSE Output Data Reverse
0078   * @ingroup RTEMSBSPsARMSTM32H7
0079   * @{
0080   */
0081 #define LL_CRC_OUTDATA_REVERSE_NONE        0x00000000U                               /*!< Output Data bit order not affected */
0082 #define LL_CRC_OUTDATA_REVERSE_BIT         CRC_CR_REV_OUT                            /*!< Output Data bit reversal done by bit */
0083 /**
0084   * @}
0085   */
0086 
0087 /** @defgroup CRC_LL_EC_Default_Polynomial_Value    Default CRC generating polynomial value
0088   * @ingroup RTEMSBSPsARMSTM32H7
0089   * @brief    Normal representation of this polynomial value is
0090   *           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 .
0091   * @{
0092   */
0093 #define LL_CRC_DEFAULT_CRC32_POLY          0x04C11DB7U                               /*!< Default CRC generating polynomial value */
0094 /**
0095   * @}
0096   */
0097 
0098 /** @defgroup CRC_LL_EC_Default_InitValue    Default CRC computation initialization value
0099   * @ingroup RTEMSBSPsARMSTM32H7
0100   * @{
0101   */
0102 #define LL_CRC_DEFAULT_CRC_INITVALUE       0xFFFFFFFFU                               /*!< Default CRC computation initialization value */
0103 /**
0104   * @}
0105   */
0106 
0107 /**
0108   * @}
0109   */
0110 
0111 /* Exported macro ------------------------------------------------------------*/
0112 /** @defgroup CRC_LL_Exported_Macros CRC Exported Macros
0113   * @ingroup RTEMSBSPsARMSTM32H7
0114   * @{
0115   */
0116 
0117 /** @defgroup CRC_LL_EM_WRITE_READ Common Write and read registers Macros
0118   * @ingroup RTEMSBSPsARMSTM32H7
0119   * @{
0120   */
0121 
0122 /**
0123   * @brief  Write a value in CRC register
0124   * @param  __INSTANCE__ CRC Instance
0125   * @param  __REG__ Register to be written
0126   * @param  __VALUE__ Value to be written in the register
0127   * @retval None
0128   */
0129 #define LL_CRC_WriteReg(__INSTANCE__, __REG__, __VALUE__) WRITE_REG(__INSTANCE__->__REG__, __VALUE__)
0130 
0131 /**
0132   * @brief  Read a value in CRC register
0133   * @param  __INSTANCE__ CRC Instance
0134   * @param  __REG__ Register to be read
0135   * @retval Register value
0136   */
0137 #define LL_CRC_ReadReg(__INSTANCE__, __REG__) READ_REG(__INSTANCE__->__REG__)
0138 /**
0139   * @}
0140   */
0141 
0142 /**
0143   * @}
0144   */
0145 
0146 
0147 /* Exported functions --------------------------------------------------------*/
0148 /** @defgroup CRC_LL_Exported_Functions CRC Exported Functions
0149   * @ingroup RTEMSBSPsARMSTM32H7
0150   * @{
0151   */
0152 
0153 /** @defgroup CRC_LL_EF_Configuration CRC Configuration functions
0154   * @ingroup RTEMSBSPsARMSTM32H7
0155   * @{
0156   */
0157 
0158 /**
0159   * @brief  Reset the CRC calculation unit.
0160   * @note   If Programmable Initial CRC value feature
0161   *         is available, also set the Data Register to the value stored in the
0162   *         CRC_INIT register, otherwise, reset Data Register to its default value.
0163   * @rmtoll CR           RESET         LL_CRC_ResetCRCCalculationUnit
0164   * @param  CRCx CRC Instance
0165   * @retval None
0166   */
0167 __STATIC_INLINE void LL_CRC_ResetCRCCalculationUnit(CRC_TypeDef *CRCx)
0168 {
0169   SET_BIT(CRCx->CR, CRC_CR_RESET);
0170 }
0171 
0172 /**
0173   * @brief  Configure size of the polynomial.
0174   * @rmtoll CR           POLYSIZE      LL_CRC_SetPolynomialSize
0175   * @param  CRCx CRC Instance
0176   * @param  PolySize This parameter can be one of the following values:
0177   *         @arg @ref LL_CRC_POLYLENGTH_32B
0178   *         @arg @ref LL_CRC_POLYLENGTH_16B
0179   *         @arg @ref LL_CRC_POLYLENGTH_8B
0180   *         @arg @ref LL_CRC_POLYLENGTH_7B
0181   * @retval None
0182   */
0183 __STATIC_INLINE void LL_CRC_SetPolynomialSize(CRC_TypeDef *CRCx, uint32_t PolySize)
0184 {
0185   MODIFY_REG(CRCx->CR, CRC_CR_POLYSIZE, PolySize);
0186 }
0187 
0188 /**
0189   * @brief  Return size of the polynomial.
0190   * @rmtoll CR           POLYSIZE      LL_CRC_GetPolynomialSize
0191   * @param  CRCx CRC Instance
0192   * @retval Returned value can be one of the following values:
0193   *         @arg @ref LL_CRC_POLYLENGTH_32B
0194   *         @arg @ref LL_CRC_POLYLENGTH_16B
0195   *         @arg @ref LL_CRC_POLYLENGTH_8B
0196   *         @arg @ref LL_CRC_POLYLENGTH_7B
0197   */
0198 __STATIC_INLINE uint32_t LL_CRC_GetPolynomialSize(const CRC_TypeDef *CRCx)
0199 {
0200   return (uint32_t)(READ_BIT(CRCx->CR, CRC_CR_POLYSIZE));
0201 }
0202 
0203 /**
0204   * @brief  Configure the reversal of the bit order of the input data
0205   * @rmtoll CR           REV_IN        LL_CRC_SetInputDataReverseMode
0206   * @param  CRCx CRC Instance
0207   * @param  ReverseMode This parameter can be one of the following values:
0208   *         @arg @ref LL_CRC_INDATA_REVERSE_NONE
0209   *         @arg @ref LL_CRC_INDATA_REVERSE_BYTE
0210   *         @arg @ref LL_CRC_INDATA_REVERSE_HALFWORD
0211   *         @arg @ref LL_CRC_INDATA_REVERSE_WORD
0212   * @retval None
0213   */
0214 __STATIC_INLINE void LL_CRC_SetInputDataReverseMode(CRC_TypeDef *CRCx, uint32_t ReverseMode)
0215 {
0216   MODIFY_REG(CRCx->CR, CRC_CR_REV_IN, ReverseMode);
0217 }
0218 
0219 /**
0220   * @brief  Return type of reversal for input data bit order
0221   * @rmtoll CR           REV_IN        LL_CRC_GetInputDataReverseMode
0222   * @param  CRCx CRC Instance
0223   * @retval Returned value can be one of the following values:
0224   *         @arg @ref LL_CRC_INDATA_REVERSE_NONE
0225   *         @arg @ref LL_CRC_INDATA_REVERSE_BYTE
0226   *         @arg @ref LL_CRC_INDATA_REVERSE_HALFWORD
0227   *         @arg @ref LL_CRC_INDATA_REVERSE_WORD
0228   */
0229 __STATIC_INLINE uint32_t LL_CRC_GetInputDataReverseMode(const CRC_TypeDef *CRCx)
0230 {
0231   return (uint32_t)(READ_BIT(CRCx->CR, CRC_CR_REV_IN));
0232 }
0233 
0234 /**
0235   * @brief  Configure the reversal of the bit order of the Output data
0236   * @rmtoll CR           REV_OUT       LL_CRC_SetOutputDataReverseMode
0237   * @param  CRCx CRC Instance
0238   * @param  ReverseMode This parameter can be one of the following values:
0239   *         @arg @ref LL_CRC_OUTDATA_REVERSE_NONE
0240   *         @arg @ref LL_CRC_OUTDATA_REVERSE_BIT
0241   * @retval None
0242   */
0243 __STATIC_INLINE void LL_CRC_SetOutputDataReverseMode(CRC_TypeDef *CRCx, uint32_t ReverseMode)
0244 {
0245   MODIFY_REG(CRCx->CR, CRC_CR_REV_OUT, ReverseMode);
0246 }
0247 
0248 /**
0249   * @brief  Return type of reversal of the bit order of the Output data
0250   * @rmtoll CR           REV_OUT       LL_CRC_GetOutputDataReverseMode
0251   * @param  CRCx CRC Instance
0252   * @retval Returned value can be one of the following values:
0253   *         @arg @ref LL_CRC_OUTDATA_REVERSE_NONE
0254   *         @arg @ref LL_CRC_OUTDATA_REVERSE_BIT
0255   */
0256 __STATIC_INLINE uint32_t LL_CRC_GetOutputDataReverseMode(const CRC_TypeDef *CRCx)
0257 {
0258   return (uint32_t)(READ_BIT(CRCx->CR, CRC_CR_REV_OUT));
0259 }
0260 
0261 /**
0262   * @brief  Initialize the Programmable initial CRC value.
0263   * @note   If the CRC size is less than 32 bits, the least significant bits
0264   *         are used to write the correct value
0265   * @note   LL_CRC_DEFAULT_CRC_INITVALUE could be used as value for InitCrc parameter.
0266   * @rmtoll INIT         INIT          LL_CRC_SetInitialData
0267   * @param  CRCx CRC Instance
0268   * @param  InitCrc Value to be programmed in Programmable initial CRC value register
0269   * @retval None
0270   */
0271 __STATIC_INLINE void LL_CRC_SetInitialData(CRC_TypeDef *CRCx, uint32_t InitCrc)
0272 {
0273   WRITE_REG(CRCx->INIT, InitCrc);
0274 }
0275 
0276 /**
0277   * @brief  Return current Initial CRC value.
0278   * @note   If the CRC size is less than 32 bits, the least significant bits
0279   *         are used to read the correct value
0280   * @rmtoll INIT         INIT          LL_CRC_GetInitialData
0281   * @param  CRCx CRC Instance
0282   * @retval Value programmed in Programmable initial CRC value register
0283   */
0284 __STATIC_INLINE uint32_t LL_CRC_GetInitialData(const CRC_TypeDef *CRCx)
0285 {
0286   return (uint32_t)(READ_REG(CRCx->INIT));
0287 }
0288 
0289 /**
0290   * @brief  Initialize the Programmable polynomial value
0291   *         (coefficients of the polynomial to be used for CRC calculation).
0292   * @note   LL_CRC_DEFAULT_CRC32_POLY could be used as value for PolynomCoef parameter.
0293   * @note   Please check Reference Manual and existing Errata Sheets,
0294   *         regarding possible limitations for Polynomial values usage.
0295   *         For example, for a polynomial of degree 7, X^7 + X^6 + X^5 + X^2 + 1 is written 0x65
0296   * @rmtoll POL          POL           LL_CRC_SetPolynomialCoef
0297   * @param  CRCx CRC Instance
0298   * @param  PolynomCoef Value to be programmed in Programmable Polynomial value register
0299   * @retval None
0300   */
0301 __STATIC_INLINE void LL_CRC_SetPolynomialCoef(CRC_TypeDef *CRCx, uint32_t PolynomCoef)
0302 {
0303   WRITE_REG(CRCx->POL, PolynomCoef);
0304 }
0305 
0306 /**
0307   * @brief  Return current Programmable polynomial value
0308   * @note   Please check Reference Manual and existing Errata Sheets,
0309   *         regarding possible limitations for Polynomial values usage.
0310   *         For example, for a polynomial of degree 7, X^7 + X^6 + X^5 + X^2 + 1 is written 0x65
0311   * @rmtoll POL          POL           LL_CRC_GetPolynomialCoef
0312   * @param  CRCx CRC Instance
0313   * @retval Value programmed in Programmable Polynomial value register
0314   */
0315 __STATIC_INLINE uint32_t LL_CRC_GetPolynomialCoef(const CRC_TypeDef *CRCx)
0316 {
0317   return (uint32_t)(READ_REG(CRCx->POL));
0318 }
0319 
0320 /**
0321   * @}
0322   */
0323 
0324 /** @defgroup CRC_LL_EF_Data_Management Data_Management
0325   * @ingroup RTEMSBSPsARMSTM32H7
0326   * @{
0327   */
0328 
0329 /**
0330   * @brief  Write given 32-bit data to the CRC calculator
0331   * @rmtoll DR           DR            LL_CRC_FeedData32
0332   * @param  CRCx CRC Instance
0333   * @param  InData value to be provided to CRC calculator between between Min_Data=0 and Max_Data=0xFFFFFFFF
0334   * @retval None
0335   */
0336 __STATIC_INLINE void LL_CRC_FeedData32(CRC_TypeDef *CRCx, uint32_t InData)
0337 {
0338   WRITE_REG(CRCx->DR, InData);
0339 }
0340 
0341 /**
0342   * @brief  Write given 16-bit data to the CRC calculator
0343   * @rmtoll DR           DR            LL_CRC_FeedData16
0344   * @param  CRCx CRC Instance
0345   * @param  InData 16 bit value to be provided to CRC calculator between between Min_Data=0 and Max_Data=0xFFFF
0346   * @retval None
0347   */
0348 __STATIC_INLINE void LL_CRC_FeedData16(CRC_TypeDef *CRCx, uint16_t InData)
0349 {
0350   __IO uint16_t *pReg;
0351 
0352   pReg = (__IO uint16_t *)(__IO void *)(&CRCx->DR);                             /* Derogation MisraC2012 R.11.5 */
0353   *pReg = InData;
0354 }
0355 
0356 /**
0357   * @brief  Write given 8-bit data to the CRC calculator
0358   * @rmtoll DR           DR            LL_CRC_FeedData8
0359   * @param  CRCx CRC Instance
0360   * @param  InData 8 bit value to be provided to CRC calculator between between Min_Data=0 and Max_Data=0xFF
0361   * @retval None
0362   */
0363 __STATIC_INLINE void LL_CRC_FeedData8(CRC_TypeDef *CRCx, uint8_t InData)
0364 {
0365   *(uint8_t __IO *)(&CRCx->DR) = (uint8_t) InData;
0366 }
0367 
0368 /**
0369   * @brief  Return current CRC calculation result. 32 bits value is returned.
0370   * @rmtoll DR           DR            LL_CRC_ReadData32
0371   * @param  CRCx CRC Instance
0372   * @retval Current CRC calculation result as stored in CRC_DR register (32 bits).
0373   */
0374 __STATIC_INLINE uint32_t LL_CRC_ReadData32(const CRC_TypeDef *CRCx)
0375 {
0376   return (uint32_t)(READ_REG(CRCx->DR));
0377 }
0378 
0379 /**
0380   * @brief  Return current CRC calculation result. 16 bits value is returned.
0381   * @note   This function is expected to be used in a 16 bits CRC polynomial size context.
0382   * @rmtoll DR           DR            LL_CRC_ReadData16
0383   * @param  CRCx CRC Instance
0384   * @retval Current CRC calculation result as stored in CRC_DR register (16 bits).
0385   */
0386 __STATIC_INLINE uint16_t LL_CRC_ReadData16(const CRC_TypeDef *CRCx)
0387 {
0388   return (uint16_t)READ_REG(CRCx->DR);
0389 }
0390 
0391 /**
0392   * @brief  Return current CRC calculation result. 8 bits value is returned.
0393   * @note   This function is expected to be used in a 8 bits CRC polynomial size context.
0394   * @rmtoll DR           DR            LL_CRC_ReadData8
0395   * @param  CRCx CRC Instance
0396   * @retval Current CRC calculation result as stored in CRC_DR register (8 bits).
0397   */
0398 __STATIC_INLINE uint8_t LL_CRC_ReadData8(const CRC_TypeDef *CRCx)
0399 {
0400   return (uint8_t)READ_REG(CRCx->DR);
0401 }
0402 
0403 /**
0404   * @brief  Return current CRC calculation result. 7 bits value is returned.
0405   * @note   This function is expected to be used in a 7 bits CRC polynomial size context.
0406   * @rmtoll DR           DR            LL_CRC_ReadData7
0407   * @param  CRCx CRC Instance
0408   * @retval Current CRC calculation result as stored in CRC_DR register (7 bits).
0409   */
0410 __STATIC_INLINE uint8_t LL_CRC_ReadData7(const CRC_TypeDef *CRCx)
0411 {
0412   return (uint8_t)(READ_REG(CRCx->DR) & 0x7FU);
0413 }
0414 
0415 /**
0416   * @brief  Return data stored in the Independent Data(IDR) register.
0417   * @note   This register can be used as a temporary storage location for one 32-bit long data.
0418   * @rmtoll IDR          IDR           LL_CRC_Read_IDR
0419   * @param  CRCx CRC Instance
0420   * @retval Value stored in CRC_IDR register (General-purpose 32-bit data register).
0421   */
0422 __STATIC_INLINE uint32_t LL_CRC_Read_IDR(const CRC_TypeDef *CRCx)
0423 {
0424   return (uint32_t)(READ_REG(CRCx->IDR));
0425 }
0426 
0427 /**
0428   * @brief  Store data in the Independent Data(IDR) register.
0429   * @note   This register can be used as a temporary storage location for one 32-bit long data.
0430   * @rmtoll IDR          IDR           LL_CRC_Write_IDR
0431   * @param  CRCx CRC Instance
0432   * @param  InData value to be stored in CRC_IDR register (32-bit) between Min_Data=0 and Max_Data=0xFFFFFFFF
0433   * @retval None
0434   */
0435 __STATIC_INLINE void LL_CRC_Write_IDR(CRC_TypeDef *CRCx, uint32_t InData)
0436 {
0437   *((uint32_t __IO *)(&CRCx->IDR)) = (uint32_t) InData;
0438 }
0439 /**
0440   * @}
0441   */
0442 
0443 #if defined(USE_FULL_LL_DRIVER) || defined(__rtems__)
0444 /** @defgroup CRC_LL_EF_Init Initialization and de-initialization functions
0445   * @ingroup RTEMSBSPsARMSTM32H7
0446   * @{
0447   */
0448 
0449 ErrorStatus LL_CRC_DeInit(const CRC_TypeDef *CRCx);
0450 
0451 /**
0452   * @}
0453   */
0454 #endif /* USE_FULL_LL_DRIVER */
0455 
0456 /**
0457   * @}
0458   */
0459 
0460 /**
0461   * @}
0462   */
0463 
0464 #endif /* defined(CRC) */
0465 
0466 /**
0467   * @}
0468   */
0469 
0470 #ifdef __cplusplus
0471 }
0472 #endif
0473 
0474 #endif /* STM32H7xx_LL_CRC_H */