| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234 | /**  ******************************************************************************  * @file    stm32f0xx_hal_crc_ex.c  * @author  MCD Application Team  * @brief   Extended CRC HAL module driver.  *          This file provides firmware functions to manage the extended  *          functionalities of the CRC peripheral.  *  ******************************************************************************  * @attention  *  * Copyright (c) 2016 STMicroelectronics.  * All rights reserved.  *  * This software is licensed under terms that can be found in the LICENSE file  * in the root directory of this software component.  * If no LICENSE file comes with this software, it is provided AS-IS.  *  ******************************************************************************  @verbatim================================================================================            ##### How to use this driver #####================================================================================    [..]         (+) Set user-defined generating polynomial through HAL_CRCEx_Polynomial_Set()         (+) Configure Input or Output data inversion  @endverbatim  ******************************************************************************  *//* Includes ------------------------------------------------------------------*/#include "stm32f0xx_hal.h"/** @addtogroup STM32F0xx_HAL_Driver  * @{  *//** @defgroup CRCEx CRCEx  * @brief CRC Extended HAL module driver  * @{  */#ifdef HAL_CRC_MODULE_ENABLED/* Private typedef -----------------------------------------------------------*//* Private define ------------------------------------------------------------*//* Private macro -------------------------------------------------------------*//* Private variables ---------------------------------------------------------*//* Private function prototypes -----------------------------------------------*//* Exported functions --------------------------------------------------------*//** @defgroup CRCEx_Exported_Functions CRC Extended Exported Functions  * @{  *//** @defgroup CRCEx_Exported_Functions_Group1 Extended Initialization/de-initialization functions  * @brief    Extended Initialization and Configuration functions.  *@verbatim ===============================================================================            ##### Extended configuration functions ##### ===============================================================================    [..]  This section provides functions allowing to:      (+) Configure the generating polynomial      (+) Configure the input data inversion      (+) Configure the output data inversion@endverbatim  * @{  */#if defined(CRC_POL_POL)/**  * @brief  Initialize the CRC polynomial if different from default one.  * @param  hcrc CRC handle  * @param  Pol CRC generating polynomial (7, 8, 16 or 32-bit long).  *         This parameter is written in normal representation, e.g.  *         @arg for a polynomial of degree 7, X^7 + X^6 + X^5 + X^2 + 1 is written 0x65  *         @arg for a polynomial of degree 16, X^16 + X^12 + X^5 + 1 is written 0x1021  * @param  PolyLength CRC polynomial length.  *         This parameter can be one of the following values:  *          @arg @ref CRC_POLYLENGTH_7B  7-bit long CRC (generating polynomial of degree 7)  *          @arg @ref CRC_POLYLENGTH_8B  8-bit long CRC (generating polynomial of degree 8)  *          @arg @ref CRC_POLYLENGTH_16B 16-bit long CRC (generating polynomial of degree 16)  *          @arg @ref CRC_POLYLENGTH_32B 32-bit long CRC (generating polynomial of degree 32)  * @retval HAL status  */HAL_StatusTypeDef HAL_CRCEx_Polynomial_Set(CRC_HandleTypeDef *hcrc, uint32_t Pol, uint32_t PolyLength){  HAL_StatusTypeDef status = HAL_OK;  uint32_t msb = 31U; /* polynomial degree is 32 at most, so msb is initialized to max value */  /* Check the parameters */  assert_param(IS_CRC_POL_LENGTH(PolyLength));  /* Ensure that the generating polynomial is odd */  if ((Pol & (uint32_t)(0x1U)) ==  0U)  {    status =  HAL_ERROR;  }  else  {    /* check polynomial definition vs polynomial size:     * polynomial length must be aligned with polynomial     * definition. HAL_ERROR is reported if Pol degree is     * larger than that indicated by PolyLength.     * Look for MSB position: msb will contain the degree of     *  the second to the largest polynomial member. E.g., for     *  X^7 + X^6 + X^5 + X^2 + 1, msb = 6. */    while ((msb-- > 0U) && ((Pol & ((uint32_t)(0x1U) << (msb & 0x1FU))) == 0U))    {    }    switch (PolyLength)    {      case CRC_POLYLENGTH_7B:        if (msb >= HAL_CRC_LENGTH_7B)        {          status =   HAL_ERROR;        }        break;      case CRC_POLYLENGTH_8B:        if (msb >= HAL_CRC_LENGTH_8B)        {          status =   HAL_ERROR;        }        break;      case CRC_POLYLENGTH_16B:        if (msb >= HAL_CRC_LENGTH_16B)        {          status =   HAL_ERROR;        }        break;      case CRC_POLYLENGTH_32B:        /* no polynomial definition vs. polynomial length issue possible */        break;      default:        status =  HAL_ERROR;        break;    }  }  if (status == HAL_OK)  {    /* set generating polynomial */    WRITE_REG(hcrc->Instance->POL, Pol);    /* set generating polynomial size */    MODIFY_REG(hcrc->Instance->CR, CRC_CR_POLYSIZE, PolyLength);  }  /* Return function status */  return status;}#endif /* CRC_POL_POL *//**  * @brief  Set the Reverse Input data mode.  * @param  hcrc CRC handle  * @param  InputReverseMode Input Data inversion mode.  *         This parameter can be one of the following values:  *          @arg @ref CRC_INPUTDATA_INVERSION_NONE     no change in bit order (default value)  *          @arg @ref CRC_INPUTDATA_INVERSION_BYTE     Byte-wise bit reversal  *          @arg @ref CRC_INPUTDATA_INVERSION_HALFWORD HalfWord-wise bit reversal  *          @arg @ref CRC_INPUTDATA_INVERSION_WORD     Word-wise bit reversal  * @retval HAL status  */HAL_StatusTypeDef HAL_CRCEx_Input_Data_Reverse(CRC_HandleTypeDef *hcrc, uint32_t InputReverseMode){  /* Check the parameters */  assert_param(IS_CRC_INPUTDATA_INVERSION_MODE(InputReverseMode));  /* Change CRC peripheral state */  hcrc->State = HAL_CRC_STATE_BUSY;  /* set input data inversion mode */  MODIFY_REG(hcrc->Instance->CR, CRC_CR_REV_IN, InputReverseMode);  /* Change CRC peripheral state */  hcrc->State = HAL_CRC_STATE_READY;  /* Return function status */  return HAL_OK;}/**  * @brief  Set the Reverse Output data mode.  * @param  hcrc CRC handle  * @param  OutputReverseMode Output Data inversion mode.  *         This parameter can be one of the following values:  *          @arg @ref CRC_OUTPUTDATA_INVERSION_DISABLE no CRC inversion (default value)  *          @arg @ref CRC_OUTPUTDATA_INVERSION_ENABLE  bit-level inversion (e.g. for a 8-bit CRC: 0xB5 becomes 0xAD)  * @retval HAL status  */HAL_StatusTypeDef HAL_CRCEx_Output_Data_Reverse(CRC_HandleTypeDef *hcrc, uint32_t OutputReverseMode){  /* Check the parameters */  assert_param(IS_CRC_OUTPUTDATA_INVERSION_MODE(OutputReverseMode));  /* Change CRC peripheral state */  hcrc->State = HAL_CRC_STATE_BUSY;  /* set output data inversion mode */  MODIFY_REG(hcrc->Instance->CR, CRC_CR_REV_OUT, OutputReverseMode);  /* Change CRC peripheral state */  hcrc->State = HAL_CRC_STATE_READY;  /* Return function status */  return HAL_OK;}/**  * @}  *//**  * @}  */#endif /* HAL_CRC_MODULE_ENABLED *//**  * @}  *//**  * @}  */
 |