当前位置: 代码迷 >> 综合 >> RNG-硬件随机数发生器-STM32F4
  详细解决方案

RNG-硬件随机数发生器-STM32F4

热度:86   发布时间:2023-12-15 23:04:31.0

使用芯片===>STM32F429IGT6

使用串口输出一组随机数,随机数范围(1-50)

(制作不易,希望大佬能给个赞支持下小丁)


目录

一、RNG-硬件随机数发生器简介

1、随机数发生器框图

2、相关寄存器

二、实验程序

1、main.c

2、rng.c

3、rng.h

三、实验结果

四、结束语


一、RNG-硬件随机数发生器简介

STM32自带了硬件随机数发生器(RNG),RNG处理器是一个以连续模拟噪声为基础的随机数发生器,在主机读数时提供一个32位的随机数。 两个连续的随机数的间隔为40个PLL48CLK时钟信号周期。 通过监控RNG熵来标识异常行为。 可以禁止来降低功耗。

1、随机数发生器框图

①、控制寄存器就是设置一些参数,状态寄存器来反映出相对的状态,RNG_CLk来提供时钟(不是框图的核心)。

②、核心为模拟种子,模拟种子表示这个随机数是怎么发生的。

③、模拟种子产生的随机数,随机数会保存到LFSR这个寄存器里面,当随机数在LFSR存储完成后,会将随机数传输到RNG_DR数据寄存器中。然后我们就可以将随机数从RNG_DR中读取出来。

④、在产生随机数的过程中,可以通过“时钟检查器和故障检测器”来检查是否出现故障,随机数是否正常的输出等。

2、相关寄存器

①、控制寄存器RNG_CR

②、状态寄存器RNG_SR

③、数据寄存器RNG_DR


二、实验程序

首先对随机数函数进行初始化,随后获取随机数,将获取到的随机数通过公式转换为相应应范围内的随机数,并把两个数一起输出出来

随机数转换到相应范围内的随机数,是通过将随机数在范围内的  "(最大值-最小值+1)取余+最小值"  得到的。

1、main.c

/**************************************************************************
**作者:        小丁工程               
**时间:        2021.01.16
***************************************************************************/
#include "sys.h"
//---------------------主函数-------------------------------------------------int num,nums;
int main(void)
{HAL_Init();//========================初始化HAL库   Stm32_Clock_Init(360,25,2,8);//======设置时钟,180Mhzdelay_init(180);//===================初始化延时函数uart_init(115200); 	while(RNG_Init())	 		    //初始化随机数发生器{ delay_ms(200);printf("RNG Trying...\r\n");} while(1){delay_ms(10);num=RNG_Get_RandomNum(); //获得随机数nums=RNG_Get_RandomRange(1,50);	printf("%d----%d\r\n",num,nums);} 	
}
//---------------------end-----------------------------------------------------

2、rng.c

#include "rng.h"
#include "delay.h"RNG_HandleTypeDef RNG_Handler;  //RNG句柄//初始化RNG
u8 RNG_Init(void)
{u16 retry=0;RNG_Handler.Instance=RNG;HAL_RNG_Init(&RNG_Handler);//初始化RNGwhile(__HAL_RNG_GET_FLAG(&RNG_Handler,RNG_FLAG_DRDY)==RESET&&retry<10000)//等待RNG准备就绪{retry++;delay_us(10);}if(retry>=10000) return 1;//随机数产生器工作不正常return 0;
}
void HAL_RNG_MspInit(RNG_HandleTypeDef *hrng)
{__HAL_RCC_RNG_CLK_ENABLE();//使能RNG时钟
}
//得到随机数
//返回值:获取到的随机数
u32 RNG_Get_RandomNum(void)
{return HAL_RNG_GetRandomNumber(&RNG_Handler);
}//生成[min,max]范围的随机数
int RNG_Get_RandomRange(int min,int max)
{ return HAL_RNG_GetRandomNumber(&RNG_Handler)%(max-min+1) +min;
}

3、rng.h

#ifndef __RNG_H
#define __RNG_H
#include "sys.h"u8  RNG_Init(void);			//RNG初始化 
u32 RNG_Get_RandomNum(void);//得到随机数
int RNG_Get_RandomRange(int min,int max);//生成[min,max]范围的随机数
#endif

三、实验结果

每次输出的头一个数为单片机产生的随机数,第二个数是转换后1-50的随机数。



四、结束语

这个例程相对来说还是比较简单的,希望能对你有些帮助。

(例程及相关资料参考于-->原子光盘,侵删)