Subversion Repositories FuelGauge

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 mjames 1
/**
2
  ******************************************************************************
3
  * @file    stm32f0xx_hal_crc_ex.c
4
  * @author  MCD Application Team
5
  * @brief   Extended CRC HAL module driver.
6
  *          This file provides firmware functions to manage the extended
7
  *          functionalities of the CRC peripheral.
8
  *
9
  @verbatim
10
================================================================================
11
            ##### How to use this driver #####
12
================================================================================
13
    [..]
6 mjames 14
         (+) Set user-defined generating polynomial through HAL_CRCEx_Polynomial_Set()
2 mjames 15
         (+) Configure Input or Output data inversion
16
 
17
  @endverbatim
18
  ******************************************************************************
19
  * @attention
20
  *
21
  * <h2><center>&copy; Copyright (c) 2016 STMicroelectronics.
22
  * All rights reserved.</center></h2>
23
  *
24
  * This software component is licensed by ST under BSD 3-Clause license,
25
  * the "License"; You may not use this file except in compliance with the
26
  * License. You may obtain a copy of the License at:
27
  *                        opensource.org/licenses/BSD-3-Clause
28
  *
29
  ******************************************************************************
30
  */
31
 
32
/* Includes ------------------------------------------------------------------*/
33
#include "stm32f0xx_hal.h"
34
 
35
/** @addtogroup STM32F0xx_HAL_Driver
36
  * @{
37
  */
38
 
39
/** @defgroup CRCEx CRCEx
40
  * @brief CRC Extended HAL module driver
41
  * @{
42
  */
43
 
44
#ifdef HAL_CRC_MODULE_ENABLED
45
 
46
/* Private typedef -----------------------------------------------------------*/
47
/* Private define ------------------------------------------------------------*/
48
/* Private macro -------------------------------------------------------------*/
49
/* Private variables ---------------------------------------------------------*/
50
/* Private function prototypes -----------------------------------------------*/
51
/* Exported functions --------------------------------------------------------*/
52
 
53
/** @defgroup CRCEx_Exported_Functions CRC Extended Exported Functions
54
  * @{
55
  */
56
 
57
/** @defgroup CRCEx_Exported_Functions_Group1 Extended Initialization/de-initialization functions
58
  * @brief    Extended Initialization and Configuration functions.
59
  *
60
@verbatim
61
 ===============================================================================
62
            ##### Extended configuration functions #####
63
 ===============================================================================
64
    [..]  This section provides functions allowing to:
65
      (+) Configure the generating polynomial
66
      (+) Configure the input data inversion
67
      (+) Configure the output data inversion
68
 
69
@endverbatim
70
  * @{
71
  */
72
 
73
 
74
#if defined(CRC_POL_POL)
75
/**
76
  * @brief  Initialize the CRC polynomial if different from default one.
77
  * @param  hcrc CRC handle
78
  * @param  Pol CRC generating polynomial (7, 8, 16 or 32-bit long).
79
  *         This parameter is written in normal representation, e.g.
80
  *         @arg for a polynomial of degree 7, X^7 + X^6 + X^5 + X^2 + 1 is written 0x65
81
  *         @arg for a polynomial of degree 16, X^16 + X^12 + X^5 + 1 is written 0x1021
82
  * @param  PolyLength CRC polynomial length.
83
  *         This parameter can be one of the following values:
84
  *          @arg @ref CRC_POLYLENGTH_7B  7-bit long CRC (generating polynomial of degree 7)
85
  *          @arg @ref CRC_POLYLENGTH_8B  8-bit long CRC (generating polynomial of degree 8)
86
  *          @arg @ref CRC_POLYLENGTH_16B 16-bit long CRC (generating polynomial of degree 16)
87
  *          @arg @ref CRC_POLYLENGTH_32B 32-bit long CRC (generating polynomial of degree 32)
88
  * @retval HAL status
89
  */
