1 /**
2   ******************************************************************************
3   * @file    stm32f7xx_hal_crc.h
4   * @author  MCD Application Team
5   * @version V1.0.1
6   * @date    25-June-2015
7   * @brief   Header file of CRC HAL module.
8   ******************************************************************************
9   * @attention
10   *
11   * <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
12   *
13   * Redistribution and use in source and binary forms, with or without modification,
14   * are permitted provided that the following conditions are met:
15   *   1. Redistributions of source code must retain the above copyright notice,
16   *      this list of conditions and the following disclaimer.
17   *   2. Redistributions in binary form must reproduce the above copyright notice,
18   *      this list of conditions and the following disclaimer in the documentation
19   *      and/or other materials provided with the distribution.
20   *   3. Neither the name of STMicroelectronics nor the names of its contributors
21   *      may be used to endorse or promote products derived from this software
22   *      without specific prior written permission.
23   *
24   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
25   * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
27   * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
28   * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29   * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
30   * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
31   * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
32   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
33   * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34   *
35   ******************************************************************************
36   */
37 
38 /* Define to prevent recursive inclusion -------------------------------------*/
39 #ifndef __STM32F7xx_HAL_CRC_H
40 #define __STM32F7xx_HAL_CRC_H
41 
42 #ifdef __cplusplus
43 extern "C" {
44 #endif
45 
46 /* Includes ------------------------------------------------------------------*/
47 #include "stm32f7xx_hal_def.h"
48 
49 /** @addtogroup STM32F7xx_HAL_Driver
50   * @{
51   */
52 
53 /** @defgroup CRC CRC
54   * @brief CRC HAL module driver
55   * @{
56   */
57 
58 /* Exported types ------------------------------------------------------------*/
59 /** @defgroup CRC_Exported_Types CRC Exported Types
60   * @{
61   */
62 
63 /** @defgroup CRC_Exported_Types_Group1 CRC State Structure definition
64   * @{
65   */
66 typedef enum {
67     HAL_CRC_STATE_RESET     = 0x00,  /*!< CRC not yet initialized or disabled */
68     HAL_CRC_STATE_READY     = 0x01,  /*!< CRC initialized and ready for use   */
69     HAL_CRC_STATE_BUSY      = 0x02,  /*!< CRC internal process is ongoing     */
70     HAL_CRC_STATE_TIMEOUT   = 0x03,  /*!< CRC timeout state                   */
71     HAL_CRC_STATE_ERROR     = 0x04   /*!< CRC error state                     */
72 } HAL_CRC_StateTypeDef;
73 /**
74   * @}
75   */
76 
77 /** @defgroup CRC_Exported_Types_Group2 CRC Init Structure definition
78   * @{
79   */
80 typedef struct {
81     uint8_t DefaultPolynomialUse;       /*!< This parameter is a value of @ref CRC_Default_Polynomial and indicates if default polynomial is used.
82                                             If set to DEFAULT_POLYNOMIAL_ENABLE, resort to default
83                                             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.
84                                             In that case, there is no need to set GeneratingPolynomial field.
85                                             If otherwise set to DEFAULT_POLYNOMIAL_DISABLE, GeneratingPolynomial and CRCLength fields must be set */
86 
87     uint8_t DefaultInitValueUse;        /*!< This parameter is a value of @ref CRC_Default_InitValue_Use and indicates if default init value is used.
88                                            If set to DEFAULT_INIT_VALUE_ENABLE, resort to default
89                                            0xFFFFFFFF value. In that case, there is no need to set InitValue field.
90                                            If otherwise set to DEFAULT_INIT_VALUE_DISABLE,  InitValue field must be set */
91 
92     uint32_t GeneratingPolynomial;      /*!< Set CRC generating polynomial. 7, 8, 16 or 32-bit long value for a polynomial degree
93                                            respectively equal to 7, 8, 16 or 32. This field is written in normal representation,
94                                            e.g., for a polynomial of degree 7, X^7 + X^6 + X^5 + X^2 + 1 is written 0x65.
95                                            No need to specify it if DefaultPolynomialUse is set to DEFAULT_POLYNOMIAL_ENABLE   */
96 
97     uint32_t CRCLength;                 /*!< This parameter is a value of @ref CRC_Polynomial_Sizes and indicates CRC length.
98                                            Value can be either one of
99                                            CRC_POLYLENGTH_32B                  (32-bit CRC)
100                                            CRC_POLYLENGTH_16B                  (16-bit CRC)
101                                            CRC_POLYLENGTH_8B                   (8-bit CRC)
102                                            CRC_POLYLENGTH_7B                   (7-bit CRC) */
103 
104     uint32_t InitValue;                 /*!< Init value to initiate CRC computation. No need to specify it if DefaultInitValueUse
105                                            is set to DEFAULT_INIT_VALUE_ENABLE   */
106 
107     uint32_t InputDataInversionMode;    /*!< This parameter is a value of @ref CRCEx_Input_Data_Inversion and specifies input data inversion mode.
108                                            Can be either one of the following values
109                                            CRC_INPUTDATA_INVERSION_NONE      no input data inversion
110                                            CRC_INPUTDATA_INVERSION_BYTE      byte-wise inversion, 0x1A2B3C4D becomes 0x58D43CB2
111                                            CRC_INPUTDATA_INVERSION_HALFWORD  halfword-wise inversion, 0x1A2B3C4D becomes 0xD458B23C
112                                            CRC_INPUTDATA_INVERSION_WORD      word-wise inversion, 0x1A2B3C4D becomes 0xB23CD458 */
113 
114     uint32_t OutputDataInversionMode;   /*!< This parameter is a value of @ref CRCEx_Output_Data_Inversion and specifies output data (i.e. CRC) inversion mode.
115                                             Can be either
116                                             CRC_OUTPUTDATA_INVERSION_DISABLE   no CRC inversion, or
117                                             CRC_OUTPUTDATA_INVERSION_ENABLE    CRC 0x11223344 is converted into 0x22CC4488 */
118 } CRC_InitTypeDef;
119 /**
120   * @}
121   */
122 
123 /** @defgroup CRC_Exported_Types_Group3 CRC Handle Structure definition
124   * @{
125   */
126 typedef struct {
127     CRC_TypeDef                 *Instance;   /*!< Register base address        */
128 
129     CRC_InitTypeDef             Init;        /*!< CRC configuration parameters */
130 
131     HAL_LockTypeDef             Lock;        /*!< CRC Locking object           */
132 
133     __IO HAL_CRC_StateTypeDef   State;       /*!< CRC communication state      */
134 
135     uint32_t InputDataFormat;                /*!< This parameter is a value of @ref CRC_Input_Buffer_Format and specifies input data format.
136                                             Can be either
137                                             CRC_INPUTDATA_FORMAT_BYTES       input data is a stream of bytes (8-bit data)
138                                             CRC_INPUTDATA_FORMAT_HALFWORDS   input data is a stream of half-words (16-bit data)
139                                             CRC_INPUTDATA_FORMAT_WORDS       input data is a stream of words (32-bits data)
140                                            Note that constant CRC_INPUT_FORMAT_UNDEFINED is defined but an initialization error
141                                            must occur if InputBufferFormat is not one of the three values listed above  */
142 } CRC_HandleTypeDef;
143 /**
144   * @}
145   */
146 
147 /**
148   * @}
149   */
150 
151 /* Exported constants --------------------------------------------------------*/
152 /** @defgroup CRC_Exported_Constants   CRC exported constants
153   * @{
154   */
155 
156 /** @defgroup CRC_Default_Polynomial_Value    Default CRC generating polynomial
157   * @{
158   */
159 #define DEFAULT_CRC32_POLY      0x04C11DB7
160 
161 /**
162   * @}
163   */
164 
165 /** @defgroup CRC_Default_InitValue    Default CRC computation initialization value
166   * @{
167   */
168 #define DEFAULT_CRC_INITVALUE   0xFFFFFFFF
169 
170 /**
171   * @}
172   */
173 
174 /** @defgroup CRC_Default_Polynomial    Indicates whether or not default polynomial is used
175   * @{
176   */
177 #define DEFAULT_POLYNOMIAL_ENABLE       ((uint8_t)0x00)
178 #define DEFAULT_POLYNOMIAL_DISABLE      ((uint8_t)0x01)
179 
180 
181 /**
182   * @}
183   */
184 
185 /** @defgroup CRC_Default_InitValue_Use    Indicates whether or not default init value is used
186   * @{
187   */
188 #define DEFAULT_INIT_VALUE_ENABLE      ((uint8_t)0x00)
189 #define DEFAULT_INIT_VALUE_DISABLE     ((uint8_t)0x01)
190 
191 /**
192   * @}
193   */
194 
195 /** @defgroup CRC_Polynomial_Sizes Polynomial sizes to configure the IP
196   * @{
197   */
198 #define CRC_POLYLENGTH_32B                  ((uint32_t)0x00000000)
199 #define CRC_POLYLENGTH_16B                  ((uint32_t)CRC_CR_POLYSIZE_0)
200 #define CRC_POLYLENGTH_8B                   ((uint32_t)CRC_CR_POLYSIZE_1)
201 #define CRC_POLYLENGTH_7B                   ((uint32_t)CRC_CR_POLYSIZE)
202 /**
203   * @}
204   */
205 
206 /** @defgroup CRC_Polynomial_Size_Definitions CRC polynomial possible sizes actual definitions
207   * @{
208   */
209 #define HAL_CRC_LENGTH_32B     32
210 #define HAL_CRC_LENGTH_16B     16
211 #define HAL_CRC_LENGTH_8B       8
212 #define HAL_CRC_LENGTH_7B       7
213 
214 /**
215   * @}
216   */
217 
218 /** @defgroup CRC_Input_Buffer_Format CRC input buffer format
219   * @{
220   */
221 /* WARNING: CRC_INPUT_FORMAT_UNDEFINED is created for reference purposes but
222  * an error is triggered in HAL_CRC_Init() if InputDataFormat field is set
223  * to CRC_INPUT_FORMAT_UNDEFINED: the format MUST be defined by the user for
224  * the CRC APIs to provide a correct result */
225 #define CRC_INPUTDATA_FORMAT_UNDEFINED             ((uint32_t)0x00000000)
226 #define CRC_INPUTDATA_FORMAT_BYTES                 ((uint32_t)0x00000001)
227 #define CRC_INPUTDATA_FORMAT_HALFWORDS             ((uint32_t)0x00000002)
228 #define CRC_INPUTDATA_FORMAT_WORDS                 ((uint32_t)0x00000003)
229 /**
230   * @}
231   */
232 
233 /**
234   * @}
235   */
236 /* Exported macros -----------------------------------------------------------*/
237 
238 /** @defgroup CRC_Exported_Macros CRC exported macros
239   * @{
240   */
241 
242 /** @brief Reset CRC handle state
243   * @param  __HANDLE__: CRC handle.
244   * @retval None
245   */
246 #define __HAL_CRC_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = HAL_CRC_STATE_RESET)
247 
248 /**
249   * @brief  Reset CRC Data Register.
250   * @param  __HANDLE__: CRC handle
251   * @retval None.
252   */
253 #define __HAL_CRC_DR_RESET(__HANDLE__) ((__HANDLE__)->Instance->CR |= CRC_CR_RESET)
254 
255 /**
256   * @brief  Set CRC INIT non-default value
257   * @param  __HANDLE__    : CRC handle
258   * @param  __INIT__      : 32-bit initial value
259   * @retval None.
260   */
261 #define __HAL_CRC_INITIALCRCVALUE_CONFIG(__HANDLE__, __INIT__) ((__HANDLE__)->Instance->INIT = (__INIT__))
262 
263 /**
264   * @brief Stores a 8-bit data in the Independent Data(ID) register.
265   * @param __HANDLE__: CRC handle
266   * @param __VALUE__: 8-bit value to be stored in the ID register
267   * @retval None
268   */
269 #define __HAL_CRC_SET_IDR(__HANDLE__, __VALUE__) (WRITE_REG((__HANDLE__)->Instance->IDR, CRC_IDR_IDR, (__VALUE__)))
270 
271 /**
272   * @brief Returns the 8-bit data stored in the Independent Data(ID) register.
273   * @param __HANDLE__: CRC handle
274   * @retval 8-bit value of the ID register
275   */
276 #define __HAL_CRC_GET_IDR(__HANDLE__) (((__HANDLE__)->Instance->IDR) & CRC_IDR_IDR)
277 /**
278   * @}
279   */
280 
281 
282 /* Include CRC HAL Extension module */
283 #include "stm32f7xx_hal_crc_ex.h"
284 
285 /* Exported functions --------------------------------------------------------*/
286 /** @defgroup CRC_Exported_Functions CRC Exported Functions
287   * @{
288   */
289 
290 /** @defgroup CRC_Exported_Functions_Group1 Initialization/de-initialization functions
291   * @{
292   */
293 /* Initialization and de-initialization functions  ****************************/
294 HAL_StatusTypeDef HAL_CRC_Init(CRC_HandleTypeDef *hcrc);
295 HAL_StatusTypeDef HAL_CRC_DeInit (CRC_HandleTypeDef *hcrc);
296 void HAL_CRC_MspInit(CRC_HandleTypeDef *hcrc);
297 void HAL_CRC_MspDeInit(CRC_HandleTypeDef *hcrc);
298 /**
299   * @}
300   */
301 
302 /* Aliases for inter STM32 series compatibility */
303 #define HAL_CRC_Input_Data_Reverse   HAL_CRCEx_Input_Data_Reverse
304 #define HAL_CRC_Output_Data_Reverse  HAL_CRCEx_Output_Data_Reverse
305 
306 /** @defgroup CRC_Exported_Functions_Group2 Peripheral Control functions
307   * @{
308   */
309 /* Peripheral Control functions ***********************************************/
310 uint32_t HAL_CRC_Accumulate(CRC_HandleTypeDef *hcrc, uint32_t pBuffer[], uint32_t BufferLength);
311 uint32_t HAL_CRC_Calculate(CRC_HandleTypeDef *hcrc, uint32_t pBuffer[], uint32_t BufferLength);
312 /**
313   * @}
314   */
315 
316 /** @defgroup CRC_Exported_Functions_Group3 Peripheral State functions
317   * @{
318   */
319 /* Peripheral State and Error functions ***************************************/
320 HAL_CRC_StateTypeDef HAL_CRC_GetState(CRC_HandleTypeDef *hcrc);
321 /**
322   * @}
323   */
324 
325 /**
326   * @}
327   */
328 
329 
330 /* Private types -------------------------------------------------------------*/
331 /** @defgroup CRC_Private_Types CRC Private Types
332   * @{
333   */
334 
335 /**
336   * @}
337   */
338 
339 /* Private defines -----------------------------------------------------------*/
340 /** @defgroup CRC_Private_Defines CRC Private Defines
341   * @{
342   */
343 
344 /**
345   * @}
346   */
347 
348 /* Private variables ---------------------------------------------------------*/
349 /** @defgroup CRC_Private_Variables CRC Private Variables
350   * @{
351   */
352 
353 /**
354   * @}
355   */
356 
357 /* Private constants ---------------------------------------------------------*/
358 /** @defgroup CRC_Private_Constants CRC Private Constants
359   * @{
360   */
361 
362 /**
363   * @}
364   */
365 
366 /* Private macros ------------------------------------------------------------*/
367 /** @defgroup CRC_Private_Macros CRC Private Macros
368   * @{
369   */
370 #define IS_DEFAULT_POLYNOMIAL(__DEFAULT__) (((__DEFAULT__) == DEFAULT_POLYNOMIAL_ENABLE) || \
371                                             ((__DEFAULT__) == DEFAULT_POLYNOMIAL_DISABLE))
372 #define IS_DEFAULT_INIT_VALUE(__VALUE__)  (((__VALUE__) == DEFAULT_INIT_VALUE_ENABLE) || \
373                                            ((__VALUE__) == DEFAULT_INIT_VALUE_DISABLE))
374 #define IS_CRC_POL_LENGTH(__LENGTH__)     (((__LENGTH__) == CRC_POLYLENGTH_32B) || \
375                                            ((__LENGTH__) == CRC_POLYLENGTH_16B) || \
376                                            ((__LENGTH__) == CRC_POLYLENGTH_8B)  || \
377                                            ((__LENGTH__) == CRC_POLYLENGTH_7B))
378 #define IS_CRC_INPUTDATA_FORMAT(__FORMAT__)       (((__FORMAT__) == CRC_INPUTDATA_FORMAT_BYTES) || \
379                                                    ((__FORMAT__) == CRC_INPUTDATA_FORMAT_HALFWORDS) || \
380                                                    ((__FORMAT__) == CRC_INPUTDATA_FORMAT_WORDS))
381 
382 
383 /**
384   * @}
385   */
386 
387 /* Private functions prototypes ----------------------------------------------*/
388 /** @defgroup CRC_Private_Functions_Prototypes CRC Private Functions Prototypes
389   * @{
390   */
391 
392 /**
393   * @}
394   */
395 
396 /* Private functions ---------------------------------------------------------*/
397 /** @defgroup CRC_Private_Functions CRC Private Functions
398   * @{
399   */
400 
401 /**
402   * @}
403   */
404 
405 /**
406   * @}
407   */
408 
409 /**
410   * @}
411   */
412 
413 #ifdef __cplusplus
414 }
415 #endif
416 
417 #endif /* __STM32F7xx_HAL_CRC_H */
418 
419 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
420 
421