1 /**
2   *******************************************************************************************************
3   * @file    fm33lc0xx_fl_crc.c
4   * @author  FMSH Application Team
5   * @brief   Src file of CRC FL Module
6   *******************************************************************************************************
7   * @attention
8   *
9   * Copyright (c) [2021] [Fudan Microelectronics]
10   * THIS SOFTWARE is licensed under Mulan PSL v2.
11   * You can use this software according to the terms and conditions of the Mulan PSL v2.
12   * You may obtain a copy of Mulan PSL v2 at:
13   *          http://license.coscl.org.cn/MulanPSL2
14   * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
15   * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
16   * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
17   * See the Mulan PSL v2 for more details.
18   *
19   *******************************************************************************************************
20   */
21 
22 
23 /* Includes ------------------------------------------------------------------*/
24 #include "fm33lc0xx_fl.h"
25 
26 /** @addtogroup FM33LC0XX_FL_Driver
27   * @{
28   */
29 
30 /** @addtogroup CRC
31   * @{
32   */
33 
34 #ifdef FL_CRC_DRIVER_ENABLED
35 
36 /* Private macros ------------------------------------------------------------*/
37 /** @addtogroup CRC_FL_Private_Macros
38   * @{
39   */
40 
41 #define         IS_FL_CRC_INSTANCE(INTANCE)                         ((INTANCE) == CRC)
42 
43 #define         IS_FL_CRC_POLYNOMIAL_WIDTH(__VALUE__)               (((__VALUE__) == FL_CRC_POLYNOMIAL_16B)||\
44                                                                      ((__VALUE__) == FL_CRC_POLYNOMIAL_32B)||\
45                                                                      ((__VALUE__) == FL_CRC_POLYNOMIAL_8B)||\
46                                                                      ((__VALUE__) == FL_CRC_POLYNOMIAL_7B))
47 
48 #define         IS_FL_CRC_DR_WIDTH(__VALUE__)                       (((__VALUE__) == FL_CRC_DATA_WIDTH_8B)||\
49                                                                     ((__VALUE__) == FL_CRC_DATA_WIDTH_32B))
50 
51 
52 #define         IS_FL_CRC_OUPUT_REFLECTE_MODE(__VALUE__)            (((__VALUE__) == FL_CRC_OUPUT_INVERT_NONE)||\
53                                                                     ((__VALUE__) == FL_CRC_OUPUT_INVERT_BYTE))
54 
55 #define         IS_FL_CRC_INPUT_REFLECTE_MODE(__VALUE__)            (((__VALUE__) == FL_CRC_INPUT_INVERT_NONE)||\
56                                                                     ((__VALUE__) == FL_CRC_INPUT_INVERT_BYTE)||\
57                                                                     ((__VALUE__) == FL_CRC_INPUT_INVERT_HALF_WORD)||\
58                                                                     ((__VALUE__) == FL_CRC_INPUT_INVERT_WORD))
59 
60 #define         IS_FL_CRC_CALCULA_MODE(__VALUE__)                   (((__VALUE__) == FL_CRC_CALCULATE_SERIAL)||\
61                                                                     ((__VALUE__) == FL_CRC_CALCULATE_PARALLEL))
62 
63 /**
64   * @}
65   */
66 
67 /** @addtogroup CRC_FL_EF_Init
68   * @{
69   */
70 
71 /**
72   * @brief  复位CRC外设
73   * @param  CRCx 外设入口地址
74   * @retval 错误状态,可能值:
75   *         -FL_PASS 外设寄存器值恢复复位值
76   *         -FL_FAIL 未成功执行
77   */
FL_CRC_DeInit(CRC_Type * CRCx)78 FL_ErrorStatus FL_CRC_DeInit(CRC_Type *CRCx)
79 {
80     assert_param(IS_FL_CRC_INSTANCE(CRCx));
81     /* 外设复位使能 */
82     FL_RCC_EnablePeripheralReset();
83     /* 复位外设寄存器 */
84     FL_RCC_EnableResetAPB2Peripheral(FL_RCC_RSTAPB_CRC);
85     FL_RCC_DisableResetAPB2Peripheral(FL_RCC_RSTAPB_CRC);
86     /* 关闭总线时钟 */
87     FL_RCC_DisableGroup2BusClock(FL_RCC_GROUP2_BUSCLK_CRC);
88     /* 锁定外设复位功能 */
89     FL_RCC_DisablePeripheralReset();
90     return FL_PASS;
91 }
92 
93 /**
94   * @brief  根据 CRC_InitStruct 的配置信息初始化对应外设入口地址的寄存器值.
95   *
96   * @param  CRCx 外设入口地址
97   * @param  CRC_InitStruct 指向一个 @ref FL_CRC_InitTypeDef 结构体其中包含了外设的相关配置信息.
98   *
99   * @retval 错误状态,可能值:
100   *         -FL_PASS 配置成功
101   *         -FL_FAIL 配置过程发生错误
102   */
FL_CRC_Init(CRC_Type * CRCx,FL_CRC_InitTypeDef * CRC_InitStruct)103 FL_ErrorStatus FL_CRC_Init(CRC_Type *CRCx, FL_CRC_InitTypeDef *CRC_InitStruct)
104 {
105     /* 参数检查 */
106     assert_param(IS_FL_CRC_INSTANCE(CRCx));
107     assert_param(IS_FL_CRC_DR_WIDTH(CRC_InitStruct->dataWidth));
108     assert_param(IS_FL_CRC_CALCULA_MODE(CRC_InitStruct->calculatMode));
109     assert_param(IS_FL_CRC_POLYNOMIAL_WIDTH(CRC_InitStruct->polynomialWidth));
110     assert_param(IS_FL_CRC_INPUT_REFLECTE_MODE(CRC_InitStruct->reflectIn));
111     assert_param(IS_FL_CRC_OUPUT_REFLECTE_MODE(CRC_InitStruct->reflectOut));
112     FL_RCC_EnableGroup2BusClock(FL_RCC_GROUP2_BUSCLK_CRC);
113     FL_CRC_SetCalculateMode(CRCx, CRC_InitStruct->calculatMode);
114     FL_CRC_SetInputInvertMode(CRCx, CRC_InitStruct->reflectIn);
115     FL_CRC_SetOutputInvertMode(CRCx, CRC_InitStruct->reflectOut);
116     FL_CRC_SetPolynomialWidth(CRCx, CRC_InitStruct->polynomialWidth);
117     FL_CRC_WriteXORValue(CRCx, CRC_InitStruct->xorReg);
118     FL_CRC_WritePolynominalParam(CRCx, CRC_InitStruct->polynomial);
119     FL_CRC_WriteInitialValue(CRCx, CRC_InitStruct->initVal);
120     FL_CRC_SetDataWidth(CRCx, CRC_InitStruct->dataWidth);
121     if(CRC_InitStruct->xorRegState == FL_ENABLE)
122     {
123         FL_CRC_EnableOutputXOR(CRCx);
124     }
125     else
126     {
127         FL_CRC_DisableOutputXOR(CRCx);
128     }
129     return FL_PASS;
130 }
131 
132 
133 /**
134   * @brief  将 @ref FL_CRC_InitTypeDef 结构体初始化为默认配置
135   * @param  CRC_InitStruct 指向 @ref FL_CRC_InitTypeDef 结构体的指针
136   *
137   * @retval None
138   */
FL_CRC_StructInit(FL_CRC_InitTypeDef * CRC_InitStruct)139 void FL_CRC_StructInit(FL_CRC_InitTypeDef *CRC_InitStruct)
140 {
141     CRC_InitStruct->polynomial      =  0x00000000;
142     CRC_InitStruct->polynomialWidth =  FL_CRC_POLYNOMIAL_16B;
143     CRC_InitStruct->dataWidth       =  FL_CRC_DATA_WIDTH_8B;
144     CRC_InitStruct->calculatMode    =  FL_CRC_CALCULATE_SERIAL;
145     CRC_InitStruct->reflectIn       =  FL_CRC_INPUT_INVERT_NONE;
146     CRC_InitStruct->reflectOut      =  FL_CRC_OUPUT_INVERT_NONE;
147     CRC_InitStruct->xorReg          =  0x00000000;
148     CRC_InitStruct->xorRegState     =  FL_DISABLE;
149 }
150 
151 
152 /**
153   * @}
154   */
155 
156 #endif /* FL_CRC_DRIVER_ENABLED */
157 
158 /**
159   * @}
160   */
161 
162 /**
163   * @}
164   */
165 
166 /********************** (C) COPYRIGHT Fudan Microelectronics **** END OF FILE ***********************/
167