查看: 1248|回复: 0

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

[复制链接]
  • TA的每日心情
    开心
    2024-8-5 17:13
  • 签到天数: 333 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2024-6-17 10:42:20 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 xiaoshen-372360 于 2024-6-17 10:42 编辑

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


    00-RNG.png
    在最开始的时候始终都返回失败,经过查找原因,是因为时钟设置设一块忘了做设置。
    好了,我们直接上代码,看看怎么做的初始化。
    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. }
    复制代码
    好了我们来看一下产生随机数的结果吧。


    22.png

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


    回复

    使用道具 举报

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

    本版积分规则

    关闭

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

    手机版|小黑屋|与非网

    GMT+8, 2024-12-4 17:10 , Processed in 0.134537 second(s), 16 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.