这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » NUCLEO-U083RC学习历程11-简单调试随机数发生器

共1条 1/1 1 跳转至

NUCLEO-U083RC学习历程11-简单调试随机数发生器

助工
2024-12-16 18:41:38     打赏

一:随机数发生器(RNG)介绍:

 STM32的RGN(Random Number Generator,随机数发生器),是一个以连续模拟噪声为基础的随机数发生器,在主机读数时提供一个由模拟量发生器产生的 32 位随机数。

    RGN由实时熵源(模拟)和内部调节组件组成,它将全熵输出作为32位样本提供给应用程序。通常MCU中去读取两个连续随机数的间隔为 40 个 PLL48CLK时钟信号周期。产生随机数的模拟量发生器,由几个环形振荡器组成,振荡器的输出进行异或运算以产生馈入线性反馈移位寄存器(RNG_LFSR)种子,这些种子用于生成 32 位随机数。RGN支持中断功能,通过检测状态位(RNG_SR 寄存器),检测种子异常(RNG_FLAG_SECS)、时钟异常(RNG_SR_CECS)等现象,检测到错误时生成中断。

二:STM32cbue 软件配置过程:

在原串口输出功能工程上,增加RNG工程的底层驱动配置

2.1在STM32cube软件中开启RNG的功能比较简单,只需要打开RNG的功能按钮就可以了,如下所示:

11.png

2.2打开RNG的使能中断,并配置其中断的优先级别

2.3 RNG的可以来自三个不同的时钟源,我们可以在时钟树的配置界面,对RNG的时钟来源进行配置,时钟的大小可以通过倍频器,分频系数进行设置,这里我设置的是选择内部的时钟来源,如下图界面所示:

15.png

然后点击生成代码功能即可。

三:软件代码介绍:

3.1 RNG函数的初始化:

在RNG初始化函数中,完成生成RNG句柄 hrng的配置函数,调用底层驱动函数hal_RNG_Init()的初始化部分,虽然底层驱动函数中存在hal_RNG_Init(),不过是hal库中的弱定义函数,根据实际配置CubeMX会生成新的函数,完成真正的MCU底层设置任务(MspInit,MCU Specific Package init,即指和MCU相关的初始化),覆盖原来的弱函数,而在HAL_RNG_Init函数中会调用到HAL_RNG_MspInit函数。

static void MX_RNG_Init(void)
{

  /* USER CODE BEGIN RNG_Init 0 */

  /* USER CODE END RNG_Init 0 */

  /* USER CODE BEGIN RNG_Init 1 */

  /* USER CODE END RNG_Init 1 */
  hrng.Instance = RNG;
  hrng.Init.ClockErrorDetection = RNG_CED_ENABLE;
  if (HAL_RNG_Init(&hrng) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN RNG_Init 2 */

  /* USER CODE END RNG_Init 2 */

}

在原函数中,添加对随机数的读取函数,如下所示:

需要在主函数添加读取随机数函数:HAL_RNG_GenerateRandomNumber();如下图代码所示:

  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
    HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
    /* Insert delay 500ms */
    HAL_Delay(500);
//		HAL_UART_Transmit(&hlpuart1,OUTPUT_str,sizeof(OUTPUT_str),100);
		printf("Hello STM32! Hello keyboard007! Hello STM32U083RC!\r\n");


      if (HAL_RNG_GenerateRandomNumber(&hrng, &aRandom32bit) != HAL_OK)
      {
        /* Random number generation error */
        Error_Handler();
      }
		printf("aRandom32bit=%16d\r\n",aRandom32bit);

  }

我们也可以调用下面两个hal库的函数,对RNG随机数进行读取。

HAL_StatusTypeDef HAL_RNG_GenerateRandomNumber_IT(RNG_HandleTypeDef *hrng);
uint32_t HAL_RNG_ReadLastRandomNumber(const RNG_HandleTypeDef *hrng);

由于我们在之前,已经对printf函数成功,操作过,这里我们直接调用输出即可,输出效果图如下所示:

试验现象:串口检测函数每500ms,输出RNG随机数的数值。

16.png

测试代码如下:





关键词: NUCLEO-U083RC     串口输出     RNG    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]