90
HAL_StatusTypeDef HAL_CRCEx_Polynomial_Set(CRC_HandleTypeDef *hcrc, uint32_t Pol, uint32_t PolyLength)
91
{
92
  HAL_StatusTypeDef status = HAL_OK;
93
  uint32_t msb = 31U; /* polynomial degree is 32 at most, so msb is initialized to max value */
94
 
95
  /* Check the parameters */
96
  assert_param(IS_CRC_POL_LENGTH(PolyLength));
97
 
98
  /* check polynomial definition vs polynomial size:
99
   * polynomial length must be aligned with polynomial
100
   * definition. HAL_ERROR is reported if Pol degree is
101
   * larger than that indicated by PolyLength.
102
   * Look for MSB position: msb will contain the degree of
103
   *  the second to the largest polynomial member. E.g., for
104
   *  X^7 + X^6 + X^5 + X^2 + 1, msb = 6. */
105
  while ((msb-- > 0U) && ((Pol & ((uint32_t)(0x1U) << (msb & 0x1FU))) == 0U))
106
  {
107
  }
108
 
109
  switch (PolyLength)
110
  {
111
    case CRC_POLYLENGTH_7B:
112
      if (msb >= HAL_CRC_LENGTH_7B)
113
      {
114
        status =   HAL_ERROR;
115
      }
116
      break;
117
    case CRC_POLYLENGTH_8B:
118
      if (msb >= HAL_CRC_LENGTH_8B)
119
      {
120
        status =   HAL_ERROR;
121
      }
122
      break;
123
    case CRC_POLYLENGTH_16B:
124
      if (msb >= HAL_CRC_LENGTH_16B)
125
      {
126
        status =   HAL_ERROR;
127
      }
128
      break;
129
 
130
    case CRC_POLYLENGTH_32B:
131
      /* no polynomial definition vs. polynomial length issue possible */
132
      break;
133
    default:
134
      status =  HAL_ERROR;
135
      break;
136
  }
137
  if (status == HAL_OK)
138
  {
139
    /* set generating polynomial */
140
    WRITE_REG(hcrc->Instance->POL, Pol);
141
 
142
    /* set generating polynomial size */
143
    MODIFY_REG(hcrc->Instance->CR, CRC_CR_POLYSIZE, PolyLength);
144
  }
145
  /* Return function status */
146
  return status;
147
}
148
#endif /* CRC_POL_POL */
149
 
150
/**
151
  * @brief  Set the Reverse Input data mode.
152
  * @param  hcrc CRC handle
153
  * @param  InputReverseMode Input Data inversion mode.
154
  *         This parameter can be one of the following values:
155
  *          @arg @ref CRC_INPUTDATA_INVERSION_NONE     no change in bit order (default value)
156
  *          @arg @ref CRC_INPUTDATA_INVERSION_BYTE     Byte-wise bit reversal
157
  *          @arg @ref CRC_INPUTDATA_INVERSION_HALFWORD HalfWord-wise bit reversal
158
  *          @arg @ref CRC_INPUTDATA_INVERSION_WORD     Word-wise bit reversal
159
  * @retval HAL status
160
  */
161
HAL_StatusTypeDef HAL_CRCEx_Input_Data_Reverse(CRC_HandleTypeDef *hcrc, uint32_t InputReverseMode)
162
{
163
  /* Check the parameters */
164
  assert_param(IS_CRC_INPUTDATA_INVERSION_MODE(InputReverseMode));
165
 
166
  /* Change CRC peripheral state */
167
  hcrc->State = HAL_CRC_STATE_BUSY;
168
 
169
  /* set input data inversion mode */
170
  MODIFY_REG(hcrc->Instance->CR, CRC_CR_REV_IN, InputReverseMode);
171
  /* Change CRC peripheral state */
172
  hcrc->State = HAL_CRC_STATE_READY;
173
 
174
  /* Return function status */
175
  return HAL_OK;
176
}
177
 
178
/**
179
  * @brief  Set the Reverse Output data mode.
180
  * @param  hcrc CRC handle
181
  * @param  OutputReverseMode Output Data inversion mode.
182
  *         This parameter can be one of the following values:
183
  *          @arg @ref CRC_OUTPUTDATA_INVERSION_DISABLE no CRC inversion (default value)
184
  *          @arg @ref CRC_OUTPUTDATA_INVERSION_ENABLE  bit-level inversion (e.g. for a 8-bit CRC: 0xB5 becomes 0xAD)
185
  * @retval HAL status
186
  */
187
HAL_StatusTypeDef HAL_CRCEx_Output_Data_Reverse(CRC_HandleTypeDef *hcrc, uint32_t OutputReverseMode)
188
{
189
  /* Check the parameters */
190
  assert_param(IS_CRC_OUTPUTDATA_INVERSION_MODE(OutputReverseMode));
191
 
192
  /* Change CRC peripheral state */
193
  hcrc->State = HAL_CRC_STATE_BUSY;
194
 
195
  /* set output data inversion mode */
196
  MODIFY_REG(hcrc->Instance->CR, CRC_CR_REV_OUT, OutputReverseMode);
197
 
198
  /* Change CRC peripheral state */
199
  hcrc->State = HAL_CRC_STATE_READY;
200
 
201
  /* Return function status */
202
  return HAL_OK;
203
}
204
 
205
 
206
 
207
 
208
/**
209
  * @}
210
  */
211
 
212
 
213
/**
214
  * @}
215
  */
216
 
217
 
218
#endif /* HAL_CRC_MODULE_ENABLED */
219
/**
220
  * @}
221
  */
222
 
223
/**
224
  * @}
225
  */
226
 
227
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/