??此文档作为对洋桃电子STM32F407单片机视频的整理,B站链接:第32集)RNG随机数发生器_哔哩哔哩_bilibili
????????随机数功能可用于密码、验证码、随机码生成,在系统安全、身份验证、数据加密等应用中被广泛使用。
????????随机数的生成有两种方式:伪随机数和真随机数。伪随机数是通过单片机的定时器或RTC数据生成随机数值的种子,然后再通过随机数算法把种子数值转换成一个可用的随机数,在C语言的stdlib.h库中包含着srand和rand函数可以配合产生伪随机数,伪随机数只是看似没有规律但实际上是有可被破解的算法,对安全性要求高的场合则需要采用真随机数方式。
????????STM32F4系列内置了一个真随机数发生器,英文简写为RNG。由单片机内部的模拟电路产生不可预知的噪声信号,然后将噪声转换成随机数值,这样产生的随机数完全没有规律可寻,所以称为真随机数。
????????从简介中可以看出RNG发生器是一个模拟噪声电路实现的随机数发生器,将无规律的模拟噪声转换成32位随机数存放在RNG专用的32位寄存器中,从21.2节中可以看出RNG的主要特性。
????????从图中左上角是RNG_CR控制寄存器,用于设置RNG的开启、关闭和模式,图中右下角的模拟种子是模拟噪声电路,可以产生随机数的基础数值所以称为模拟种子,模拟种子产生的值送入LFSR进一步处理成32位数值存放到RNG_DR数据寄存器,同时将当前状态信息写入RNG_SR状态寄存器,当一个采集周期结束我们就可以从RNG_DR数据寄存器中读出一个32位随机数,当我们不再需要随机数时可通过RNG_CR控制寄存器来关闭RNG功能,这就是RNG功能的内部结构。但需注意在应用层面我们将使用HAL库函数对RNG进行开启、关闭和数据读取,不会涉及底层寄存器的操作。
????????在main.c文件第75行创建一个用于存放随机数的32位变量,在主循环的第106行添加读取随机数函数HAL_RNG_GetRandomNumber,此函数的参数是RNG功能的句柄,返回值是32位随机数。所以将返回值赋值到变量a中,第107行将32位随机数发送到超级终端,第108行是延时一秒函数,即每秒中输出一次随机数。
程序运行后在超级终端软件上每秒输出一个32位随机数。
由于随机数寄存器是32位的,产生的随机数范围是0x00000000~0xFFFFFFFF,如果在项目开发中需要得到一个小范围的随机数,可以把得出的32位随机数用求余数的方式限制范围。
????????比如要得到0~9之间的随机数值,可在第106行读出随机数后在第107行添加“a=a%10”运算即得到0~9范围的随机数。
????????如果要得到20~29之间的随机数可在第107行添加“a=a%10+20”运算,按此方法可以得到任何范围的随机数。