470 lines
15 KiB
C
470 lines
15 KiB
C
/**
|
|
*******************************************************************************************************
|
|
* @file fm33lg0xx_fl_crc.h
|
|
* @author FMSH Application Team
|
|
* @brief Head file of CRC FL Module
|
|
*******************************************************************************************************
|
|
* @attention
|
|
*
|
|
* Copyright (c) [2021] [Fudan Microelectronics]
|
|
* THIS SOFTWARE is licensed under Mulan PSL v2.
|
|
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
|
* You may obtain a copy of Mulan PSL v2 at:
|
|
* http://license.coscl.org.cn/MulanPSL2
|
|
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
|
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
|
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
|
* See the Mulan PSL v2 for more details.
|
|
*
|
|
*******************************************************************************************************
|
|
*/
|
|
|
|
|
|
/* Define to prevent recursive inclusion---------------------------------------------------------------*/
|
|
#ifndef __FM33LG0XX_FL_CRC_H
|
|
#define __FM33LG0XX_FL_CRC_H
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
/* Includes -------------------------------------------------------------------------------------------*/
|
|
#include "fm33lg0xx_fl_def.h"
|
|
/** @addtogroup FM33LG0XX_FL_Driver
|
|
* @{
|
|
*/
|
|
|
|
/** @defgroup CRC CRC
|
|
* @brief CRC FL driver
|
|
* @{
|
|
*/
|
|
|
|
/* Exported types -------------------------------------------------------------------------------------*/
|
|
/** @defgroup CRC_FL_ES_INIT CRC Exported Init structures
|
|
* @{
|
|
*/
|
|
|
|
/**
|
|
* @brief FL CRC Init Sturcture definition
|
|
*/
|
|
typedef struct
|
|
{
|
|
/*! CRC初值 */
|
|
uint32_t initVal;
|
|
/*! 计算数据宽度 */
|
|
uint32_t dataWidth;
|
|
/*! 输入数据翻转 */
|
|
uint32_t reflectIn;
|
|
/*! 输出数据翻转 */
|
|
uint32_t reflectOut;
|
|
/*! 输出结果异或寄存器 */
|
|
uint32_t xorReg;
|
|
/*! 输出结果异或使能 */
|
|
uint32_t xorRegState;
|
|
/*! CRC多项式宽 */
|
|
uint32_t polynomialWidth;
|
|
/*! CRC多项式 */
|
|
uint32_t polynomial;
|
|
/*! 计算模式 串行或并行 */
|
|
uint32_t calculatMode;
|
|
|
|
} FL_CRC_InitTypeDef;
|
|
|
|
/**
|
|
* @}
|
|
*/
|
|
/* Exported constants ---------------------------------------------------------------------------------*/
|
|
/** @defgroup CRC_FL_Exported_Constants CRC Exported Constants
|
|
* @{
|
|
*/
|
|
|
|
#define CRC_CR_OPWD_Pos (9U)
|
|
#define CRC_CR_OPWD_Msk (0x1U << CRC_CR_OPWD_Pos)
|
|
#define CRC_CR_OPWD CRC_CR_OPWD_Msk
|
|
|
|
#define CRC_CR_PARA_Pos (8U)
|
|
#define CRC_CR_PARA_Msk (0x1U << CRC_CR_PARA_Pos)
|
|
#define CRC_CR_PARA CRC_CR_PARA_Msk
|
|
|
|
#define CRC_CR_RFLTIN_Pos (6U)
|
|
#define CRC_CR_RFLTIN_Msk (0x3U << CRC_CR_RFLTIN_Pos)
|
|
#define CRC_CR_RFLTIN CRC_CR_RFLTIN_Msk
|
|
|
|
#define CRC_CR_RFLTO_Pos (5U)
|
|
#define CRC_CR_RFLTO_Msk (0x1U << CRC_CR_RFLTO_Pos)
|
|
#define CRC_CR_RFLTO CRC_CR_RFLTO_Msk
|
|
|
|
#define CRC_CR_RES_Pos (4U)
|
|
#define CRC_CR_RES_Msk (0x1U << CRC_CR_RES_Pos)
|
|
#define CRC_CR_RES CRC_CR_RES_Msk
|
|
|
|
#define CRC_CR_BUSY_Pos (3U)
|
|
#define CRC_CR_BUSY_Msk (0x1U << CRC_CR_BUSY_Pos)
|
|
#define CRC_CR_BUSY CRC_CR_BUSY_Msk
|
|
|
|
#define CRC_CR_XOR_Pos (2U)
|
|
#define CRC_CR_XOR_Msk (0x1U << CRC_CR_XOR_Pos)
|
|
#define CRC_CR_XOR CRC_CR_XOR_Msk
|
|
|
|
#define CRC_CR_SEL_Pos (0U)
|
|
#define CRC_CR_SEL_Msk (0x3U << CRC_CR_SEL_Pos)
|
|
#define CRC_CR_SEL CRC_CR_SEL_Msk
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define FL_CRC_DATA_WIDTH_8B (0x0U << CRC_CR_OPWD_Pos)
|
|
#define FL_CRC_DATA_WIDTH_32B (0x1U << CRC_CR_OPWD_Pos)
|
|
|
|
|
|
#define FL_CRC_CALCULATE_SERIAL (0x0U << CRC_CR_PARA_Pos)
|
|
#define FL_CRC_CALCULATE_PARALLEL (0x1U << CRC_CR_PARA_Pos)
|
|
|
|
|
|
#define FL_CRC_INPUT_INVERT_NONE (0x0U << CRC_CR_RFLTIN_Pos)
|
|
#define FL_CRC_INPUT_INVERT_BYTE (0x1U << CRC_CR_RFLTIN_Pos)
|
|
#define FL_CRC_INPUT_INVERT_HALF_WORD (0x2U << CRC_CR_RFLTIN_Pos)
|
|
#define FL_CRC_INPUT_INVERT_WORD (0x3U << CRC_CR_RFLTIN_Pos)
|
|
|
|
|
|
#define FL_CRC_OUPUT_INVERT_NONE (0x0U << CRC_CR_RFLTO_Pos)
|
|
#define FL_CRC_OUPUT_INVERT_BYTE (0x1U << CRC_CR_RFLTO_Pos)
|
|
|
|
|
|
#define FL_CRC_POLYNOMIAL_32B (0x0U << CRC_CR_SEL_Pos)
|
|
#define FL_CRC_POLYNOMIAL_16B (0x1U << CRC_CR_SEL_Pos)
|
|
#define FL_CRC_POLYNOMIAL_8B (0x2U << CRC_CR_SEL_Pos)
|
|
#define FL_CRC_POLYNOMIAL_7B (0x3U << CRC_CR_SEL_Pos)
|
|
|
|
|
|
/**
|
|
* @}
|
|
*/
|
|
/* Exported functions ---------------------------------------------------------------------------------*/
|
|
/** @defgroup CRC_FL_Exported_Functions CRC Exported Functions
|
|
* @{
|
|
*/
|
|
|
|
/**
|
|
* @brief Set CRC data register
|
|
* @rmtoll DR FL_CRC_WriteData
|
|
* @param CRCx CRC instance
|
|
* @param data
|
|
* @retval None
|
|
*/
|
|
__STATIC_INLINE void FL_CRC_WriteData(CRC_Type *CRCx, uint32_t data)
|
|
{
|
|
MODIFY_REG(CRCx->DR, (0xffffffffU << 0U), (data << 0U));
|
|
}
|
|
|
|
/**
|
|
* @brief Get CRC data register value
|
|
* @rmtoll DR FL_CRC_ReadData
|
|
* @param CRCx CRC instance
|
|
* @retval
|
|
*/
|
|
__STATIC_INLINE uint32_t FL_CRC_ReadData(CRC_Type *CRCx)
|
|
{
|
|
return (uint32_t)(READ_BIT(CRCx->DR, (0xffffffffU << 0U)) >> 0U);
|
|
}
|
|
|
|
/**
|
|
* @brief Set CRC calculate operation width
|
|
* @rmtoll CR OPWD FL_CRC_SetDataWidth
|
|
* @param CRCx CRC instance
|
|
* @param dataWidth This parameter can be one of the following values:
|
|
* @arg @ref FL_CRC_DATA_WIDTH_8B
|
|
* @arg @ref FL_CRC_DATA_WIDTH_32B
|
|
* @retval None
|
|
*/
|
|
__STATIC_INLINE void FL_CRC_SetDataWidth(CRC_Type *CRCx, uint32_t dataWidth)
|
|
{
|
|
MODIFY_REG(CRCx->CR, CRC_CR_OPWD_Msk, dataWidth);
|
|
}
|
|
|
|
/**
|
|
* @brief Get CRC calculate operation width
|
|
* @rmtoll CR OPWD FL_CRC_GetDataWidth
|
|
* @param CRCx CRC instance
|
|
* @retval Returned value can be one of the following values:
|
|
* @arg @ref FL_CRC_DATA_WIDTH_8B
|
|
* @arg @ref FL_CRC_DATA_WIDTH_32B
|
|
*/
|
|
__STATIC_INLINE uint32_t FL_CRC_GetDataWidth(CRC_Type *CRCx)
|
|
{
|
|
return (uint32_t)(READ_BIT(CRCx->CR, CRC_CR_OPWD_Msk));
|
|
}
|
|
|
|
/**
|
|
* @brief Set CRC parallel calculation mode
|
|
* @rmtoll CR PARA FL_CRC_SetCalculateMode
|
|
* @param CRCx CRC instance
|
|
* @param mode This parameter can be one of the following values:
|
|
* @arg @ref FL_CRC_CALCULATE_SERIAL
|
|
* @arg @ref FL_CRC_CALCULATE_PARALLEL
|
|
* @retval None
|
|
*/
|
|
__STATIC_INLINE void FL_CRC_SetCalculateMode(CRC_Type *CRCx, uint32_t mode)
|
|
{
|
|
MODIFY_REG(CRCx->CR, CRC_CR_PARA_Msk, mode);
|
|
}
|
|
|
|
/**
|
|
* @brief Get CRC parallel calculation mode
|
|
* @rmtoll CR PARA FL_CRC_GetCalculateMode
|
|
* @param CRCx CRC instance
|
|
* @retval Returned value can be one of the following values:
|
|
* @arg @ref FL_CRC_CALCULATE_SERIAL
|
|
* @arg @ref FL_CRC_CALCULATE_PARALLEL
|
|
*/
|
|
__STATIC_INLINE uint32_t FL_CRC_GetCalculateMode(CRC_Type *CRCx)
|
|
{
|
|
return (uint32_t)(READ_BIT(CRCx->CR, CRC_CR_PARA_Msk));
|
|
}
|
|
|
|
/**
|
|
* @brief Set CRC reflected input
|
|
* @rmtoll CR RFLTIN FL_CRC_SetInputInvertMode
|
|
* @param CRCx CRC instance
|
|
* @param mode This parameter can be one of the following values:
|
|
* @arg @ref FL_CRC_INPUT_INVERT_NONE
|
|
* @arg @ref FL_CRC_INPUT_INVERT_BYTE
|
|
* @arg @ref FL_CRC_INPUT_INVERT_HALF_WORD
|
|
* @arg @ref FL_CRC_INPUT_INVERT_WORD
|
|
* @retval None
|
|
*/
|
|
__STATIC_INLINE void FL_CRC_SetInputInvertMode(CRC_Type *CRCx, uint32_t mode)
|
|
{
|
|
MODIFY_REG(CRCx->CR, CRC_CR_RFLTIN_Msk, mode);
|
|
}
|
|
|
|
/**
|
|
* @brief Get CRC reflected input status
|
|
* @rmtoll CR RFLTIN FL_CRC_GetInputInvertMode
|
|
* @param CRCx CRC instance
|
|
* @retval Returned value can be one of the following values:
|
|
* @arg @ref FL_CRC_INPUT_INVERT_NONE
|
|
* @arg @ref FL_CRC_INPUT_INVERT_BYTE
|
|
* @arg @ref FL_CRC_INPUT_INVERT_HALF_WORD
|
|
* @arg @ref FL_CRC_INPUT_INVERT_WORD
|
|
*/
|
|
__STATIC_INLINE uint32_t FL_CRC_GetInputInvertMode(CRC_Type *CRCx)
|
|
{
|
|
return (uint32_t)(READ_BIT(CRCx->CR, CRC_CR_RFLTIN_Msk));
|
|
}
|
|
|
|
/**
|
|
* @brief Set CRC reflected output
|
|
* @rmtoll CR RFLTO FL_CRC_SetOutputInvertMode
|
|
* @param CRCx CRC instance
|
|
* @param mode This parameter can be one of the following values:
|
|
* @arg @ref FL_CRC_OUPUT_INVERT_NONE
|
|
* @arg @ref FL_CRC_OUPUT_INVERT_BYTE
|
|
* @retval None
|
|
*/
|
|
__STATIC_INLINE void FL_CRC_SetOutputInvertMode(CRC_Type *CRCx, uint32_t mode)
|
|
{
|
|
MODIFY_REG(CRCx->CR, CRC_CR_RFLTO_Msk, mode);
|
|
}
|
|
|
|
/**
|
|
* @brief Get CRC feflected output status
|
|
* @rmtoll CR RFLTO FL_CRC_GetOutputInvertMode
|
|
* @param CRCx CRC instance
|
|
* @retval Returned value can be one of the following values:
|
|
* @arg @ref FL_CRC_OUPUT_INVERT_NONE
|
|
* @arg @ref FL_CRC_OUPUT_INVERT_BYTE
|
|
*/
|
|
__STATIC_INLINE uint32_t FL_CRC_GetOutputInvertMode(CRC_Type *CRCx)
|
|
{
|
|
return (uint32_t)(READ_BIT(CRCx->CR, CRC_CR_RFLTO_Msk));
|
|
}
|
|
|
|
/**
|
|
* @brief Get CRC result flag
|
|
* @rmtoll CR RES FL_CRC_IsActiveFlag_Zero
|
|
* @param CRCx CRC instance
|
|
* @retval State of bit (1 or 0).
|
|
*/
|
|
__STATIC_INLINE uint32_t FL_CRC_IsActiveFlag_Zero(CRC_Type *CRCx)
|
|
{
|
|
return (uint32_t)(READ_BIT(CRCx->CR, CRC_CR_RES_Msk) == (CRC_CR_RES_Msk));
|
|
}
|
|
|
|
/**
|
|
* @brief Get CRC operational flag
|
|
* @rmtoll CR BUSY FL_CRC_IsActiveFlag_Busy
|
|
* @param CRCx CRC instance
|
|
* @retval State of bit (1 or 0).
|
|
*/
|
|
__STATIC_INLINE uint32_t FL_CRC_IsActiveFlag_Busy(CRC_Type *CRCx)
|
|
{
|
|
return (uint32_t)(READ_BIT(CRCx->CR, CRC_CR_BUSY_Msk) == (CRC_CR_BUSY_Msk));
|
|
}
|
|
|
|
/**
|
|
* @brief Output XORed with CRC_XOR register enable
|
|
* @rmtoll CR XOR FL_CRC_EnableOutputXOR
|
|
* @param CRCx CRC instance
|
|
* @retval None
|
|
*/
|
|
__STATIC_INLINE void FL_CRC_EnableOutputXOR(CRC_Type *CRCx)
|
|
{
|
|
SET_BIT(CRCx->CR, CRC_CR_XOR_Msk);
|
|
}
|
|
|
|
/**
|
|
* @brief Get output XORed with CRC_XOR register enable status
|
|
* @rmtoll CR XOR FL_CRC_IsEnabledOutputXOR
|
|
* @param CRCx CRC instance
|
|
* @retval State of bit (1 or 0).
|
|
*/
|
|
__STATIC_INLINE uint32_t FL_CRC_IsEnabledOutputXOR(CRC_Type *CRCx)
|
|
{
|
|
return (uint32_t)(READ_BIT(CRCx->CR, CRC_CR_XOR_Msk) == CRC_CR_XOR_Msk);
|
|
}
|
|
|
|
/**
|
|
* @brief Output XORed with CRC_XOR register disable
|
|
* @rmtoll CR XOR FL_CRC_DisableOutputXOR
|
|
* @param CRCx CRC instance
|
|
* @retval None
|
|
*/
|
|
__STATIC_INLINE void FL_CRC_DisableOutputXOR(CRC_Type *CRCx)
|
|
{
|
|
CLEAR_BIT(CRCx->CR, CRC_CR_XOR_Msk);
|
|
}
|
|
|
|
/**
|
|
* @brief Polynomial width selection
|
|
* @rmtoll CR SEL FL_CRC_SetPolynomialWidth
|
|
* @param CRCx CRC instance
|
|
* @param width This parameter can be one of the following values:
|
|
* @arg @ref FL_CRC_POLYNOMIAL_32B
|
|
* @arg @ref FL_CRC_POLYNOMIAL_16B
|
|
* @arg @ref FL_CRC_POLYNOMIAL_8B
|
|
* @arg @ref FL_CRC_POLYNOMIAL_7B
|
|
* @retval None
|
|
*/
|
|
__STATIC_INLINE void FL_CRC_SetPolynomialWidth(CRC_Type *CRCx, uint32_t width)
|
|
{
|
|
MODIFY_REG(CRCx->CR, CRC_CR_SEL_Msk, width);
|
|
}
|
|
|
|
/**
|
|
* @brief Get Polynomial width Selection status
|
|
* @rmtoll CR SEL FL_CRC_GetPolynomialWidth
|
|
* @param CRCx CRC instance
|
|
* @retval Returned value can be one of the following values:
|
|
* @arg @ref FL_CRC_POLYNOMIAL_32B
|
|
* @arg @ref FL_CRC_POLYNOMIAL_16B
|
|
* @arg @ref FL_CRC_POLYNOMIAL_8B
|
|
* @arg @ref FL_CRC_POLYNOMIAL_7B
|
|
*/
|
|
__STATIC_INLINE uint32_t FL_CRC_GetPolynomialWidth(CRC_Type *CRCx)
|
|
{
|
|
return (uint32_t)(READ_BIT(CRCx->CR, CRC_CR_SEL_Msk));
|
|
}
|
|
|
|
/**
|
|
* @brief Set linear feedback shift register
|
|
* @rmtoll LFSR FL_CRC_WriteInitialValue
|
|
* @param CRCx CRC instance
|
|
* @param data
|
|
* @retval None
|
|
*/
|
|
__STATIC_INLINE void FL_CRC_WriteInitialValue(CRC_Type *CRCx, uint32_t data)
|
|
{
|
|
MODIFY_REG(CRCx->LFSR, (0xffffffffU << 0U), (data << 0U));
|
|
}
|
|
|
|
/**
|
|
* @brief Get linear feedback shift register value
|
|
* @rmtoll LFSR FL_CRC_ReadInitialValue
|
|
* @param CRCx CRC instance
|
|
* @retval
|
|
*/
|
|
__STATIC_INLINE uint32_t FL_CRC_ReadInitialValue(CRC_Type *CRCx)
|
|
{
|
|
return (uint32_t)(READ_BIT(CRCx->LFSR, (0xffffffffU << 0U)) >> 0U);
|
|
}
|
|
|
|
/**
|
|
* @brief Set eXclusive XOR register
|
|
* @rmtoll XOR FL_CRC_WriteXORValue
|
|
* @param CRCx CRC instance
|
|
* @param data
|
|
* @retval None
|
|
*/
|
|
__STATIC_INLINE void FL_CRC_WriteXORValue(CRC_Type *CRCx, uint32_t data)
|
|
{
|
|
MODIFY_REG(CRCx->XOR, (0xffffffffU << 0U), (data << 0U));
|
|
}
|
|
|
|
/**
|
|
* @brief Get eXclusive XOR register value
|
|
* @rmtoll XOR FL_CRC_ReadXORValue
|
|
* @param CRCx CRC instance
|
|
* @retval
|
|
*/
|
|
__STATIC_INLINE uint32_t FL_CRC_ReadXORValue(CRC_Type *CRCx)
|
|
{
|
|
return (uint32_t)(READ_BIT(CRCx->XOR, (0xffffffffU << 0U)) >> 0U);
|
|
}
|
|
|
|
/**
|
|
* @brief Set CRC Polynominals
|
|
* @rmtoll POLY FL_CRC_WritePolynominalParam
|
|
* @param CRCx CRC instance
|
|
* @param data
|
|
* @retval None
|
|
*/
|
|
__STATIC_INLINE void FL_CRC_WritePolynominalParam(CRC_Type *CRCx, uint32_t data)
|
|
{
|
|
MODIFY_REG(CRCx->POLY, (0xffffffffU << 0U), (data << 0U));
|
|
}
|
|
|
|
/**
|
|
* @brief Get CRC Polynominals
|
|
* @rmtoll POLY FL_CRC_ReadPolynominalParam
|
|
* @param CRCx CRC instance
|
|
* @retval
|
|
*/
|
|
__STATIC_INLINE uint32_t FL_CRC_ReadPolynominalParam(CRC_Type *CRCx)
|
|
{
|
|
return (uint32_t)(READ_BIT(CRCx->POLY, (0xffffffffU << 0U)) >> 0U);
|
|
}
|
|
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
/** @defgroup CRC_FL_EF_Init Initialization and de-initialization functions
|
|
* @{
|
|
*/
|
|
FL_ErrorStatus FL_CRC_DeInit(CRC_Type *CRCx);
|
|
void FL_CRC_StructInit(FL_CRC_InitTypeDef *CRC_InitStruct);
|
|
FL_ErrorStatus FL_CRC_Init(CRC_Type *CRCx, FL_CRC_InitTypeDef *CRC_InitStruct);
|
|
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* __FM33LG0XX_FL_CRC_H*/
|
|
|
|
/*************************Py_Code_Generator Version: 0.1-0.11-0.1 @ 2020-09-14*************************/
|
|
/*************************(C) COPYRIGHT Fudan Microelectronics **** END OF FILE*************************/
|