fm33lc0xx_fl_rng.c 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. /**
  2. *******************************************************************************************************
  3. * @file fm33lc0xx_fl_rng.c
  4. * @author FMSH Application Team
  5. * @brief Src file of RNG 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. /* Includes ------------------------------------------------------------------*/
  22. #include "fm33lc0xx_fl_rcc.h"
  23. #include "fm33lc0xx_fl_rng.h"
  24. #include "fm33_assert.h"
  25. /** @addtogroup FM33LC0XX_FL_Driver
  26. * @{
  27. */
  28. /** @addtogroup RNG
  29. * @{
  30. */
  31. /* Private macros ------------------------------------------------------------*/
  32. /** @addtogroup RNG_FL_Private_Macros
  33. * @{
  34. */
  35. #define IS_FL_RNG_INSTANCE(INTANCE) ((INTANCE) == RNG)
  36. #define IS_FL_RNG_CLOCK_PRESCALER(__VALUE__) (((__VALUE__) == FL_RCC_RNG_PSC_DIV1)||\
  37. ((__VALUE__) == FL_RCC_RNG_PSC_DIV2)||\
  38. ((__VALUE__) == FL_RCC_RNG_PSC_DIV4)||\
  39. ((__VALUE__) == FL_RCC_RNG_PSC_DIV8)||\
  40. ((__VALUE__) == FL_RCC_RNG_PSC_DIV16)||\
  41. ((__VALUE__) == FL_RCC_RNG_PSC_DIV32))
  42. /**
  43. *@}
  44. */
  45. /** @addtogroup RNG_FL_EF_Init
  46. * @{
  47. */
  48. /**
  49. * @brief 复位RNG
  50. *
  51. * @param RNGx 外设入口地址
  52. *
  53. * @retval 错误状态,可能值:
  54. * -FL_PASS 外设寄存器值恢复复位值
  55. * -FL_FAIL 未成功执行
  56. */
  57. FL_ErrorStatus FL_RNG_DeInit(RNG_Type *RNGx)
  58. {
  59. assert_param(IS_FL_RNG_INSTANCE(RNGx));
  60. /* 使能外设复位 */
  61. FL_RCC_EnablePeripheralReset();
  62. /* 复位外设寄存器 */
  63. FL_RCC_EnableResetAPB2Peripheral(FL_RCC_RSTAPB_RNG);
  64. FL_RCC_DisableResetAPB2Peripheral(FL_RCC_RSTAPB_RNG);
  65. /* 关闭外设总线始时钟和工作时钟 */
  66. FL_RCC_DisableGroup2BusClock(FL_RCC_GROUP2_BUSCLK_RNG);
  67. /* 锁定外设复位 */
  68. FL_RCC_DisablePeripheralReset();
  69. return FL_PASS;
  70. }
  71. /**
  72. * @brief 配置RNG
  73. *
  74. * @param RNGx 外设入口地址
  75. * @param initStruct 指向 @ref FL_RNG_InitTypeDef 结构体的指针
  76. *
  77. * @note RNG使用RCHF默认的8M作为时钟输入,经2分频后4M提供给RNG
  78. *
  79. * @retval 错误状态,可能值:
  80. * -FL_PASS 配置成功
  81. * -FL_FAIL 配置过程发生错误
  82. */
  83. FL_ErrorStatus FL_RNG_Init(RNG_Type *RNGx)
  84. {
  85. assert_param(IS_FL_RNG_INSTANCE(RNGx));
  86. /* RNG 使用RCHF作为工作时钟因此必须确认RCHF使能*/
  87. if(FL_RCC_RCHF_IsEnabled() != FL_SET)
  88. {
  89. FL_RCC_RCHF_Enable();
  90. }
  91. FL_RCC_EnableGroup2BusClock(FL_RCC_GROUP2_BUSCLK_RNG);
  92. /* RNG 工作时钟预分频*/
  93. switch(FL_RCC_RCHF_GetFrequency())
  94. {
  95. case FL_RCC_RCHF_FREQUENCY_8MHZ:
  96. FL_RCC_SetRNGPrescaler(FL_RCC_RNG_PSC_DIV2);
  97. break;
  98. case FL_RCC_RCHF_FREQUENCY_16MHZ:
  99. FL_RCC_SetRNGPrescaler(FL_RCC_RNG_PSC_DIV4);
  100. break;
  101. case FL_RCC_RCHF_FREQUENCY_24MHZ:
  102. FL_RCC_SetRNGPrescaler(FL_RCC_RNG_PSC_DIV8);
  103. break;
  104. default:
  105. FL_RCC_SetRNGPrescaler(FL_RCC_RNG_PSC_DIV2);
  106. break;
  107. }
  108. /* RNG 工作时钟使能*/
  109. FL_RCC_EnableGroup2OperationClock(FL_RCC_GROUP2_OPCLK_RNG);
  110. return FL_PASS;
  111. }
  112. /**
  113. * @brief 获取一次随机数
  114. *
  115. * @note 如果返回值为0xFFFFFFFF 则说明随机数生成失败,请用户检查此函数的返回值,失败时重新生成
  116. *
  117. * @retval 生成的随机数,生成失败返回0xFFFFFFFF
  118. *
  119. */
  120. uint32_t GetRandomNumber(void)
  121. {
  122. uint32_t rn32;
  123. FL_RNG_ClearFlag_RandomFail(RNG);
  124. FL_RNG_Enable(RNGCTL);
  125. /* 由于LFSR循环移位周期是32cycle,为保证随机数质量,应用应保证两次读取RNGOUT之间的间隔大于32个TRNG_CLK周期 */
  126. FL_DelayUs(12);
  127. FL_RNG_Disable(RNGCTL);
  128. rn32 = FL_RNG_ReadData(RNG);
  129. if(FL_RNG_IsActiveFlag_RandomFail(RNG))
  130. {
  131. FL_RNG_ClearFlag_RandomFail(RNG);
  132. return 0xFFFFFFFF;
  133. }
  134. return rn32;
  135. }
  136. /**
  137. * @brief 获取CRC32
  138. *
  139. * @param dataIn 待计算的数据
  140. *
  141. * @retval 计算得到的CRC32,计算失败返回0xFFFFFFFF
  142. *
  143. */
  144. uint32_t GetCrc32(uint32_t dataIn)
  145. {
  146. uint32_t i = 0;
  147. uint32_t crc32 = 0;
  148. FL_RNG_CRC_WriteData(RNG, dataIn);
  149. FL_RNG_ClearFlag_CRCComplete(RNG);
  150. FL_RNG_CRC_Enable(RNG);
  151. while(0 == FL_RNG_IsActiveFlag_CRCComplete(RNG))
  152. {
  153. i++;
  154. if(i > 600)
  155. { break; }
  156. }
  157. if(i >= 600)
  158. {
  159. FL_RNG_ClearFlag_CRCComplete(RNG);
  160. FL_RNG_Disable(RNGCTL);
  161. return 0xFFFFFFFF;
  162. }
  163. FL_RNG_ClearFlag_CRCComplete(RNG);
  164. crc32 = FL_RNG_ReadData(RNG);
  165. FL_RNG_Disable(RNGCTL);
  166. return crc32;
  167. }
  168. /**
  169. *@}
  170. */
  171. /**
  172. *@}
  173. */
  174. /**
  175. *@}
  176. */
  177. /******************************************* END OF FILE *******************************************/