fm33lc0xx_fl_crc.h 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474
  1. /**
  2. *******************************************************************************************************
  3. * @file fm33lc0xx_fl_crc.h
  4. * @author FMSH Application Team
  5. * @brief Head file of CRC FL Module
  6. *******************************************************************************************************
  7. * @attention
  8. *
  9. * Copyright (c) [2019] [Fudan Microelectronics]
  10. * THIS SOFTWARE is licensed under the Mulan PSL v1.
  11. * can use this software according to the terms and conditions of the Mulan PSL v1.
  12. * You may obtain a copy of Mulan PSL v1 at:
  13. * http://license.coscl.org.cn/MulanPSL
  14. * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
  15. * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
  16. * PURPOSE.
  17. * See the Mulan PSL v1 for more details.
  18. *
  19. *******************************************************************************************************
  20. */
  21. /* Define to prevent recursive inclusion---------------------------------------------------------------*/
  22. #ifndef __FM33LC0XX_FL_CRC_H
  23. #define __FM33LC0XX_FL_CRC_H
  24. #ifdef __cplusplus
  25. extern "C" {
  26. #endif
  27. /* Includes -------------------------------------------------------------------------------------------*/
  28. #include "fm33lc0xx_fl.h"
  29. /** @addtogroup FM33LC0XX_FL_Driver
  30. * @{
  31. */
  32. /** @defgroup CRC CRC
  33. * @brief CRC FL driver
  34. * @{
  35. */
  36. /* Exported types -------------------------------------------------------------------------------------*/
  37. /** @defgroup CRC_FL_ES_INIT CRC Exported Init structures
  38. * @{
  39. */
  40. /**
  41. * @brief FL CRC Init Sturcture definition
  42. */
  43. typedef struct
  44. {
  45. /** CRC初值 */
  46. uint32_t initVal;
  47. /** 计算数据宽度 */
  48. uint32_t dataWidth;
  49. /** 输入数据翻转 */
  50. uint32_t reflectIn;
  51. /** 输出数据翻转 */
  52. uint32_t reflectOut;
  53. /** 输出结果异或寄存器 */
  54. uint32_t xorReg;
  55. /** 输出结果异或使能 */
  56. uint32_t xorRegState;
  57. /** CRC多项式宽 */
  58. uint32_t polynomialWidth;
  59. /** CRC多项式 */
  60. uint32_t polynomial;
  61. /** 计算模式串行或并行 */
  62. uint32_t calculatMode;
  63. } FL_CRC_InitTypeDef;
  64. /**
  65. * @}
  66. */
  67. /* Exported constants ---------------------------------------------------------------------------------*/
  68. /** @defgroup CRC_FL_Exported_Constants CRC Exported Constants
  69. * @{
  70. */
  71. #define CRC_CR_OPWD_Pos (9U)
  72. #define CRC_CR_OPWD_Msk (0x1U << CRC_CR_OPWD_Pos)
  73. #define CRC_CR_OPWD CRC_CR_OPWD_Msk
  74. #define CRC_CR_PARA_Pos (8U)
  75. #define CRC_CR_PARA_Msk (0x1U << CRC_CR_PARA_Pos)
  76. #define CRC_CR_PARA CRC_CR_PARA_Msk
  77. #define CRC_CR_RFLTIN_Pos (6U)
  78. #define CRC_CR_RFLTIN_Msk (0x3U << CRC_CR_RFLTIN_Pos)
  79. #define CRC_CR_RFLTIN CRC_CR_RFLTIN_Msk
  80. #define CRC_CR_RFLTO_Pos (5U)
  81. #define CRC_CR_RFLTO_Msk (0x1U << CRC_CR_RFLTO_Pos)
  82. #define CRC_CR_RFLTO CRC_CR_RFLTO_Msk
  83. #define CRC_CR_RES_Pos (4U)
  84. #define CRC_CR_RES_Msk (0x1U << CRC_CR_RES_Pos)
  85. #define CRC_CR_RES CRC_CR_RES_Msk
  86. #define CRC_CR_BUSY_Pos (3U)
  87. #define CRC_CR_BUSY_Msk (0x1U << CRC_CR_BUSY_Pos)
  88. #define CRC_CR_BUSY CRC_CR_BUSY_Msk
  89. #define CRC_CR_XOR_Pos (2U)
  90. #define CRC_CR_XOR_Msk (0x1U << CRC_CR_XOR_Pos)
  91. #define CRC_CR_XOR CRC_CR_XOR_Msk
  92. #define CRC_CR_SEL_Pos (0U)
  93. #define CRC_CR_SEL_Msk (0x3U << CRC_CR_SEL_Pos)
  94. #define CRC_CR_SEL CRC_CR_SEL_Msk
  95. #define FL_CRC_DATA_WIDTH_8B (0x0U << CRC_CR_OPWD_Pos)
  96. #define FL_CRC_DATA_WIDTH_32B (0x1U << CRC_CR_OPWD_Pos)
  97. #define FL_CRC_CALCULATE_SERIAL (0x0U << CRC_CR_PARA_Pos)
  98. #define FL_CRC_CALCULATE_PARALLEL (0x1U << CRC_CR_PARA_Pos)
  99. #define FL_CRC_INPUT_INVERT_NONE (0x0U << CRC_CR_RFLTIN_Pos)
  100. #define FL_CRC_INPUT_INVERT_BYTE (0x1U << CRC_CR_RFLTIN_Pos)
  101. #define FL_CRC_INPUT_INVERT_HALF_WORD (0x2U << CRC_CR_RFLTIN_Pos)
  102. #define FL_CRC_INPUT_INVERT_WORD (0x3U << CRC_CR_RFLTIN_Pos)
  103. #define FL_CRC_OUPUT_INVERT_NONE (0x0U << CRC_CR_RFLTO_Pos)
  104. #define FL_CRC_OUPUT_INVERT_BYTE (0x1U << CRC_CR_RFLTO_Pos)
  105. #define FL_CRC_POLYNOMIAL_32B (0x0U << CRC_CR_SEL_Pos)
  106. #define FL_CRC_POLYNOMIAL_16B (0x1U << CRC_CR_SEL_Pos)
  107. #define FL_CRC_POLYNOMIAL_8B (0x2U << CRC_CR_SEL_Pos)
  108. #define FL_CRC_POLYNOMIAL_7B (0x3U << CRC_CR_SEL_Pos)
  109. /**
  110. * @}
  111. */
  112. /* Exported functions ---------------------------------------------------------------------------------*/
  113. /** @defgroup CRC_FL_Exported_Functions CRC Exported Functions
  114. * @{
  115. */
  116. /**
  117. * @brief Set CRC data register
  118. * @rmtoll DR FL_CRC_WriteData
  119. * @param CRCx CRC instance
  120. * @param data
  121. * @retval None
  122. */
  123. __STATIC_INLINE void FL_CRC_WriteData(CRC_Type *CRCx, uint32_t data)
  124. {
  125. MODIFY_REG(CRCx->DR, (0xffffffffU << 0U), (data << 0U));
  126. }
  127. /**
  128. * @brief Get CRC data register value
  129. * @rmtoll DR FL_CRC_ReadData
  130. * @param CRCx CRC instance
  131. * @retval
  132. */
  133. __STATIC_INLINE uint32_t FL_CRC_ReadData(CRC_Type *CRCx)
  134. {
  135. return (uint32_t)(READ_BIT(CRCx->DR, (0xffffffffU << 0U)) >> 0U);
  136. }
  137. /**
  138. * @brief Set CRC calculate operation width
  139. * @rmtoll CR OPWD FL_CRC_SetDataWidth
  140. * @param CRCx CRC instance
  141. * @param dataWidth This parameter can be one of the following values:
  142. * @arg @ref FL_CRC_DATA_WIDTH_8B
  143. * @arg @ref FL_CRC_DATA_WIDTH_32B
  144. * @retval None
  145. */
  146. __STATIC_INLINE void FL_CRC_SetDataWidth(CRC_Type *CRCx, uint32_t dataWidth)
  147. {
  148. MODIFY_REG(CRCx->CR, CRC_CR_OPWD_Msk, dataWidth);
  149. }
  150. /**
  151. * @brief Get CRC calculate operation width
  152. * @rmtoll CR OPWD FL_CRC_GetDataWidth
  153. * @param CRCx CRC instance
  154. * @retval Returned value can be one of the following values:
  155. * @arg @ref FL_CRC_DATA_WIDTH_8B
  156. * @arg @ref FL_CRC_DATA_WIDTH_32B
  157. */
  158. __STATIC_INLINE uint32_t FL_CRC_GetDataWidth(CRC_Type *CRCx)
  159. {
  160. return (uint32_t)(READ_BIT(CRCx->CR, CRC_CR_OPWD_Msk));
  161. }
  162. /**
  163. * @brief Set CRC parallel calculation mode
  164. * @rmtoll CR PARA FL_CRC_SetCalculateMode
  165. * @param CRCx CRC instance
  166. * @param mode This parameter can be one of the following values:
  167. * @arg @ref FL_CRC_CALCULATE_SERIAL
  168. * @arg @ref FL_CRC_CALCULATE_PARALLEL
  169. * @retval None
  170. */
  171. __STATIC_INLINE void FL_CRC_SetCalculateMode(CRC_Type *CRCx, uint32_t mode)
  172. {
  173. MODIFY_REG(CRCx->CR, CRC_CR_PARA_Msk, mode);
  174. }
  175. /**
  176. * @brief Get CRC parallel calculation mode
  177. * @rmtoll CR PARA FL_CRC_GetCalculateMode
  178. * @param CRCx CRC instance
  179. * @retval Returned value can be one of the following values:
  180. * @arg @ref FL_CRC_CALCULATE_SERIAL
  181. * @arg @ref FL_CRC_CALCULATE_PARALLEL
  182. */
  183. __STATIC_INLINE uint32_t FL_CRC_GetCalculateMode(CRC_Type *CRCx)
  184. {
  185. return (uint32_t)(READ_BIT(CRCx->CR, CRC_CR_PARA_Msk));
  186. }
  187. /**
  188. * @brief Set CRC reflected input
  189. * @rmtoll CR RFLTIN FL_CRC_SetInputInvertMode
  190. * @param CRCx CRC instance
  191. * @param mode This parameter can be one of the following values:
  192. * @arg @ref FL_CRC_INPUT_INVERT_NONE
  193. * @arg @ref FL_CRC_INPUT_INVERT_BYTE
  194. * @arg @ref FL_CRC_INPUT_INVERT_HALF_WORD
  195. * @arg @ref FL_CRC_INPUT_INVERT_WORD
  196. * @retval None
  197. */
  198. __STATIC_INLINE void FL_CRC_SetInputInvertMode(CRC_Type *CRCx, uint32_t mode)
  199. {
  200. MODIFY_REG(CRCx->CR, CRC_CR_RFLTIN_Msk, mode);
  201. }
  202. /**
  203. * @brief Get CRC reflected input status
  204. * @rmtoll CR RFLTIN FL_CRC_GetInputInvertMode
  205. * @param CRCx CRC instance
  206. * @retval Returned value can be one of the following values:
  207. * @arg @ref FL_CRC_INPUT_INVERT_NONE
  208. * @arg @ref FL_CRC_INPUT_INVERT_BYTE
  209. * @arg @ref FL_CRC_INPUT_INVERT_HALF_WORD
  210. * @arg @ref FL_CRC_INPUT_INVERT_WORD
  211. */
  212. __STATIC_INLINE uint32_t FL_CRC_GetInputInvertMode(CRC_Type *CRCx)
  213. {
  214. return (uint32_t)(READ_BIT(CRCx->CR, CRC_CR_RFLTIN_Msk));
  215. }
  216. /**
  217. * @brief Set CRC reflected output
  218. * @rmtoll CR RFLTO FL_CRC_SetOutputInvertMode
  219. * @param CRCx CRC instance
  220. * @param mode This parameter can be one of the following values:
  221. * @arg @ref FL_CRC_OUPUT_INVERT_NONE
  222. * @arg @ref FL_CRC_OUPUT_INVERT_BYTE
  223. * @retval None
  224. */
  225. __STATIC_INLINE void FL_CRC_SetOutputInvertMode(CRC_Type *CRCx, uint32_t mode)
  226. {
  227. MODIFY_REG(CRCx->CR, CRC_CR_RFLTO_Msk, mode);
  228. }
  229. /**
  230. * @brief Get CRC feflected output status
  231. * @rmtoll CR RFLTO FL_CRC_GetOutputInvertMode
  232. * @param CRCx CRC instance
  233. * @retval Returned value can be one of the following values:
  234. * @arg @ref FL_CRC_OUPUT_INVERT_NONE
  235. * @arg @ref FL_CRC_OUPUT_INVERT_BYTE
  236. */
  237. __STATIC_INLINE uint32_t FL_CRC_GetOutputInvertMode(CRC_Type *CRCx)
  238. {
  239. return (uint32_t)(READ_BIT(CRCx->CR, CRC_CR_RFLTO_Msk));
  240. }
  241. /**
  242. * @brief Get CRC result flag
  243. * @rmtoll CR RES FL_CRC_IsActiveFlag_Zero
  244. * @param CRCx CRC instance
  245. * @retval State of bit (1 or 0).
  246. */
  247. __STATIC_INLINE uint32_t FL_CRC_IsActiveFlag_Zero(CRC_Type *CRCx)
  248. {
  249. return (uint32_t)(READ_BIT(CRCx->CR, CRC_CR_RES_Msk) == (CRC_CR_RES_Msk));
  250. }
  251. /**
  252. * @brief Get CRC operational flag
  253. * @rmtoll CR BUSY FL_CRC_IsActiveFlag_Busy
  254. * @param CRCx CRC instance
  255. * @retval State of bit (1 or 0).
  256. */
  257. __STATIC_INLINE uint32_t FL_CRC_IsActiveFlag_Busy(CRC_Type *CRCx)
  258. {
  259. return (uint32_t)(READ_BIT(CRCx->CR, CRC_CR_BUSY_Msk) == (CRC_CR_BUSY_Msk));
  260. }
  261. /**
  262. * @brief Output XORed with CRC_XOR register enable
  263. * @rmtoll CR XOR FL_CRC_EnableOutputXOR
  264. * @param CRCx CRC instance
  265. * @retval None
  266. */
  267. __STATIC_INLINE void FL_CRC_EnableOutputXOR(CRC_Type *CRCx)
  268. {
  269. SET_BIT(CRCx->CR, CRC_CR_XOR_Msk);
  270. }
  271. /**
  272. * @brief Get output XORed with CRC_XOR register enable status
  273. * @rmtoll CR XOR FL_CRC_IsEnabledOutputXOR
  274. * @param CRCx CRC instance
  275. * @retval State of bit (1 or 0).
  276. */
  277. __STATIC_INLINE uint32_t FL_CRC_IsEnabledOutputXOR(CRC_Type *CRCx)
  278. {
  279. return (uint32_t)(READ_BIT(CRCx->CR, CRC_CR_XOR_Msk) == CRC_CR_XOR_Msk);
  280. }
  281. /**
  282. * @brief Output XORed with CRC_XOR register disable
  283. * @rmtoll CR XOR FL_CRC_DisableOutputXOR
  284. * @param CRCx CRC instance
  285. * @retval None
  286. */
  287. __STATIC_INLINE void FL_CRC_DisableOutputXOR(CRC_Type *CRCx)
  288. {
  289. CLEAR_BIT(CRCx->CR, CRC_CR_XOR_Msk);
  290. }
  291. /**
  292. * @brief Polynomial width selection
  293. * @rmtoll CR SEL FL_CRC_SetPolynomialWidth
  294. * @param CRCx CRC instance
  295. * @param width This parameter can be one of the following values:
  296. * @arg @ref FL_CRC_POLYNOMIAL_32B
  297. * @arg @ref FL_CRC_POLYNOMIAL_16B
  298. * @arg @ref FL_CRC_POLYNOMIAL_8B
  299. * @arg @ref FL_CRC_POLYNOMIAL_7B
  300. * @retval None
  301. */
  302. __STATIC_INLINE void FL_CRC_SetPolynomialWidth(CRC_Type *CRCx, uint32_t width)
  303. {
  304. MODIFY_REG(CRCx->CR, CRC_CR_SEL_Msk, width);
  305. }
  306. /**
  307. * @brief Get Polynomial width Selection status
  308. * @rmtoll CR SEL FL_CRC_GetPolynomialWidth
  309. * @param CRCx CRC instance
  310. * @retval Returned value can be one of the following values:
  311. * @arg @ref FL_CRC_POLYNOMIAL_32B
  312. * @arg @ref FL_CRC_POLYNOMIAL_16B
  313. * @arg @ref FL_CRC_POLYNOMIAL_8B
  314. * @arg @ref FL_CRC_POLYNOMIAL_7B
  315. */
  316. __STATIC_INLINE uint32_t FL_CRC_GetPolynomialWidth(CRC_Type *CRCx)
  317. {
  318. return (uint32_t)(READ_BIT(CRCx->CR, CRC_CR_SEL_Msk));
  319. }
  320. /**
  321. * @brief Set linear feedback shift register
  322. * @rmtoll LFSR FL_CRC_WriteInitialValue
  323. * @param CRCx CRC instance
  324. * @param data
  325. * @retval None
  326. */
  327. __STATIC_INLINE void FL_CRC_WriteInitialValue(CRC_Type *CRCx, uint32_t data)
  328. {
  329. MODIFY_REG(CRCx->LFSR, (0xffffffffU << 0U), (data << 0U));
  330. }
  331. /**
  332. * @brief Get linear feedback shift register value
  333. * @rmtoll LFSR FL_CRC_ReadInitialValue
  334. * @param CRCx CRC instance
  335. * @retval
  336. */
  337. __STATIC_INLINE uint32_t FL_CRC_ReadInitialValue(CRC_Type *CRCx)
  338. {
  339. return (uint32_t)(READ_BIT(CRCx->LFSR, (0xffffffffU << 0U)) >> 0U);
  340. }
  341. /**
  342. * @brief Set eXclusive XOR register
  343. * @rmtoll XOR FL_CRC_WriteXORValue
  344. * @param CRCx CRC instance
  345. * @param data
  346. * @retval None
  347. */
  348. __STATIC_INLINE void FL_CRC_WriteXORValue(CRC_Type *CRCx, uint32_t data)
  349. {
  350. MODIFY_REG(CRCx->XOR, (0xffffffffU << 0U), (data << 0U));
  351. }
  352. /**
  353. * @brief Get eXclusive XOR register value
  354. * @rmtoll XOR FL_CRC_ReadXORValue
  355. * @param CRCx CRC instance
  356. * @retval
  357. */
  358. __STATIC_INLINE uint32_t FL_CRC_ReadXORValue(CRC_Type *CRCx)
  359. {
  360. return (uint32_t)(READ_BIT(CRCx->XOR, (0xffffffffU << 0U)) >> 0U);
  361. }
  362. /**
  363. * @brief Set CRC Polynominals
  364. * @rmtoll POLY FL_CRC_WritePolynominalParam
  365. * @param CRCx CRC instance
  366. * @param data
  367. * @retval None
  368. */
  369. __STATIC_INLINE void FL_CRC_WritePolynominalParam(CRC_Type *CRCx, uint32_t data)
  370. {
  371. MODIFY_REG(CRCx->POLY, (0xffffffffU << 0U), (data << 0U));
  372. }
  373. /**
  374. * @brief Get CRC Polynominals
  375. * @rmtoll POLY FL_CRC_ReadPolynominalParam
  376. * @param CRCx CRC instance
  377. * @retval
  378. */
  379. __STATIC_INLINE uint32_t FL_CRC_ReadPolynominalParam(CRC_Type *CRCx)
  380. {
  381. return (uint32_t)(READ_BIT(CRCx->POLY, (0xffffffffU << 0U)) >> 0U);
  382. }
  383. /**
  384. * @}
  385. */
  386. /** @defgroup CRC_FL_EF_Init Initialization and de-initialization functions
  387. * @{
  388. */
  389. FL_ErrorStatus FL_CRC_DeInit(CRC_Type *CRCx);
  390. void FL_CRC_StructInit(FL_CRC_InitTypeDef *CRC_InitStruct);
  391. FL_ErrorStatus FL_CRC_Init(CRC_Type *CRCx, FL_CRC_InitTypeDef *CRC_InitStruct);
  392. /**
  393. * @}
  394. */
  395. /**
  396. * @}
  397. */
  398. /**
  399. * @}
  400. */
  401. #ifdef __cplusplus
  402. }
  403. #endif
  404. #endif /* __FM33LC0XX_FL_CRC_H*/
  405. /*************************Py_Code_Generator Version: 0.1-0.11-0.2 @ 2020-09-23*************************/
  406. /*************************(C) COPYRIGHT Fudan Microelectronics **** END OF FILE*************************/