]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/CORTEX_M7_STM32F7_STM32756G-EVAL/ST_Library/stm32f7xx_hal_crc_ex.c
Update version number ready for V8.2.1 release.
[freertos] / FreeRTOS / Demo / CORTEX_M7_STM32F7_STM32756G-EVAL / ST_Library / stm32f7xx_hal_crc_ex.c
1 /**\r
2   ******************************************************************************\r
3   * @file    stm32f7xx_hal_crc_ex.c\r
4   * @author  MCD Application Team\r
5   * @version V0.3.0\r
6   * @date    06-March-2015\r
7   * @brief   Extended CRC HAL module driver.\r
8   *    \r
9   *          This file provides firmware functions to manage the following \r
10   *          functionalities of the CRC peripheral:\r
11   *           + Initialization/de-initialization functions\r
12   *         \r
13   @verbatim\r
14   ==============================================================================\r
15                     ##### CRC specific features #####\r
16   ==============================================================================\r
17   [..] \r
18   (#) Polynomial configuration.\r
19   (#) Input data reverse mode.\r
20   (#) Output data reverse mode.\r
21 \r
22   @endverbatim\r
23   ******************************************************************************\r
24   * @attention\r
25   *\r
26   * <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>\r
27   *\r
28   * Redistribution and use in source and binary forms, with or without modification,\r
29   * are permitted provided that the following conditions are met:\r
30   *   1. Redistributions of source code must retain the above copyright notice,\r
31   *      this list of conditions and the following disclaimer.\r
32   *   2. Redistributions in binary form must reproduce the above copyright notice,\r
33   *      this list of conditions and the following disclaimer in the documentation\r
34   *      and/or other materials provided with the distribution.\r
35   *   3. Neither the name of STMicroelectronics nor the names of its contributors\r
36   *      may be used to endorse or promote products derived from this software\r
37   *      without specific prior written permission.\r
38   *\r
39   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"\r
40   * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
41   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r
42   * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\r
43   * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r
44   * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\r
45   * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\r
46   * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\r
47   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
48   * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
49   *\r
50   ******************************************************************************  \r
51   */\r
52 \r
53 /* Includes ------------------------------------------------------------------*/\r
54 #include "stm32f7xx_hal.h"\r
55 \r
56 /** @addtogroup STM32F7xx_HAL_Driver\r
57   * @{\r
58   */\r
59 \r
60 /** @addtogroup CRCEx\r
61   * @brief CRC Extended HAL module driver\r
62   * @{\r
63   */\r
64 \r
65 #ifdef HAL_CRC_MODULE_ENABLED\r
66 \r
67 /* Private typedef -----------------------------------------------------------*/\r
68 /* Private define ------------------------------------------------------------*/\r
69 /* Private macro -------------------------------------------------------------*/\r
70 /* Private variables ---------------------------------------------------------*/\r
71 /* Private function prototypes -----------------------------------------------*/\r
72 /* Private functions ---------------------------------------------------------*/\r
73 \r
74 /** @addtogroup CRCEx_Exported_Functions\r
75   * @{\r
76   */\r
77 \r
78 /** @addtogroup CRCEx_Exported_Functions_Group1\r
79  *  @brief    Extended CRC features functions\r
80  *\r
81 @verbatim   \r
82  ===============================================================================\r
83             ##### CRC Extended features functions #####\r
84  ===============================================================================  \r
85     [..]\r
86 This subsection provides function allowing to:\r
87       (+) Set CRC polynomial if different from default one.\r
88  \r
89 @endverbatim\r
90   * @{\r
91   */\r
92 \r
93 \r
94 /**\r
95   * @brief  Initializes the CRC polynomial if different from default one.\r
96   * @param  hcrc: CRC handle\r
97   * @param  Pol: CRC generating polynomial (7, 8, 16 or 32-bit long)\r
98   *         This parameter is written in normal representation, e.g.\r
99   *         for a polynomial of degree 7, X^7 + X^6 + X^5 + X^2 + 1 is written 0x65 \r
100   *         for a polynomial of degree 16, X^16 + X^12 + X^5 + 1 is written 0x1021     \r
101   * @param  PolyLength: CRC polynomial length \r
102   *         This parameter can be one of the following values:\r
103   *          @arg CRC_POLYLENGTH_7B: 7-bit long CRC (generating polynomial of degree 7)\r
104   *          @arg CRC_POLYLENGTH_8B: 8-bit long CRC (generating polynomial of degree 8)\r
105   *          @arg CRC_POLYLENGTH_16B: 16-bit long CRC (generating polynomial of degree 16)\r
106   *          @arg CRC_POLYLENGTH_32B: 32-bit long CRC (generating polynomial of degree 32)                \r
107   * @retval HAL status\r
108   */                                   \r
109 HAL_StatusTypeDef HAL_CRCEx_Polynomial_Set(CRC_HandleTypeDef *hcrc, uint32_t Pol, uint32_t PolyLength)\r
110 {\r
111   uint32_t msb = 31; /* polynomial degree is 32 at most, so msb is initialized to max value */\r
112 \r
113   /* Check the parameters */\r
114   assert_param(IS_CRC_POL_LENGTH(PolyLength));\r
115   \r
116   /* check polynomial definition vs polynomial size:\r
117    * polynomial length must be aligned with polynomial\r
118    * definition. HAL_ERROR is reported if Pol degree is \r
119    * larger than that indicated by PolyLength.\r
120    * Look for MSB position: msb will contain the degree of\r
121    *  the second to the largest polynomial member. E.g., for\r
122    *  X^7 + X^6 + X^5 + X^2 + 1, msb = 6. */\r
123   while (((Pol & ((uint32_t)(0x1) << msb)) == 0) && (msb-- > 0))\r
124   {\r
125   }\r
126 \r
127   switch (PolyLength)\r
128   {\r
129     case CRC_POLYLENGTH_7B:\r
130       if (msb >= HAL_CRC_LENGTH_7B)\r
131       { \r
132         return  HAL_ERROR;\r
133       }\r
134       break;\r
135     case CRC_POLYLENGTH_8B:\r
136       if (msb >= HAL_CRC_LENGTH_8B)\r
137       {\r
138         return  HAL_ERROR;\r
139       }\r
140       break;\r
141     case CRC_POLYLENGTH_16B:\r
142       if (msb >= HAL_CRC_LENGTH_16B)\r
143       {\r
144         return  HAL_ERROR;\r
145       }\r
146       break;\r
147     case CRC_POLYLENGTH_32B:\r
148       /* no polynomial definition vs. polynomial length issue possible */\r
149       break;\r
150   default:\r
151       break;\r
152   }\r
153 \r
154   /* set generating polynomial */\r
155   WRITE_REG(hcrc->Instance->POL, Pol);\r
156   \r
157   /* set generating polynomial size */\r
158   MODIFY_REG(hcrc->Instance->CR, CRC_CR_POLYSIZE, PolyLength);  \r
159   \r
160   /* Return function status */\r
161   return HAL_OK;\r
162 }\r
163 \r
164 /**\r
165   * @brief  Set the Reverse Input data mode.\r
166   * @param  hcrc: CRC handle\r
167   * @param  InputReverseMode: Input Data inversion mode\r
168   *         This parameter can be one of the following values:\r
169   *          @arg CRC_INPUTDATA_INVERSION_NONE: no change in bit order (default value)\r
170   *          @arg CRC_INPUTDATA_INVERSION_BYTE: Byte-wise bit reversal\r
171   *          @arg CRC_INPUTDATA_INVERSION_HALFWORD: HalfWord-wise bit reversal\r
172   *          @arg CRC_INPUTDATA_INVERSION_WORD: Word-wise bit reversal              \r
173   * @retval HAL status\r
174   */                                   \r
175 HAL_StatusTypeDef HAL_CRCEx_Input_Data_Reverse(CRC_HandleTypeDef *hcrc, uint32_t InputReverseMode)\r
176 {  \r
177   /* Check the parameters */\r
178   assert_param(IS_CRC_INPUTDATA_INVERSION_MODE(InputReverseMode));\r
179   \r
180   /* Change CRC peripheral state */\r
181   hcrc->State = HAL_CRC_STATE_BUSY;\r
182 \r
183   /* set input data inversion mode */\r
184   MODIFY_REG(hcrc->Instance->CR, CRC_CR_REV_IN, InputReverseMode);    \r
185   /* Change CRC peripheral state */\r
186   hcrc->State = HAL_CRC_STATE_READY;\r
187   \r
188   /* Return function status */\r
189   return HAL_OK;\r
190 }\r
191 \r
192 /**\r
193   * @brief  Set the Reverse Output data mode.\r
194   * @param  hcrc: CRC handle\r
195   * @param  OutputReverseMode: Output Data inversion mode\r
196   *         This parameter can be one of the following values:\r
197   *          @arg CRC_OUTPUTDATA_INVERSION_DISABLE: no CRC inversion (default value)\r
198   *          @arg CRC_OUTPUTDATA_INVERSION_ENABLE: bit-level inversion (e.g for a 8-bit CRC: 0xB5 becomes 0xAD)\r
199   * @retval HAL status\r
200   */                                   \r
201 HAL_StatusTypeDef HAL_CRCEx_Output_Data_Reverse(CRC_HandleTypeDef *hcrc, uint32_t OutputReverseMode)\r
202 {\r
203   /* Check the parameters */\r
204   assert_param(IS_CRC_OUTPUTDATA_INVERSION_MODE(OutputReverseMode));\r
205   \r
206   /* Change CRC peripheral state */\r
207   hcrc->State = HAL_CRC_STATE_BUSY;\r
208 \r
209   /* set output data inversion mode */\r
210   MODIFY_REG(hcrc->Instance->CR, CRC_CR_REV_OUT, OutputReverseMode); \r
211       \r
212   /* Change CRC peripheral state */\r
213   hcrc->State = HAL_CRC_STATE_READY;\r
214   \r
215   /* Return function status */\r
216   return HAL_OK;\r
217 }\r
218 \r
219 \r
220 \r
221 \r
222 /**\r
223   * @}\r
224   */\r
225 \r
226 \r
227 /**\r
228   * @}\r
229   */\r
230 \r
231 \r
232 #endif /* HAL_CRC_MODULE_ENABLED */\r
233 /**\r
234   * @}\r
235   */\r
236 \r
237 /**\r
238   * @}\r
239   */\r
240 \r
241 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/\r
242 \r