You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

465 lines
15 KiB

  1. /**
  2. ******************************************************************************
  3. * @file stm32wbxx_ll_crc.h
  4. * @author MCD Application Team
  5. * @brief Header file of CRC LL module.
  6. ******************************************************************************
  7. * @attention
  8. *
  9. * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
  10. * All rights reserved.</center></h2>
  11. *
  12. * This software component is licensed by ST under BSD 3-Clause license,
  13. * the "License"; You may not use this file except in compliance with the
  14. * License. You may obtain a copy of the License at:
  15. * opensource.org/licenses/BSD-3-Clause
  16. *
  17. ******************************************************************************
  18. */
  19. /* Define to prevent recursive inclusion -------------------------------------*/
  20. #ifndef STM32WBxx_LL_CRC_H
  21. #define STM32WBxx_LL_CRC_H
  22. #ifdef __cplusplus
  23. extern "C" {
  24. #endif
  25. /* Includes ------------------------------------------------------------------*/
  26. #include "stm32wbxx.h"
  27. /** @addtogroup STM32WBxx_LL_Driver
  28. * @{
  29. */
  30. #if defined(CRC)
  31. /** @defgroup CRC_LL CRC
  32. * @{
  33. */
  34. /* Private types -------------------------------------------------------------*/
  35. /* Private variables ---------------------------------------------------------*/
  36. /* Private constants ---------------------------------------------------------*/
  37. /* Private macros ------------------------------------------------------------*/
  38. /* Exported types ------------------------------------------------------------*/
  39. /* Exported constants --------------------------------------------------------*/
  40. /** @defgroup CRC_LL_Exported_Constants CRC Exported Constants
  41. * @{
  42. */
  43. /** @defgroup CRC_LL_EC_POLYLENGTH Polynomial length
  44. * @{
  45. */
  46. #define LL_CRC_POLYLENGTH_32B 0x00000000U /*!< 32 bits Polynomial size */
  47. #define LL_CRC_POLYLENGTH_16B CRC_CR_POLYSIZE_0 /*!< 16 bits Polynomial size */
  48. #define LL_CRC_POLYLENGTH_8B CRC_CR_POLYSIZE_1 /*!< 8 bits Polynomial size */
  49. #define LL_CRC_POLYLENGTH_7B (CRC_CR_POLYSIZE_1 | CRC_CR_POLYSIZE_0) /*!< 7 bits Polynomial size */
  50. /**
  51. * @}
  52. */
  53. /** @defgroup CRC_LL_EC_INDATA_REVERSE Input Data Reverse
  54. * @{
  55. */
  56. #define LL_CRC_INDATA_REVERSE_NONE 0x00000000U /*!< Input Data bit order not affected */
  57. #define LL_CRC_INDATA_REVERSE_BYTE CRC_CR_REV_IN_0 /*!< Input Data bit reversal done by byte */
  58. #define LL_CRC_INDATA_REVERSE_HALFWORD CRC_CR_REV_IN_1 /*!< Input Data bit reversal done by half-word */
  59. #define LL_CRC_INDATA_REVERSE_WORD (CRC_CR_REV_IN_1 | CRC_CR_REV_IN_0) /*!< Input Data bit reversal done by word */
  60. /**
  61. * @}
  62. */
  63. /** @defgroup CRC_LL_EC_OUTDATA_REVERSE Output Data Reverse
  64. * @{
  65. */
  66. #define LL_CRC_OUTDATA_REVERSE_NONE 0x00000000U /*!< Output Data bit order not affected */
  67. #define LL_CRC_OUTDATA_REVERSE_BIT CRC_CR_REV_OUT /*!< Output Data bit reversal done by bit */
  68. /**
  69. * @}
  70. */
  71. /** @defgroup CRC_LL_EC_Default_Polynomial_Value Default CRC generating polynomial value
  72. * @brief Normal representation of this polynomial value is
  73. * X^32 + X^26 + X^23 + X^22 + X^16 + X^12 + X^11 + X^10 +X^8 + X^7 + X^5 + X^4 + X^2 + X + 1 .
  74. * @{
  75. */
  76. #define LL_CRC_DEFAULT_CRC32_POLY 0x04C11DB7U /*!< Default CRC generating polynomial value */
  77. /**
  78. * @}
  79. */
  80. /** @defgroup CRC_LL_EC_Default_InitValue Default CRC computation initialization value
  81. * @{
  82. */
  83. #define LL_CRC_DEFAULT_CRC_INITVALUE 0xFFFFFFFFU /*!< Default CRC computation initialization value */
  84. /**
  85. * @}
  86. */
  87. /**
  88. * @}
  89. */
  90. /* Exported macro ------------------------------------------------------------*/
  91. /** @defgroup CRC_LL_Exported_Macros CRC Exported Macros
  92. * @{
  93. */
  94. /** @defgroup CRC_LL_EM_WRITE_READ Common Write and read registers Macros
  95. * @{
  96. */
  97. /**
  98. * @brief Write a value in CRC register
  99. * @param __INSTANCE__ CRC Instance
  100. * @param __REG__ Register to be written
  101. * @param __VALUE__ Value to be written in the register
  102. * @retval None
  103. */
  104. #define LL_CRC_WriteReg(__INSTANCE__, __REG__, __VALUE__) WRITE_REG(__INSTANCE__->__REG__, __VALUE__)
  105. /**
  106. * @brief Read a value in CRC register
  107. * @param __INSTANCE__ CRC Instance
  108. * @param __REG__ Register to be read
  109. * @retval Register value
  110. */
  111. #define LL_CRC_ReadReg(__INSTANCE__, __REG__) READ_REG(__INSTANCE__->__REG__)
  112. /**
  113. * @}
  114. */
  115. /**
  116. * @}
  117. */
  118. /* Exported functions --------------------------------------------------------*/
  119. /** @defgroup CRC_LL_Exported_Functions CRC Exported Functions
  120. * @{
  121. */
  122. /** @defgroup CRC_LL_EF_Configuration CRC Configuration functions
  123. * @{
  124. */
  125. /**
  126. * @brief Reset the CRC calculation unit.
  127. * @note If Programmable Initial CRC value feature
  128. * is available, also set the Data Register to the value stored in the
  129. * CRC_INIT register, otherwise, reset Data Register to its default value.
  130. * @rmtoll CR RESET LL_CRC_ResetCRCCalculationUnit
  131. * @param CRCx CRC Instance
  132. * @retval None
  133. */
  134. __STATIC_INLINE void LL_CRC_ResetCRCCalculationUnit(CRC_TypeDef *CRCx)
  135. {
  136. SET_BIT(CRCx->CR, CRC_CR_RESET);
  137. }
  138. /**
  139. * @brief Configure size of the polynomial.
  140. * @rmtoll CR POLYSIZE LL_CRC_SetPolynomialSize
  141. * @param CRCx CRC Instance
  142. * @param PolySize This parameter can be one of the following values:
  143. * @arg @ref LL_CRC_POLYLENGTH_32B
  144. * @arg @ref LL_CRC_POLYLENGTH_16B
  145. * @arg @ref LL_CRC_POLYLENGTH_8B
  146. * @arg @ref LL_CRC_POLYLENGTH_7B
  147. * @retval None
  148. */
  149. __STATIC_INLINE void LL_CRC_SetPolynomialSize(CRC_TypeDef *CRCx, uint32_t PolySize)
  150. {
  151. MODIFY_REG(CRCx->CR, CRC_CR_POLYSIZE, PolySize);
  152. }
  153. /**
  154. * @brief Return size of the polynomial.
  155. * @rmtoll CR POLYSIZE LL_CRC_GetPolynomialSize
  156. * @param CRCx CRC Instance
  157. * @retval Returned value can be one of the following values:
  158. * @arg @ref LL_CRC_POLYLENGTH_32B
  159. * @arg @ref LL_CRC_POLYLENGTH_16B
  160. * @arg @ref LL_CRC_POLYLENGTH_8B
  161. * @arg @ref LL_CRC_POLYLENGTH_7B
  162. */
  163. __STATIC_INLINE uint32_t LL_CRC_GetPolynomialSize(CRC_TypeDef *CRCx)
  164. {
  165. return (uint32_t)(READ_BIT(CRCx->CR, CRC_CR_POLYSIZE));
  166. }
  167. /**
  168. * @brief Configure the reversal of the bit order of the input data
  169. * @rmtoll CR REV_IN LL_CRC_SetInputDataReverseMode
  170. * @param CRCx CRC Instance
  171. * @param ReverseMode This parameter can be one of the following values:
  172. * @arg @ref LL_CRC_INDATA_REVERSE_NONE
  173. * @arg @ref LL_CRC_INDATA_REVERSE_BYTE
  174. * @arg @ref LL_CRC_INDATA_REVERSE_HALFWORD
  175. * @arg @ref LL_CRC_INDATA_REVERSE_WORD
  176. * @retval None
  177. */
  178. __STATIC_INLINE void LL_CRC_SetInputDataReverseMode(CRC_TypeDef *CRCx, uint32_t ReverseMode)
  179. {
  180. MODIFY_REG(CRCx->CR, CRC_CR_REV_IN, ReverseMode);
  181. }
  182. /**
  183. * @brief Return type of reversal for input data bit order
  184. * @rmtoll CR REV_IN LL_CRC_GetInputDataReverseMode
  185. * @param CRCx CRC Instance
  186. * @retval Returned value can be one of the following values:
  187. * @arg @ref LL_CRC_INDATA_REVERSE_NONE
  188. * @arg @ref LL_CRC_INDATA_REVERSE_BYTE
  189. * @arg @ref LL_CRC_INDATA_REVERSE_HALFWORD
  190. * @arg @ref LL_CRC_INDATA_REVERSE_WORD
  191. */
  192. __STATIC_INLINE uint32_t LL_CRC_GetInputDataReverseMode(CRC_TypeDef *CRCx)
  193. {
  194. return (uint32_t)(READ_BIT(CRCx->CR, CRC_CR_REV_IN));
  195. }
  196. /**
  197. * @brief Configure the reversal of the bit order of the Output data
  198. * @rmtoll CR REV_OUT LL_CRC_SetOutputDataReverseMode
  199. * @param CRCx CRC Instance
  200. * @param ReverseMode This parameter can be one of the following values:
  201. * @arg @ref LL_CRC_OUTDATA_REVERSE_NONE
  202. * @arg @ref LL_CRC_OUTDATA_REVERSE_BIT
  203. * @retval None
  204. */
  205. __STATIC_INLINE void LL_CRC_SetOutputDataReverseMode(CRC_TypeDef *CRCx, uint32_t ReverseMode)
  206. {
  207. MODIFY_REG(CRCx->CR, CRC_CR_REV_OUT, ReverseMode);
  208. }
  209. /**
  210. * @brief Configure the reversal of the bit order of the Output data
  211. * @rmtoll CR REV_OUT LL_CRC_GetOutputDataReverseMode
  212. * @param CRCx CRC Instance
  213. * @retval Returned value can be one of the following values:
  214. * @arg @ref LL_CRC_OUTDATA_REVERSE_NONE
  215. * @arg @ref LL_CRC_OUTDATA_REVERSE_BIT
  216. */
  217. __STATIC_INLINE uint32_t LL_CRC_GetOutputDataReverseMode(CRC_TypeDef *CRCx)
  218. {
  219. return (uint32_t)(READ_BIT(CRCx->CR, CRC_CR_REV_OUT));
  220. }
  221. /**
  222. * @brief Initialize the Programmable initial CRC value.
  223. * @note If the CRC size is less than 32 bits, the least significant bits
  224. * are used to write the correct value
  225. * @note LL_CRC_DEFAULT_CRC_INITVALUE could be used as value for InitCrc parameter.
  226. * @rmtoll INIT INIT LL_CRC_SetInitialData
  227. * @param CRCx CRC Instance
  228. * @param InitCrc Value to be programmed in Programmable initial CRC value register
  229. * @retval None
  230. */
  231. __STATIC_INLINE void LL_CRC_SetInitialData(CRC_TypeDef *CRCx, uint32_t InitCrc)
  232. {
  233. WRITE_REG(CRCx->INIT, InitCrc);
  234. }
  235. /**
  236. * @brief Return current Initial CRC value.
  237. * @note If the CRC size is less than 32 bits, the least significant bits
  238. * are used to read the correct value
  239. * @rmtoll INIT INIT LL_CRC_GetInitialData
  240. * @param CRCx CRC Instance
  241. * @retval Value programmed in Programmable initial CRC value register
  242. */
  243. __STATIC_INLINE uint32_t LL_CRC_GetInitialData(CRC_TypeDef *CRCx)
  244. {
  245. return (uint32_t)(READ_REG(CRCx->INIT));
  246. }
  247. /**
  248. * @brief Initialize the Programmable polynomial value
  249. * (coefficients of the polynomial to be used for CRC calculation).
  250. * @note LL_CRC_DEFAULT_CRC32_POLY could be used as value for PolynomCoef parameter.
  251. * @note Please check Reference Manual and existing Errata Sheets,
  252. * regarding possible limitations for Polynomial values usage.
  253. * For example, for a polynomial of degree 7, X^7 + X^6 + X^5 + X^2 + 1 is written 0x65
  254. * @rmtoll POL POL LL_CRC_SetPolynomialCoef
  255. * @param CRCx CRC Instance
  256. * @param PolynomCoef Value to be programmed in Programmable Polynomial value register
  257. * @retval None
  258. */
  259. __STATIC_INLINE void LL_CRC_SetPolynomialCoef(CRC_TypeDef *CRCx, uint32_t PolynomCoef)
  260. {
  261. WRITE_REG(CRCx->POL, PolynomCoef);
  262. }
  263. /**
  264. * @brief Return current Programmable polynomial value
  265. * @note Please check Reference Manual and existing Errata Sheets,
  266. * regarding possible limitations for Polynomial values usage.
  267. * For example, for a polynomial of degree 7, X^7 + X^6 + X^5 + X^2 + 1 is written 0x65
  268. * @rmtoll POL POL LL_CRC_GetPolynomialCoef
  269. * @param CRCx CRC Instance
  270. * @retval Value programmed in Programmable Polynomial value register
  271. */
  272. __STATIC_INLINE uint32_t LL_CRC_GetPolynomialCoef(CRC_TypeDef *CRCx)
  273. {
  274. return (uint32_t)(READ_REG(CRCx->POL));
  275. }
  276. /**
  277. * @}
  278. */
  279. /** @defgroup CRC_LL_EF_Data_Management Data_Management
  280. * @{
  281. */
  282. /**
  283. * @brief Write given 32-bit data to the CRC calculator
  284. * @rmtoll DR DR LL_CRC_FeedData32
  285. * @param CRCx CRC Instance
  286. * @param InData value to be provided to CRC calculator between between Min_Data=0 and Max_Data=0xFFFFFFFF
  287. * @retval None
  288. */
  289. __STATIC_INLINE void LL_CRC_FeedData32(CRC_TypeDef *CRCx, uint32_t InData)
  290. {
  291. WRITE_REG(CRCx->DR, InData);
  292. }
  293. /**
  294. * @brief Write given 16-bit data to the CRC calculator
  295. * @rmtoll DR DR LL_CRC_FeedData16
  296. * @param CRCx CRC Instance
  297. * @param InData 16 bit value to be provided to CRC calculator between between Min_Data=0 and Max_Data=0xFFFF
  298. * @retval None
  299. */
  300. __STATIC_INLINE void LL_CRC_FeedData16(CRC_TypeDef *CRCx, uint16_t InData)
  301. {
  302. __IO uint16_t *pReg;
  303. pReg = (__IO uint16_t *)(__IO void *)(&CRCx->DR); /* Derogation MisraC2012 R.11.5 */
  304. *pReg = InData;
  305. }
  306. /**
  307. * @brief Write given 8-bit data to the CRC calculator
  308. * @rmtoll DR DR LL_CRC_FeedData8
  309. * @param CRCx CRC Instance
  310. * @param InData 8 bit value to be provided to CRC calculator between between Min_Data=0 and Max_Data=0xFF
  311. * @retval None
  312. */
  313. __STATIC_INLINE void LL_CRC_FeedData8(CRC_TypeDef *CRCx, uint8_t InData)
  314. {
  315. *(uint8_t __IO *)(&CRCx->DR) = (uint8_t) InData;
  316. }
  317. /**
  318. * @brief Return current CRC calculation result. 32 bits value is returned.
  319. * @rmtoll DR DR LL_CRC_ReadData32
  320. * @param CRCx CRC Instance
  321. * @retval Current CRC calculation result as stored in CRC_DR register (32 bits).
  322. */
  323. __STATIC_INLINE uint32_t LL_CRC_ReadData32(CRC_TypeDef *CRCx)
  324. {
  325. return (uint32_t)(READ_REG(CRCx->DR));
  326. }
  327. /**
  328. * @brief Return current CRC calculation result. 16 bits value is returned.
  329. * @note This function is expected to be used in a 16 bits CRC polynomial size context.
  330. * @rmtoll DR DR LL_CRC_ReadData16
  331. * @param CRCx CRC Instance
  332. * @retval Current CRC calculation result as stored in CRC_DR register (16 bits).
  333. */
  334. __STATIC_INLINE uint16_t LL_CRC_ReadData16(CRC_TypeDef *CRCx)
  335. {
  336. return (uint16_t)READ_REG(CRCx->DR);
  337. }
  338. /**
  339. * @brief Return current CRC calculation result. 8 bits value is returned.
  340. * @note This function is expected to be used in a 8 bits CRC polynomial size context.
  341. * @rmtoll DR DR LL_CRC_ReadData8
  342. * @param CRCx CRC Instance
  343. * @retval Current CRC calculation result as stored in CRC_DR register (8 bits).
  344. */
  345. __STATIC_INLINE uint8_t LL_CRC_ReadData8(CRC_TypeDef *CRCx)
  346. {
  347. return (uint8_t)READ_REG(CRCx->DR);
  348. }
  349. /**
  350. * @brief Return current CRC calculation result. 7 bits value is returned.
  351. * @note This function is expected to be used in a 7 bits CRC polynomial size context.
  352. * @rmtoll DR DR LL_CRC_ReadData7
  353. * @param CRCx CRC Instance
  354. * @retval Current CRC calculation result as stored in CRC_DR register (7 bits).
  355. */
  356. __STATIC_INLINE uint8_t LL_CRC_ReadData7(CRC_TypeDef *CRCx)
  357. {
  358. return (uint8_t)(READ_REG(CRCx->DR) & 0x7FU);
  359. }
  360. /**
  361. * @brief Return data stored in the Independent Data(IDR) register.
  362. * @note This register can be used as a temporary storage location for one 32-bit long data.
  363. * @rmtoll IDR IDR LL_CRC_Read_IDR
  364. * @param CRCx CRC Instance
  365. * @retval Value stored in CRC_IDR register (General-purpose 32-bit data register).
  366. */
  367. __STATIC_INLINE uint32_t LL_CRC_Read_IDR(CRC_TypeDef *CRCx)
  368. {
  369. return (uint32_t)(READ_REG(CRCx->IDR));
  370. }
  371. /**
  372. * @brief Store data in the Independent Data(IDR) register.
  373. * @note This register can be used as a temporary storage location for one 32-bit long data.
  374. * @rmtoll IDR IDR LL_CRC_Write_IDR
  375. * @param CRCx CRC Instance
  376. * @param InData value to be stored in CRC_IDR register (32-bit) between Min_Data=0 and Max_Data=0xFFFFFFFF
  377. * @retval None
  378. */
  379. __STATIC_INLINE void LL_CRC_Write_IDR(CRC_TypeDef *CRCx, uint32_t InData)
  380. {
  381. *((uint32_t __IO *)(&CRCx->IDR)) = (uint32_t) InData;
  382. }
  383. /**
  384. * @}
  385. */
  386. #if defined(USE_FULL_LL_DRIVER)
  387. /** @defgroup CRC_LL_EF_Init Initialization and de-initialization functions
  388. * @{
  389. */
  390. ErrorStatus LL_CRC_DeInit(CRC_TypeDef *CRCx);
  391. /**
  392. * @}
  393. */
  394. #endif /* USE_FULL_LL_DRIVER */
  395. /**
  396. * @}
  397. */
  398. /**
  399. * @}
  400. */
  401. #endif /* defined(CRC) */
  402. /**
  403. * @}
  404. */
  405. #ifdef __cplusplus
  406. }
  407. #endif
  408. #endif /* STM32WBxx_LL_CRC_H */
  409. /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/