Lancaster University's (short term!) clone of mbed-src for micro:bit. This is a copy of the github branch https://github.com/lancaster-university/mbed-classic

Fork of mbed-src by mbed official

Committer:
mbed_official
Date:
Fri Aug 14 13:15:17 2015 +0100
Revision:
610:813dcc80987e
Parent:
573:ad23fe03a082
Synchronized with git revision 6d84db41c6833e0b9b024741eb0616a5f62d5599

Full URL: https://github.com/mbedmicro/mbed/commit/6d84db41c6833e0b9b024741eb0616a5f62d5599/

DISCO_F746NG - Improvements

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 573:ad23fe03a082 1 /**
mbed_official 573:ad23fe03a082 2 ******************************************************************************
mbed_official 573:ad23fe03a082 3 * @file stm32f7xx_hal_crc.c
mbed_official 573:ad23fe03a082 4 * @author MCD Application Team
mbed_official 610:813dcc80987e 5 * @version V1.0.1
mbed_official 610:813dcc80987e 6 * @date 25-June-2015
mbed_official 573:ad23fe03a082 7 * @brief CRC HAL module driver.
mbed_official 573:ad23fe03a082 8 * This file provides firmware functions to manage the following
mbed_official 573:ad23fe03a082 9 * functionalities of the Cyclic Redundancy Check (CRC) peripheral:
mbed_official 573:ad23fe03a082 10 * + Initialization and de-initialization functions
mbed_official 573:ad23fe03a082 11 * + Peripheral Control functions
mbed_official 573:ad23fe03a082 12 * + Peripheral State functions
mbed_official 573:ad23fe03a082 13 *
mbed_official 573:ad23fe03a082 14 @verbatim
mbed_official 573:ad23fe03a082 15 ===============================================================================
mbed_official 573:ad23fe03a082 16 ##### CRC How to use this driver #####
mbed_official 573:ad23fe03a082 17 ===============================================================================
mbed_official 573:ad23fe03a082 18 [..]
mbed_official 573:ad23fe03a082 19
mbed_official 573:ad23fe03a082 20 (#) Enable CRC AHB clock using __HAL_RCC_CRC_CLK_ENABLE();
mbed_official 573:ad23fe03a082 21
mbed_official 573:ad23fe03a082 22 (#) Initialize CRC calculator
mbed_official 573:ad23fe03a082 23 (++) specify generating polynomial (IP default or non-default one)
mbed_official 573:ad23fe03a082 24 (++) specify initialization value (IP default or non-default one)
mbed_official 573:ad23fe03a082 25 (++) specify input data format
mbed_official 573:ad23fe03a082 26 (++) specify input or output data inversion mode if any
mbed_official 573:ad23fe03a082 27
mbed_official 573:ad23fe03a082 28 (#) Use HAL_CRC_Accumulate() function to compute the CRC value of the
mbed_official 573:ad23fe03a082 29 input data buffer starting with the previously computed CRC as
mbed_official 573:ad23fe03a082 30 initialization value
mbed_official 573:ad23fe03a082 31
mbed_official 573:ad23fe03a082 32 (#) Use HAL_CRC_Calculate() function to compute the CRC value of the
mbed_official 573:ad23fe03a082 33 input data buffer starting with the defined initialization value
mbed_official 573:ad23fe03a082 34 (default or non-default) to initiate CRC calculation
mbed_official 573:ad23fe03a082 35
mbed_official 573:ad23fe03a082 36 @endverbatim
mbed_official 573:ad23fe03a082 37 ******************************************************************************
mbed_official 573:ad23fe03a082 38 * @attention
mbed_official 573:ad23fe03a082 39 *
mbed_official 573:ad23fe03a082 40 * <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
mbed_official 573:ad23fe03a082 41 *
mbed_official 573:ad23fe03a082 42 * Redistribution and use in source and binary forms, with or without modification,
mbed_official 573:ad23fe03a082 43 * are permitted provided that the following conditions are met:
mbed_official 573:ad23fe03a082 44 * 1. Redistributions of source code must retain the above copyright notice,
mbed_official 573:ad23fe03a082 45 * this list of conditions and the following disclaimer.
mbed_official 573:ad23fe03a082 46 * 2. Redistributions in binary form must reproduce the above copyright notice,
mbed_official 573:ad23fe03a082 47 * this list of conditions and the following disclaimer in the documentation
mbed_official 573:ad23fe03a082 48 * and/or other materials provided with the distribution.
mbed_official 573:ad23fe03a082 49 * 3. Neither the name of STMicroelectronics nor the names of its contributors
mbed_official 573:ad23fe03a082 50 * may be used to endorse or promote products derived from this software
mbed_official 573:ad23fe03a082 51 * without specific prior written permission.
mbed_official 573:ad23fe03a082 52 *
mbed_official 573:ad23fe03a082 53 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
mbed_official 573:ad23fe03a082 54 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
mbed_official 573:ad23fe03a082 55 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
mbed_official 573:ad23fe03a082 56 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
mbed_official 573:ad23fe03a082 57 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
mbed_official 573:ad23fe03a082 58 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
mbed_official 573:ad23fe03a082 59 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
mbed_official 573:ad23fe03a082 60 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
mbed_official 573:ad23fe03a082 61 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
mbed_official 573:ad23fe03a082 62 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
mbed_official 573:ad23fe03a082 63 *
mbed_official 573:ad23fe03a082 64 ******************************************************************************
mbed_official 573:ad23fe03a082 65 */
mbed_official 573:ad23fe03a082 66
mbed_official 573:ad23fe03a082 67 /* Includes ------------------------------------------------------------------*/
mbed_official 573:ad23fe03a082 68 #include "stm32f7xx_hal.h"
mbed_official 573:ad23fe03a082 69
mbed_official 573:ad23fe03a082 70 /** @addtogroup STM32F7xx_HAL_Driver
mbed_official 573:ad23fe03a082 71 * @{
mbed_official 573:ad23fe03a082 72 */
mbed_official 573:ad23fe03a082 73
mbed_official 573:ad23fe03a082 74 /** @defgroup CRC CRC
mbed_official 573:ad23fe03a082 75 * @brief CRC HAL module driver.
mbed_official 573:ad23fe03a082 76 * @{
mbed_official 573:ad23fe03a082 77 */
mbed_official 573:ad23fe03a082 78
mbed_official 573:ad23fe03a082 79 #ifdef HAL_CRC_MODULE_ENABLED
mbed_official 573:ad23fe03a082 80
mbed_official 573:ad23fe03a082 81 /* Private typedef -----------------------------------------------------------*/
mbed_official 573:ad23fe03a082 82 /* Private define ------------------------------------------------------------*/
mbed_official 573:ad23fe03a082 83 /* Private macro -------------------------------------------------------------*/
mbed_official 573:ad23fe03a082 84 /* Private variables ---------------------------------------------------------*/
mbed_official 573:ad23fe03a082 85 /* Private function prototypes -----------------------------------------------*/
mbed_official 573:ad23fe03a082 86 static uint32_t CRC_Handle_8(CRC_HandleTypeDef *hcrc, uint8_t pBuffer[], uint32_t BufferLength);
mbed_official 573:ad23fe03a082 87 static uint32_t CRC_Handle_16(CRC_HandleTypeDef *hcrc, uint16_t pBuffer[], uint32_t BufferLength);
mbed_official 573:ad23fe03a082 88 /* Exported functions --------------------------------------------------------*/
mbed_official 573:ad23fe03a082 89
mbed_official 573:ad23fe03a082 90 /** @defgroup CRC_Exported_Functions CRC Exported Functions
mbed_official 573:ad23fe03a082 91 * @{
mbed_official 573:ad23fe03a082 92 */
mbed_official 573:ad23fe03a082 93
mbed_official 573:ad23fe03a082 94 /** @defgroup HAL_CRC_Group1 Initialization/de-initialization functions
mbed_official 573:ad23fe03a082 95 * @brief Initialization and Configuration functions.
mbed_official 573:ad23fe03a082 96 *
mbed_official 573:ad23fe03a082 97 @verbatim
mbed_official 573:ad23fe03a082 98 ===============================================================================
mbed_official 573:ad23fe03a082 99 ##### Initialization and de-initialization functions #####
mbed_official 573:ad23fe03a082 100 ===============================================================================
mbed_official 573:ad23fe03a082 101 [..] This section provides functions allowing to:
mbed_official 573:ad23fe03a082 102 (+) Initialize the CRC according to the specified parameters
mbed_official 573:ad23fe03a082 103 in the CRC_InitTypeDef and create the associated handle
mbed_official 573:ad23fe03a082 104 (+) DeInitialize the CRC peripheral
mbed_official 573:ad23fe03a082 105 (+) Initialize the CRC MSP
mbed_official 573:ad23fe03a082 106 (+) DeInitialize CRC MSP
mbed_official 573:ad23fe03a082 107
mbed_official 573:ad23fe03a082 108 @endverbatim
mbed_official 573:ad23fe03a082 109 * @{
mbed_official 573:ad23fe03a082 110 */
mbed_official 573:ad23fe03a082 111
mbed_official 573:ad23fe03a082 112 /**
mbed_official 573:ad23fe03a082 113 * @brief Initializes the CRC according to the specified
mbed_official 573:ad23fe03a082 114 * parameters in the CRC_InitTypeDef and creates the associated handle.
mbed_official 573:ad23fe03a082 115 * @param hcrc: CRC handle
mbed_official 573:ad23fe03a082 116 * @retval HAL status
mbed_official 573:ad23fe03a082 117 */
mbed_official 573:ad23fe03a082 118 HAL_StatusTypeDef HAL_CRC_Init(CRC_HandleTypeDef *hcrc)
mbed_official 573:ad23fe03a082 119 {
mbed_official 573:ad23fe03a082 120 /* Check the CRC handle allocation */
mbed_official 573:ad23fe03a082 121 if(hcrc == NULL)
mbed_official 573:ad23fe03a082 122 {
mbed_official 573:ad23fe03a082 123 return HAL_ERROR;
mbed_official 573:ad23fe03a082 124 }
mbed_official 573:ad23fe03a082 125
mbed_official 573:ad23fe03a082 126 /* Check the parameters */
mbed_official 573:ad23fe03a082 127 assert_param(IS_CRC_ALL_INSTANCE(hcrc->Instance));
mbed_official 573:ad23fe03a082 128
mbed_official 573:ad23fe03a082 129 if(hcrc->State == HAL_CRC_STATE_RESET)
mbed_official 573:ad23fe03a082 130 {
mbed_official 573:ad23fe03a082 131 /* Allocate lock resource and initialize it */
mbed_official 573:ad23fe03a082 132 hcrc->Lock = HAL_UNLOCKED;
mbed_official 573:ad23fe03a082 133 /* Init the low level hardware */
mbed_official 573:ad23fe03a082 134 HAL_CRC_MspInit(hcrc);
mbed_official 573:ad23fe03a082 135 }
mbed_official 573:ad23fe03a082 136
mbed_official 573:ad23fe03a082 137 /* Change CRC peripheral state */
mbed_official 573:ad23fe03a082 138 hcrc->State = HAL_CRC_STATE_BUSY;
mbed_official 573:ad23fe03a082 139
mbed_official 573:ad23fe03a082 140 /* check whether or not non-default generating polynomial has been
mbed_official 573:ad23fe03a082 141 * picked up by user */
mbed_official 573:ad23fe03a082 142 assert_param(IS_DEFAULT_POLYNOMIAL(hcrc->Init.DefaultPolynomialUse));
mbed_official 573:ad23fe03a082 143 if (hcrc->Init.DefaultPolynomialUse == DEFAULT_POLYNOMIAL_ENABLE)
mbed_official 573:ad23fe03a082 144 {
mbed_official 573:ad23fe03a082 145 /* initialize IP with default generating polynomial */
mbed_official 573:ad23fe03a082 146 WRITE_REG(hcrc->Instance->POL, DEFAULT_CRC32_POLY);
mbed_official 573:ad23fe03a082 147 MODIFY_REG(hcrc->Instance->CR, CRC_CR_POLYSIZE, CRC_POLYLENGTH_32B);
mbed_official 573:ad23fe03a082 148 }
mbed_official 573:ad23fe03a082 149 else
mbed_official 573:ad23fe03a082 150 {
mbed_official 573:ad23fe03a082 151 /* initialize CRC IP with generating polynomial defined by user */
mbed_official 573:ad23fe03a082 152 if (HAL_CRCEx_Polynomial_Set(hcrc, hcrc->Init.GeneratingPolynomial, hcrc->Init.CRCLength) != HAL_OK)
mbed_official 573:ad23fe03a082 153 {
mbed_official 573:ad23fe03a082 154 return HAL_ERROR;
mbed_official 573:ad23fe03a082 155 }
mbed_official 573:ad23fe03a082 156 }
mbed_official 573:ad23fe03a082 157
mbed_official 573:ad23fe03a082 158 /* check whether or not non-default CRC initial value has been
mbed_official 573:ad23fe03a082 159 * picked up by user */
mbed_official 573:ad23fe03a082 160 assert_param(IS_DEFAULT_INIT_VALUE(hcrc->Init.DefaultInitValueUse));
mbed_official 573:ad23fe03a082 161 if (hcrc->Init.DefaultInitValueUse == DEFAULT_INIT_VALUE_ENABLE)
mbed_official 573:ad23fe03a082 162 {
mbed_official 573:ad23fe03a082 163 WRITE_REG(hcrc->Instance->INIT, DEFAULT_CRC_INITVALUE);
mbed_official 573:ad23fe03a082 164 }
mbed_official 573:ad23fe03a082 165 else
mbed_official 573:ad23fe03a082 166 {
mbed_official 573:ad23fe03a082 167 WRITE_REG(hcrc->Instance->INIT, hcrc->Init.InitValue);
mbed_official 573:ad23fe03a082 168 }
mbed_official 573:ad23fe03a082 169
mbed_official 573:ad23fe03a082 170
mbed_official 573:ad23fe03a082 171 /* set input data inversion mode */
mbed_official 573:ad23fe03a082 172 assert_param(IS_CRC_INPUTDATA_INVERSION_MODE(hcrc->Init.InputDataInversionMode));
mbed_official 573:ad23fe03a082 173 MODIFY_REG(hcrc->Instance->CR, CRC_CR_REV_IN, hcrc->Init.InputDataInversionMode);
mbed_official 573:ad23fe03a082 174
mbed_official 573:ad23fe03a082 175 /* set output data inversion mode */
mbed_official 573:ad23fe03a082 176 assert_param(IS_CRC_OUTPUTDATA_INVERSION_MODE(hcrc->Init.OutputDataInversionMode));
mbed_official 573:ad23fe03a082 177 MODIFY_REG(hcrc->Instance->CR, CRC_CR_REV_OUT, hcrc->Init.OutputDataInversionMode);
mbed_official 573:ad23fe03a082 178
mbed_official 573:ad23fe03a082 179 /* makes sure the input data format (bytes, halfwords or words stream)
mbed_official 573:ad23fe03a082 180 * is properly specified by user */
mbed_official 573:ad23fe03a082 181 assert_param(IS_CRC_INPUTDATA_FORMAT(hcrc->InputDataFormat));
mbed_official 573:ad23fe03a082 182
mbed_official 573:ad23fe03a082 183 /* Change CRC peripheral state */
mbed_official 573:ad23fe03a082 184 hcrc->State = HAL_CRC_STATE_READY;
mbed_official 573:ad23fe03a082 185
mbed_official 573:ad23fe03a082 186 /* Return function status */
mbed_official 573:ad23fe03a082 187 return HAL_OK;
mbed_official 573:ad23fe03a082 188 }
mbed_official 573:ad23fe03a082 189
mbed_official 573:ad23fe03a082 190 /**
mbed_official 573:ad23fe03a082 191 * @brief DeInitializes the CRC peripheral.
mbed_official 573:ad23fe03a082 192 * @param hcrc: CRC handle
mbed_official 573:ad23fe03a082 193 * @retval HAL status
mbed_official 573:ad23fe03a082 194 */
mbed_official 573:ad23fe03a082 195 HAL_StatusTypeDef HAL_CRC_DeInit(CRC_HandleTypeDef *hcrc)
mbed_official 573:ad23fe03a082 196 {
mbed_official 573:ad23fe03a082 197 /* Check the CRC handle allocation */
mbed_official 573:ad23fe03a082 198 if(hcrc == NULL)
mbed_official 573:ad23fe03a082 199 {
mbed_official 573:ad23fe03a082 200 return HAL_ERROR;
mbed_official 573:ad23fe03a082 201 }
mbed_official 573:ad23fe03a082 202
mbed_official 573:ad23fe03a082 203 /* Check the parameters */
mbed_official 573:ad23fe03a082 204 assert_param(IS_CRC_ALL_INSTANCE(hcrc->Instance));
mbed_official 573:ad23fe03a082 205
mbed_official 573:ad23fe03a082 206 /* Check the CRC peripheral state */
mbed_official 573:ad23fe03a082 207 if(hcrc->State == HAL_CRC_STATE_BUSY)
mbed_official 573:ad23fe03a082 208 {
mbed_official 573:ad23fe03a082 209 return HAL_BUSY;
mbed_official 573:ad23fe03a082 210 }
mbed_official 573:ad23fe03a082 211
mbed_official 573:ad23fe03a082 212 /* Change CRC peripheral state */
mbed_official 573:ad23fe03a082 213 hcrc->State = HAL_CRC_STATE_BUSY;
mbed_official 573:ad23fe03a082 214
mbed_official 573:ad23fe03a082 215 /* Reset CRC calculation unit */
mbed_official 573:ad23fe03a082 216 __HAL_CRC_DR_RESET(hcrc);
mbed_official 573:ad23fe03a082 217
mbed_official 573:ad23fe03a082 218 /* DeInit the low level hardware */
mbed_official 573:ad23fe03a082 219 HAL_CRC_MspDeInit(hcrc);
mbed_official 573:ad23fe03a082 220
mbed_official 573:ad23fe03a082 221 /* Change CRC peripheral state */
mbed_official 573:ad23fe03a082 222 hcrc->State = HAL_CRC_STATE_RESET;
mbed_official 573:ad23fe03a082 223
mbed_official 573:ad23fe03a082 224 /* Process unlocked */
mbed_official 573:ad23fe03a082 225 __HAL_UNLOCK(hcrc);
mbed_official 573:ad23fe03a082 226
mbed_official 573:ad23fe03a082 227 /* Return function status */
mbed_official 573:ad23fe03a082 228 return HAL_OK;
mbed_official 573:ad23fe03a082 229 }
mbed_official 573:ad23fe03a082 230
mbed_official 573:ad23fe03a082 231 /**
mbed_official 573:ad23fe03a082 232 * @brief Initializes the CRC MSP.
mbed_official 573:ad23fe03a082 233 * @param hcrc: CRC handle
mbed_official 573:ad23fe03a082 234 * @retval None
mbed_official 573:ad23fe03a082 235 */
mbed_official 573:ad23fe03a082 236 __weak void HAL_CRC_MspInit(CRC_HandleTypeDef *hcrc)
mbed_official 573:ad23fe03a082 237 {
mbed_official 573:ad23fe03a082 238 /* NOTE : This function should not be modified, when the callback is needed,
mbed_official 573:ad23fe03a082 239 the HAL_CRC_MspInit can be implemented in the user file
mbed_official 573:ad23fe03a082 240 */
mbed_official 573:ad23fe03a082 241 }
mbed_official 573:ad23fe03a082 242
mbed_official 573:ad23fe03a082 243 /**
mbed_official 573:ad23fe03a082 244 * @brief DeInitializes the CRC MSP.
mbed_official 573:ad23fe03a082 245 * @param hcrc: CRC handle
mbed_official 573:ad23fe03a082 246 * @retval None
mbed_official 573:ad23fe03a082 247 */
mbed_official 573:ad23fe03a082 248 __weak void HAL_CRC_MspDeInit(CRC_HandleTypeDef *hcrc)
mbed_official 573:ad23fe03a082 249 {
mbed_official 573:ad23fe03a082 250 /* NOTE : This function should not be modified, when the callback is needed,
mbed_official 573:ad23fe03a082 251 the HAL_CRC_MspDeInit can be implemented in the user file
mbed_official 573:ad23fe03a082 252 */
mbed_official 573:ad23fe03a082 253 }
mbed_official 573:ad23fe03a082 254
mbed_official 573:ad23fe03a082 255 /**
mbed_official 573:ad23fe03a082 256 * @}
mbed_official 573:ad23fe03a082 257 */
mbed_official 573:ad23fe03a082 258
mbed_official 573:ad23fe03a082 259 /** @defgroup HAL_CRC_Group2 Peripheral Control functions
mbed_official 573:ad23fe03a082 260 * @brief Peripheral Control functions
mbed_official 573:ad23fe03a082 261 *
mbed_official 573:ad23fe03a082 262 @verbatim
mbed_official 573:ad23fe03a082 263 ==============================================================================
mbed_official 573:ad23fe03a082 264 ##### Peripheral Control functions #####
mbed_official 573:ad23fe03a082 265 ==============================================================================
mbed_official 573:ad23fe03a082 266 [..] This section provides functions allowing to:
mbed_official 573:ad23fe03a082 267 (+) Compute the 7, 8, 16 or 32-bit CRC value of an 8, 16 or 32-bit data buffer
mbed_official 573:ad23fe03a082 268 using combination of the previous CRC value and the new one.
mbed_official 573:ad23fe03a082 269
mbed_official 573:ad23fe03a082 270 or
mbed_official 573:ad23fe03a082 271
mbed_official 573:ad23fe03a082 272 (+) Compute the 7, 8, 16 or 32-bit CRC value of an 8, 16 or 32-bit data buffer
mbed_official 573:ad23fe03a082 273 independently of the previous CRC value.
mbed_official 573:ad23fe03a082 274
mbed_official 573:ad23fe03a082 275 @endverbatim
mbed_official 573:ad23fe03a082 276 * @{
mbed_official 573:ad23fe03a082 277 */
mbed_official 573:ad23fe03a082 278
mbed_official 573:ad23fe03a082 279 /**
mbed_official 573:ad23fe03a082 280 * @brief Compute the 7, 8, 16 or 32-bit CRC value of an 8, 16 or 32-bit data buffer
mbed_official 573:ad23fe03a082 281 * starting with the previously computed CRC as initialization value.
mbed_official 573:ad23fe03a082 282 * @param hcrc: CRC handle
mbed_official 573:ad23fe03a082 283 * @param pBuffer: pointer to the input data buffer, exact input data format is
mbed_official 573:ad23fe03a082 284 * provided by hcrc->InputDataFormat.
mbed_official 573:ad23fe03a082 285 * @param BufferLength: input data buffer length
mbed_official 573:ad23fe03a082 286 * @retval uint32_t CRC (returned value LSBs for CRC shorter than 32 bits)
mbed_official 573:ad23fe03a082 287 */
mbed_official 573:ad23fe03a082 288 uint32_t HAL_CRC_Accumulate(CRC_HandleTypeDef *hcrc, uint32_t pBuffer[], uint32_t BufferLength)
mbed_official 573:ad23fe03a082 289 {
mbed_official 573:ad23fe03a082 290 uint32_t index = 0; /* CRC input data buffer index */
mbed_official 573:ad23fe03a082 291 uint32_t temp = 0; /* CRC output (read from hcrc->Instance->DR register) */
mbed_official 573:ad23fe03a082 292
mbed_official 573:ad23fe03a082 293 /* Process locked */
mbed_official 573:ad23fe03a082 294 __HAL_LOCK(hcrc);
mbed_official 573:ad23fe03a082 295
mbed_official 573:ad23fe03a082 296 /* Change CRC peripheral state */
mbed_official 573:ad23fe03a082 297 hcrc->State = HAL_CRC_STATE_BUSY;
mbed_official 573:ad23fe03a082 298
mbed_official 573:ad23fe03a082 299 switch (hcrc->InputDataFormat)
mbed_official 573:ad23fe03a082 300 {
mbed_official 573:ad23fe03a082 301 case CRC_INPUTDATA_FORMAT_WORDS:
mbed_official 573:ad23fe03a082 302 /* Enter Data to the CRC calculator */
mbed_official 573:ad23fe03a082 303 for(index = 0; index < BufferLength; index++)
mbed_official 573:ad23fe03a082 304 {
mbed_official 573:ad23fe03a082 305 hcrc->Instance->DR = pBuffer[index];
mbed_official 573:ad23fe03a082 306 }
mbed_official 573:ad23fe03a082 307 temp = hcrc->Instance->DR;
mbed_official 573:ad23fe03a082 308 break;
mbed_official 573:ad23fe03a082 309
mbed_official 573:ad23fe03a082 310 case CRC_INPUTDATA_FORMAT_BYTES:
mbed_official 573:ad23fe03a082 311 temp = CRC_Handle_8(hcrc, (uint8_t*)pBuffer, BufferLength);
mbed_official 573:ad23fe03a082 312 break;
mbed_official 573:ad23fe03a082 313
mbed_official 573:ad23fe03a082 314 case CRC_INPUTDATA_FORMAT_HALFWORDS:
mbed_official 573:ad23fe03a082 315 temp = CRC_Handle_16(hcrc, (uint16_t*)pBuffer, BufferLength);
mbed_official 573:ad23fe03a082 316 break;
mbed_official 573:ad23fe03a082 317 default:
mbed_official 573:ad23fe03a082 318 break;
mbed_official 573:ad23fe03a082 319 }
mbed_official 573:ad23fe03a082 320
mbed_official 573:ad23fe03a082 321 /* Change CRC peripheral state */
mbed_official 573:ad23fe03a082 322 hcrc->State = HAL_CRC_STATE_READY;
mbed_official 573:ad23fe03a082 323
mbed_official 573:ad23fe03a082 324 /* Process unlocked */
mbed_official 573:ad23fe03a082 325 __HAL_UNLOCK(hcrc);
mbed_official 573:ad23fe03a082 326
mbed_official 573:ad23fe03a082 327 /* Return the CRC computed value */
mbed_official 573:ad23fe03a082 328 return temp;
mbed_official 573:ad23fe03a082 329 }
mbed_official 573:ad23fe03a082 330
mbed_official 573:ad23fe03a082 331
mbed_official 573:ad23fe03a082 332 /**
mbed_official 573:ad23fe03a082 333 * @brief Compute the 7, 8, 16 or 32-bit CRC value of an 8, 16 or 32-bit data buffer
mbed_official 573:ad23fe03a082 334 * starting with hcrc->Instance->INIT as initialization value.
mbed_official 573:ad23fe03a082 335 * @param hcrc: CRC handle
mbed_official 573:ad23fe03a082 336 * @param pBuffer: pointer to the input data buffer, exact input data format is
mbed_official 573:ad23fe03a082 337 * provided by hcrc->InputDataFormat.
mbed_official 573:ad23fe03a082 338 * @param BufferLength: input data buffer length
mbed_official 573:ad23fe03a082 339 * @retval uint32_t CRC (returned value LSBs for CRC shorter than 32 bits)
mbed_official 573:ad23fe03a082 340 */
mbed_official 573:ad23fe03a082 341 uint32_t HAL_CRC_Calculate(CRC_HandleTypeDef *hcrc, uint32_t pBuffer[], uint32_t BufferLength)
mbed_official 573:ad23fe03a082 342 {
mbed_official 573:ad23fe03a082 343 uint32_t index = 0; /* CRC input data buffer index */
mbed_official 573:ad23fe03a082 344 uint32_t temp = 0; /* CRC output (read from hcrc->Instance->DR register) */
mbed_official 573:ad23fe03a082 345
mbed_official 573:ad23fe03a082 346 /* Process locked */
mbed_official 573:ad23fe03a082 347 __HAL_LOCK(hcrc);
mbed_official 573:ad23fe03a082 348
mbed_official 573:ad23fe03a082 349 /* Change CRC peripheral state */
mbed_official 573:ad23fe03a082 350 hcrc->State = HAL_CRC_STATE_BUSY;
mbed_official 573:ad23fe03a082 351
mbed_official 573:ad23fe03a082 352 /* Reset CRC Calculation Unit (hcrc->Instance->INIT is
mbed_official 573:ad23fe03a082 353 * written in hcrc->Instance->DR) */
mbed_official 573:ad23fe03a082 354 __HAL_CRC_DR_RESET(hcrc);
mbed_official 573:ad23fe03a082 355
mbed_official 573:ad23fe03a082 356 switch (hcrc->InputDataFormat)
mbed_official 573:ad23fe03a082 357 {
mbed_official 573:ad23fe03a082 358 case CRC_INPUTDATA_FORMAT_WORDS:
mbed_official 573:ad23fe03a082 359 /* Enter 32-bit input data to the CRC calculator */
mbed_official 573:ad23fe03a082 360 for(index = 0; index < BufferLength; index++)
mbed_official 573:ad23fe03a082 361 {
mbed_official 573:ad23fe03a082 362 hcrc->Instance->DR = pBuffer[index];
mbed_official 573:ad23fe03a082 363 }
mbed_official 573:ad23fe03a082 364 temp = hcrc->Instance->DR;
mbed_official 573:ad23fe03a082 365 break;
mbed_official 573:ad23fe03a082 366
mbed_official 573:ad23fe03a082 367 case CRC_INPUTDATA_FORMAT_BYTES:
mbed_official 573:ad23fe03a082 368 /* Specific 8-bit input data handling */
mbed_official 573:ad23fe03a082 369 temp = CRC_Handle_8(hcrc, (uint8_t*)pBuffer, BufferLength);
mbed_official 573:ad23fe03a082 370 break;
mbed_official 573:ad23fe03a082 371
mbed_official 573:ad23fe03a082 372 case CRC_INPUTDATA_FORMAT_HALFWORDS:
mbed_official 573:ad23fe03a082 373 /* Specific 16-bit input data handling */
mbed_official 573:ad23fe03a082 374 temp = CRC_Handle_16(hcrc, (uint16_t*)pBuffer, BufferLength);
mbed_official 573:ad23fe03a082 375 break;
mbed_official 573:ad23fe03a082 376 default:
mbed_official 573:ad23fe03a082 377 break;
mbed_official 573:ad23fe03a082 378 }
mbed_official 573:ad23fe03a082 379
mbed_official 573:ad23fe03a082 380 /* Change CRC peripheral state */
mbed_official 573:ad23fe03a082 381 hcrc->State = HAL_CRC_STATE_READY;
mbed_official 573:ad23fe03a082 382
mbed_official 573:ad23fe03a082 383 /* Process unlocked */
mbed_official 573:ad23fe03a082 384 __HAL_UNLOCK(hcrc);
mbed_official 573:ad23fe03a082 385
mbed_official 573:ad23fe03a082 386 /* Return the CRC computed value */
mbed_official 573:ad23fe03a082 387 return temp;
mbed_official 573:ad23fe03a082 388 }
mbed_official 573:ad23fe03a082 389
mbed_official 573:ad23fe03a082 390
mbed_official 573:ad23fe03a082 391
mbed_official 573:ad23fe03a082 392 /**
mbed_official 573:ad23fe03a082 393 * @brief Enter 8-bit input data to the CRC calculator.
mbed_official 573:ad23fe03a082 394 * Specific data handling to optimize processing time.
mbed_official 573:ad23fe03a082 395 * @param hcrc: CRC handle
mbed_official 573:ad23fe03a082 396 * @param pBuffer: pointer to the input data buffer
mbed_official 573:ad23fe03a082 397 * @param BufferLength: input data buffer length
mbed_official 573:ad23fe03a082 398 * @retval uint32_t CRC (returned value LSBs for CRC shorter than 32 bits)
mbed_official 573:ad23fe03a082 399 */
mbed_official 573:ad23fe03a082 400 static uint32_t CRC_Handle_8(CRC_HandleTypeDef *hcrc, uint8_t pBuffer[], uint32_t BufferLength)
mbed_official 573:ad23fe03a082 401 {
mbed_official 573:ad23fe03a082 402 uint32_t i = 0; /* input data buffer index */
mbed_official 573:ad23fe03a082 403
mbed_official 573:ad23fe03a082 404 /* Processing time optimization: 4 bytes are entered in a row with a single word write,
mbed_official 573:ad23fe03a082 405 * last bytes must be carefully fed to the CRC calculator to ensure a correct type
mbed_official 573:ad23fe03a082 406 * handling by the IP */
mbed_official 573:ad23fe03a082 407 for(i = 0; i < (BufferLength/4); i++)
mbed_official 573:ad23fe03a082 408 {
mbed_official 573:ad23fe03a082 409 hcrc->Instance->DR = (uint32_t)(((uint32_t)(pBuffer[4*i])<<24) | ((uint32_t)(pBuffer[4*i+1])<<16) | ((uint32_t)(pBuffer[4*i+2])<<8) | (uint32_t)(pBuffer[4*i+3]));
mbed_official 573:ad23fe03a082 410 }
mbed_official 573:ad23fe03a082 411 /* last bytes specific handling */
mbed_official 573:ad23fe03a082 412 if ((BufferLength%4) != 0)
mbed_official 573:ad23fe03a082 413 {
mbed_official 573:ad23fe03a082 414 if (BufferLength%4 == 1)
mbed_official 573:ad23fe03a082 415 {
mbed_official 573:ad23fe03a082 416 *(__IO uint8_t*) (&hcrc->Instance->DR) = pBuffer[4*i];
mbed_official 573:ad23fe03a082 417 }
mbed_official 573:ad23fe03a082 418 if (BufferLength%4 == 2)
mbed_official 573:ad23fe03a082 419 {
mbed_official 573:ad23fe03a082 420 *(__IO uint32_t*) (&hcrc->Instance->DR) = (uint16_t)(((uint32_t)(pBuffer[4*i])<<8) | (uint32_t)(pBuffer[4*i+1]));
mbed_official 573:ad23fe03a082 421 }
mbed_official 573:ad23fe03a082 422 if (BufferLength%4 == 3)
mbed_official 573:ad23fe03a082 423 {
mbed_official 573:ad23fe03a082 424 *(__IO uint32_t*) (&hcrc->Instance->DR) = (uint16_t)(((uint32_t)(pBuffer[4*i])<<8) | (uint32_t)(pBuffer[4*i+1]));
mbed_official 573:ad23fe03a082 425 *(__IO uint32_t*) (&hcrc->Instance->DR) = pBuffer[4*i+2];
mbed_official 573:ad23fe03a082 426 }
mbed_official 573:ad23fe03a082 427 }
mbed_official 573:ad23fe03a082 428
mbed_official 573:ad23fe03a082 429 /* Return the CRC computed value */
mbed_official 573:ad23fe03a082 430 return hcrc->Instance->DR;
mbed_official 573:ad23fe03a082 431 }
mbed_official 573:ad23fe03a082 432
mbed_official 573:ad23fe03a082 433
mbed_official 573:ad23fe03a082 434
mbed_official 573:ad23fe03a082 435 /**
mbed_official 573:ad23fe03a082 436 * @brief Enter 16-bit input data to the CRC calculator.
mbed_official 573:ad23fe03a082 437 * Specific data handling to optimize processing time.
mbed_official 573:ad23fe03a082 438 * @param hcrc: CRC handle
mbed_official 573:ad23fe03a082 439 * @param pBuffer: pointer to the input data buffer
mbed_official 573:ad23fe03a082 440 * @param BufferLength: input data buffer length
mbed_official 573:ad23fe03a082 441 * @retval uint32_t CRC (returned value LSBs for CRC shorter than 32 bits)
mbed_official 573:ad23fe03a082 442 */
mbed_official 573:ad23fe03a082 443 static uint32_t CRC_Handle_16(CRC_HandleTypeDef *hcrc, uint16_t pBuffer[], uint32_t BufferLength)
mbed_official 573:ad23fe03a082 444 {
mbed_official 573:ad23fe03a082 445 uint32_t i = 0; /* input data buffer index */
mbed_official 573:ad23fe03a082 446
mbed_official 573:ad23fe03a082 447 /* Processing time optimization: 2 HalfWords are entered in a row with a single word write,
mbed_official 573:ad23fe03a082 448 * in case of odd length, last HalfWord must be carefully fed to the CRC calculator to ensure
mbed_official 573:ad23fe03a082 449 * a correct type handling by the IP */
mbed_official 573:ad23fe03a082 450 for(i = 0; i < (BufferLength/2); i++)
mbed_official 573:ad23fe03a082 451 {
mbed_official 573:ad23fe03a082 452 hcrc->Instance->DR = (((uint32_t)(pBuffer[2*i])<<16) | (uint32_t)(pBuffer[2*i+1]));
mbed_official 573:ad23fe03a082 453 }
mbed_official 573:ad23fe03a082 454 if ((BufferLength%2) != 0)
mbed_official 573:ad23fe03a082 455 {
mbed_official 573:ad23fe03a082 456 *(__IO uint32_t*) (&hcrc->Instance->DR) = pBuffer[2*i];
mbed_official 573:ad23fe03a082 457 }
mbed_official 573:ad23fe03a082 458
mbed_official 573:ad23fe03a082 459 /* Return the CRC computed value */
mbed_official 573:ad23fe03a082 460 return hcrc->Instance->DR;
mbed_official 573:ad23fe03a082 461 }
mbed_official 573:ad23fe03a082 462
mbed_official 573:ad23fe03a082 463 /**
mbed_official 573:ad23fe03a082 464 * @}
mbed_official 573:ad23fe03a082 465 */
mbed_official 573:ad23fe03a082 466
mbed_official 573:ad23fe03a082 467 /** @defgroup HAL_CRC_Group3 Peripheral State functions
mbed_official 573:ad23fe03a082 468 * @brief Peripheral State functions.
mbed_official 573:ad23fe03a082 469 *
mbed_official 573:ad23fe03a082 470 @verbatim
mbed_official 573:ad23fe03a082 471 ==============================================================================
mbed_official 573:ad23fe03a082 472 ##### Peripheral State functions #####
mbed_official 573:ad23fe03a082 473 ==============================================================================
mbed_official 573:ad23fe03a082 474 [..]
mbed_official 573:ad23fe03a082 475 This subsection permits to get in run-time the status of the peripheral
mbed_official 573:ad23fe03a082 476 and the data flow.
mbed_official 573:ad23fe03a082 477
mbed_official 573:ad23fe03a082 478 @endverbatim
mbed_official 573:ad23fe03a082 479 * @{
mbed_official 573:ad23fe03a082 480 */
mbed_official 573:ad23fe03a082 481
mbed_official 573:ad23fe03a082 482 /**
mbed_official 573:ad23fe03a082 483 * @brief Returns the CRC state.
mbed_official 573:ad23fe03a082 484 * @param hcrc: CRC handle
mbed_official 573:ad23fe03a082 485 * @retval HAL state
mbed_official 573:ad23fe03a082 486 */
mbed_official 573:ad23fe03a082 487 HAL_CRC_StateTypeDef HAL_CRC_GetState(CRC_HandleTypeDef *hcrc)
mbed_official 573:ad23fe03a082 488 {
mbed_official 573:ad23fe03a082 489 return hcrc->State;
mbed_official 573:ad23fe03a082 490 }
mbed_official 573:ad23fe03a082 491
mbed_official 573:ad23fe03a082 492 /**
mbed_official 573:ad23fe03a082 493 * @}
mbed_official 573:ad23fe03a082 494 */
mbed_official 573:ad23fe03a082 495
mbed_official 573:ad23fe03a082 496 /**
mbed_official 573:ad23fe03a082 497 * @}
mbed_official 573:ad23fe03a082 498 */
mbed_official 573:ad23fe03a082 499
mbed_official 573:ad23fe03a082 500 #endif /* HAL_CRC_MODULE_ENABLED */
mbed_official 573:ad23fe03a082 501 /**
mbed_official 573:ad23fe03a082 502 * @}
mbed_official 573:ad23fe03a082 503 */
mbed_official 573:ad23fe03a082 504
mbed_official 573:ad23fe03a082 505 /**
mbed_official 573:ad23fe03a082 506 * @}
mbed_official 573:ad23fe03a082 507 */
mbed_official 573:ad23fe03a082 508
mbed_official 573:ad23fe03a082 509 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/