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