Subversion Repositories LedShow

Rev

Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. /**
  2.   ******************************************************************************
  3.   * @file    stm32f1xx_hal_crc.c
  4.   * @author  MCD Application Team
  5.   * @brief   CRC HAL module driver.
  6.   *          This file provides firmware functions to manage the following
  7.   *          functionalities of the Cyclic Redundancy Check (CRC) peripheral:
  8.   *           + Initialization and de-initialization functions
  9.   *           + Peripheral Control functions
  10.   *           + Peripheral State functions
  11.   *
  12.   @verbatim
  13.   ==============================================================================
  14.                      ##### How to use this driver #####
  15.   ==============================================================================
  16.     [..]
  17.       The CRC HAL driver can be used as follows:
  18.  
  19.       (#) Enable CRC AHB clock using __HAL_RCC_CRC_CLK_ENABLE();
  20.  
  21.       (#) Use HAL_CRC_Accumulate() function to compute the CRC value of
  22.           a 32-bit data buffer using combination of the previous CRC value
  23.           and the new one.
  24.  
  25.       (#) Use HAL_CRC_Calculate() function to compute the CRC Value of
  26.           a new 32-bit data buffer. This function resets the CRC computation  
  27.           unit before starting the computation to avoid getting wrong CRC values.
  28.  
  29.   @endverbatim
  30.   ******************************************************************************
  31.   * @attention
  32.   *
  33.   * <h2><center>&copy; COPYRIGHT(c) 2016 STMicroelectronics</center></h2>
  34.   *
  35.   * Redistribution and use in source and binary forms, with or without modification,
  36.   * are permitted provided that the following conditions are met:
  37.   *   1. Redistributions of source code must retain the above copyright notice,
  38.   *      this list of conditions and the following disclaimer.
  39.   *   2. Redistributions in binary form must reproduce the above copyright notice,
  40.   *      this list of conditions and the following disclaimer in the documentation
  41.   *      and/or other materials provided with the distribution.
  42.   *   3. Neither the name of STMicroelectronics nor the names of its contributors
  43.   *      may be used to endorse or promote products derived from this software
  44.   *      without specific prior written permission.
  45.   *
  46.   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  47.   * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  48.   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  49.   * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
  50.   * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  51.   * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  52.   * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  53.   * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  54.   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  55.   * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  56.   *
  57.   ******************************************************************************
  58.   */
  59.  
  60. /* Includes ------------------------------------------------------------------*/
  61. #include "stm32f1xx_hal.h"
  62.  
  63. /** @addtogroup STM32F1xx_HAL_Driver
  64.   * @{
  65.   */
  66.  
  67. /** @defgroup CRC CRC
  68.   * @brief CRC HAL module driver.
  69.   * @{
  70.   */
  71.  
  72. #ifdef HAL_CRC_MODULE_ENABLED
  73.  
  74. /* Private typedef -----------------------------------------------------------*/
  75. /* Private define ------------------------------------------------------------*/
  76. /* Private macro -------------------------------------------------------------*/
  77. /* Private variables ---------------------------------------------------------*/
  78. /* Private function prototypes -----------------------------------------------*/
  79. /* Private functions ---------------------------------------------------------*/
  80.  
  81. /** @defgroup CRC_Exported_Functions CRC Exported Functions
  82.   * @{
  83.   */
  84.  
  85. /** @defgroup CRC_Exported_Functions_Group1 Initialization and de-initialization functions
  86.  *  @brief    Initialization and Configuration functions.
  87.  *
  88. @verbatim    
  89.   ==============================================================================
  90.             ##### Initialization and de-initialization functions #####
  91.   ==============================================================================
  92.     [..]  This section provides functions allowing to:
  93.       (+) Initialize the CRC according to the specified parameters
  94.           in the CRC_InitTypeDef and create the associated handle
  95.       (+) DeInitialize the CRC peripheral
  96.       (+) Initialize the CRC MSP
  97.       (+) DeInitialize CRC MSP
  98.  
  99. @endverbatim
  100.   * @{
  101.   */
  102.  
  103. /**
  104.   * @brief  Initializes the CRC according to the specified
  105.   *         parameters in the CRC_InitTypeDef and creates the associated handle.
  106.   * @param  hcrc: pointer to a CRC_HandleTypeDef structure that contains
  107.   *         the configuration information for CRC
  108.   * @retval HAL status
  109.   */
  110. HAL_StatusTypeDef HAL_CRC_Init(CRC_HandleTypeDef *hcrc)
  111. {
  112.   /* Check the CRC handle allocation */
  113.   if(hcrc == NULL)
  114.   {
  115.     return HAL_ERROR;
  116.   }
  117.  
  118.   /* Check the parameters */
  119.   assert_param(IS_CRC_ALL_INSTANCE(hcrc->Instance));
  120.  
  121.   if(hcrc->State == HAL_CRC_STATE_RESET)
  122.   {
  123.     /* Allocate lock resource and initialize it */
  124.     hcrc->Lock = HAL_UNLOCKED;
  125.    
  126.     /* Init the low level hardware */
  127.     HAL_CRC_MspInit(hcrc);
  128.   }
  129.  
  130.   /* Change CRC peripheral state */
  131.   hcrc->State = HAL_CRC_STATE_READY;
  132.  
  133.   /* Return function status */
  134.   return HAL_OK;
  135. }
  136.  
  137. /**
  138.   * @brief  DeInitializes the CRC peripheral.
  139.   * @param  hcrc: pointer to a CRC_HandleTypeDef structure that contains
  140.   *         the configuration information for CRC
  141.   * @retval HAL status
  142.   */
  143. HAL_StatusTypeDef HAL_CRC_DeInit(CRC_HandleTypeDef *hcrc)
  144. {
  145.   /* Check the CRC handle allocation */
  146.   if(hcrc == NULL)
  147.   {
  148.     return HAL_ERROR;
  149.   }
  150.  
  151.   /* Check the parameters */
  152.   assert_param(IS_CRC_ALL_INSTANCE(hcrc->Instance));
  153.  
  154.   /* Change CRC peripheral state */
  155.   hcrc->State = HAL_CRC_STATE_BUSY;
  156.  
  157.   /* DeInit the low level hardware */
  158.   HAL_CRC_MspDeInit(hcrc);
  159.  
  160.   /* Resets the CRC calculation unit and sets the data register to 0xFFFF FFFF */
  161.   __HAL_CRC_DR_RESET(hcrc);
  162.  
  163.   /* Reset IDR register content */
  164.   CLEAR_BIT(hcrc->Instance->IDR, CRC_IDR_IDR);
  165.  
  166.   /* Change CRC peripheral state */
  167.   hcrc->State = HAL_CRC_STATE_RESET;
  168.  
  169.   /* Release Lock */
  170.   __HAL_UNLOCK(hcrc);
  171.  
  172.   /* Return function status */
  173.   return HAL_OK;
  174. }
  175.  
  176. /**
  177.   * @brief  Initializes the CRC MSP.
  178.   * @param  hcrc: pointer to a CRC_HandleTypeDef structure that contains
  179.   *         the configuration information for CRC
  180.   * @retval None
  181.   */
  182. __weak void HAL_CRC_MspInit(CRC_HandleTypeDef *hcrc)
  183. {
  184.   /* Prevent unused argument(s) compilation warning */
  185.   UNUSED(hcrc);
  186.   /* NOTE : This function Should not be modified, when the callback is needed,
  187.             the HAL_CRC_MspInit could be implemented in the user file
  188.    */
  189. }
  190.  
  191. /**
  192.   * @brief  DeInitializes the CRC MSP.
  193.   * @param  hcrc: pointer to a CRC_HandleTypeDef structure that contains
  194.   *         the configuration information for CRC
  195.   * @retval None
  196.   */
  197. __weak void HAL_CRC_MspDeInit(CRC_HandleTypeDef *hcrc)
  198. {
  199.   /* Prevent unused argument(s) compilation warning */
  200.   UNUSED(hcrc);
  201.   /* NOTE : This function Should not be modified, when the callback is needed,
  202.             the HAL_CRC_MspDeInit could be implemented in the user file
  203.    */
  204. }
  205.  
  206. /**
  207.   * @}
  208.   */
  209.  
  210. /** @defgroup CRC_Exported_Functions_Group2 Peripheral Control functions
  211.  *  @brief    management functions.
  212.  *
  213. @verbatim  
  214.   ==============================================================================
  215.                       ##### Peripheral Control functions #####
  216.   ==============================================================================  
  217.     [..]  This section provides functions allowing to:
  218.       (+) Compute the 32-bit CRC value of 32-bit data buffer,
  219.           using combination of the previous CRC value and the new one.
  220.       (+) Compute the 32-bit CRC value of 32-bit data buffer,
  221.           independently of the previous CRC value.
  222.  
  223. @endverbatim
  224.   * @{
  225.   */
  226.  
  227. /**
  228.   * @brief  Computes the 32-bit CRC of 32-bit data buffer using combination
  229.   *         of the previous CRC value and the new one.
  230.   * @param  hcrc: pointer to a CRC_HandleTypeDef structure that contains
  231.   *         the configuration information for CRC
  232.   * @param  pBuffer: pointer to the buffer containing the data to be computed
  233.   * @param  BufferLength: length of the buffer to be computed (defined in word, 4 bytes)
  234.   * @retval 32-bit CRC
  235.   */
  236. uint32_t HAL_CRC_Accumulate(CRC_HandleTypeDef *hcrc, uint32_t pBuffer[], uint32_t BufferLength)
  237. {
  238.   uint32_t index = 0U;
  239.  
  240.   /* Process Locked */
  241.   __HAL_LOCK(hcrc);
  242.  
  243.   /* Change CRC peripheral state */
  244.   hcrc->State = HAL_CRC_STATE_BUSY;
  245.  
  246.   /* Enter Data to the CRC calculator */
  247.   for(index = 0U; index < BufferLength; index++)
  248.   {
  249.     hcrc->Instance->DR = pBuffer[index];
  250.   }
  251.  
  252.   /* Change CRC peripheral state */
  253.   hcrc->State = HAL_CRC_STATE_READY;
  254.  
  255.   /* Process Unlocked */
  256.   __HAL_UNLOCK(hcrc);
  257.  
  258.   /* Return the CRC computed value */
  259.   return hcrc->Instance->DR;
  260. }
  261.  
  262. /**
  263.   * @brief  Computes the 32-bit CRC of 32-bit data buffer independently
  264.   *         of the previous CRC value.
  265.   * @param  hcrc: pointer to a CRC_HandleTypeDef structure that contains
  266.   *         the configuration information for CRC
  267.   * @param  pBuffer: Pointer to the buffer containing the data to be computed
  268.   * @param  BufferLength: Length of the buffer to be computed (defined in word, 4 bytes)
  269.   * @retval 32-bit CRC
  270.   */
  271. uint32_t HAL_CRC_Calculate(CRC_HandleTypeDef *hcrc, uint32_t pBuffer[], uint32_t BufferLength)
  272. {
  273.   uint32_t index = 0U;
  274.  
  275.   /* Process Locked */
  276.   __HAL_LOCK(hcrc);
  277.  
  278.   /* Change CRC peripheral state */
  279.   hcrc->State = HAL_CRC_STATE_BUSY;
  280.  
  281.   /* Reset CRC Calculation Unit */
  282.   __HAL_CRC_DR_RESET(hcrc);
  283.  
  284.   /* Enter Data to the CRC calculator */
  285.   for(index = 0U; index < BufferLength; index++)
  286.   {
  287.     hcrc->Instance->DR = pBuffer[index];
  288.   }
  289.  
  290.   /* Change CRC peripheral state */
  291.   hcrc->State = HAL_CRC_STATE_READY;
  292.  
  293.   /* Process Unlocked */
  294.   __HAL_UNLOCK(hcrc);
  295.  
  296.   /* Return the CRC computed value */
  297.   return hcrc->Instance->DR;
  298. }
  299.  
  300. /**
  301.   * @}
  302.   */
  303.  
  304. /** @defgroup CRC_Exported_Functions_Group3 Peripheral State functions
  305.  *  @brief    Peripheral State functions.
  306.  *
  307. @verbatim  
  308.   ==============================================================================
  309.                       ##### Peripheral State functions #####
  310.   ==============================================================================  
  311.     [..]
  312.     This subsection permits to get in run-time the status of the peripheral.
  313.  
  314. @endverbatim
  315.   * @{
  316.   */
  317.  
  318. /**
  319.   * @brief  Returns the CRC state.
  320.   * @param  hcrc: pointer to a CRC_HandleTypeDef structure that contains
  321.   *         the configuration information for CRC
  322.   * @retval HAL state
  323.   */
  324. HAL_CRC_StateTypeDef HAL_CRC_GetState(CRC_HandleTypeDef *hcrc)
  325. {
  326.   return hcrc->State;
  327. }
  328.  
  329. /**
  330.   * @}
  331.   */
  332.  
  333. /**
  334.   * @}
  335.   */
  336.  
  337. #endif /* HAL_CRC_MODULE_ENABLED */
  338. /**
  339.   * @}
  340.   */
  341.  
  342. /**
  343.   * @}
  344.   */
  345.  
  346. /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
  347.