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.
 
 
 

480 lines
16 KiB

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