回答

收藏

[评测分享] 【NUCLEO-U083RC试用】-03-随机数生成(TRNG)的使用

#板卡评测 #板卡评测 2357 人阅读 | 0 人回复 | 2024-06-17

本帖最后由 xiaoshen-372360 于 2024-6-17 10:42 编辑

RNG是一个真正的随机数生成器,它将全熵输出作为32位样本提供给应用程序。它由一个活熵源(模拟)和一个内部调节组件组成,其实随机数生成还是又哭可以调用的,但是这个U083的随机数生成器是由硬件生成的,这个的话就是不需要那么多的软件资源了,那么我们就来测试一下吧。
先看看RNG的框图,由框图来说其实很简单,相当于使用了模拟量的噪声,来完成随机数的生成,使用多个随机的模拟量作为样本,进行异或操作,在经过裸机处理之后生成一个32位的随机数。因为噪声本来就是不规律,没有规律可循的,变换因素太多,所以作为随机数的产生是相对合理的操作。


在最开始的时候始终都返回失败,经过查找原因,是因为时钟设置设一块忘了做设置。
好了,我们直接上代码,看看怎么做的初始化。
  1. #include "RNG.h"



  2. RNG_HandleTypeDef hrng;

  3. void MX_RNG_Init(void)
  4. {
  5.         __HAL_RCC_RNG_CLK_ENABLE();

  6.         RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};

  7.         PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_RNG;
  8.         PeriphClkInit.RngClockSelection = RCC_RNGCLKSOURCE_MSI;
  9.         HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);

  10.   
  11.        
  12.         hrng.Instance = RNG;
  13.   hrng.Init.ClockErrorDetection = RNG_CED_ENABLE;
  14.   if (HAL_RNG_Init(&hrng) != HAL_OK)
  15.   {
  16.       printf("RNG Init Failed !\r\n");
  17.   }
  18.         else
  19.         {
  20.     printf("RNG InitSuccessed !\r\n");
  21.         }
  22. }



  23. int  Get_RNG_Data(void)
  24. {
  25.    unsigned int Data=0;
  26.    HAL_RNG_GenerateRandomNumber(&hrng, &Data);
  27.         return Data;
  28. }
复制代码
完成初始化之后,我们需要在主函数里面进行打印。

  1. #include "stm32u0xx_hal.h"
  2. #include "LP_UART.h"
  3. #include "LP_TIM.h"
  4. #include "RNG.h"
  5. static GPIO_InitTypeDef  GPIO_InitStruct;

  6. /* USER CODE END PV */

  7. /* Private function prototypes -----------------------------------------------*/
  8. void SystemClock_Config(void);

  9. int main(void)
  10. {

  11.   HAL_Init();
  12.   SystemClock_Config();
  13.   __HAL_RCC_GPIOA_CLK_ENABLE();
  14.   /* -2- Configure IO in output push-pull mode to drive external LEDs */
  15.   GPIO_InitStruct.Mode  = GPIO_MODE_OUTPUT_PP;
  16.   GPIO_InitStruct.Pull  = GPIO_NOPULL;
  17.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;

  18.   GPIO_InitStruct.Pin = GPIO_PIN_5;
  19.   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  20.         LP_UART_Init();
  21.         LP_TIM_Init();
  22.         MX_RNG_Init();
  23.   while (1)
  24.   {
  25.                   printf("RNGDATA is :%d\r\n",Get_RNG_Data());
  26.                   HAL_Delay(500);
  27. //            printf("RNG DATA is ");
  28.                
  29.   }
  30.   /* USER CODE END 3 */
  31. }
复制代码
好了我们来看一下产生随机数的结果吧。



到这里,我们就可以看到产生随机数是没有规律可循的,正负数也都是随机的。


分享到:
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条