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>© 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****/ |