RNG硬件随机数(随机数发生器、真随机和伪随机、应用场景、RNG结构和原理、RNG相关寄存器和HAL库驱动、RNG基本驱动步骤)

参考

http://t.csdnimg.cn/vMMrP

一、RNG简介

在这里插入图片描述
在这里插入图片描述
随机数发生器(RNG)在计算机科学和密码学中具有广泛的应用场景,包括但不限于以下几个方面:
1.验证码:在网络安全和用户验证中,随机数用于生成验证码,增加系统的安全性,防止机器人攻击和恶意访问。
2.密码学:随机数在密码学中扮演着重要角色,用于生成密钥、初始化向量(IV)和盐等,增加加密算法的安全性。
3.概率学和统计学:随机数被用于模拟概率分布和随机变量,进行蒙特卡罗模拟、蒙特卡罗积分等,用于解决统计学和概率学中的问题。
4.游戏:在游戏开发中,随机数被广泛用于生成游戏中的随机事件、随机地图、随机怪物属性等,增加游戏的趣味性和挑战性。

随机数的重要特性是无法预测的、无规律性的、独立分布的。真随机数由物理过程生成,具有完全随机的性质,而伪随机数则是通过确定性算法计算出来的,虽然看起来像是随机的,但是在一定条件下可能会被预测到。在安全性要求较高的场景中,通常会使用真随机数发生器。

二、RNG框图介绍

在这里插入图片描述
在这里插入图片描述

RNG(Random Number Generator)采用模拟电路实现,其基本原理如下:
1.模拟电路结构:RNG通常由几个环形振荡器组成。这些振荡器的输出经过异或运算,产生种子(seed),作为随机数生成的初始值。
2.LFSR(线性反馈移位寄存器):LFSR类似于一个“生产车间”,接收大量的种子输入。种子通过LFSR处理后,其内容传送到RNG数据寄存器(RNG_DR),用于随机数的生成。
3.时钟检查器和故障检测器:类似于“质检”,时钟检查器和故障检测器负责检测种子是否出现异常序列以及fpll48clk是否过低。这些异常情况会在RNG_SR寄存器的相关位显示,并可以触发中断。
4.中断功能:RNG通常设置了中断功能,当种子出现异常序列或fpll48clk过低时,会产生中断信号,以便系统进行相应的处理或响应。

总体而言,RNG通过模拟电路实现,利用环形振荡器、LFSR和时钟检查器等组件,生成随机数种子,并在检测到异常情况时产生中断,确保随机数生成的安全性和可靠性。

三、RNG相关寄存器介绍

在这里插入图片描述

在这里插入图片描述

这是RNG模块的关键寄存器及其作用:
1.RNG_CR(RNG控制寄存器):
用途:控制随机数发生器的启用和中断的使能。
作用:通过设置该寄存器的位来启用或禁用随机数发生器,并控制中断功能的使能。

2.RNG_SR(RNG状态寄存器):
用途:显示RNG当前的一些状态信息。
作用:该寄存器的特定位用于显示RNG模块的状态,例如随机数生成完成、时钟故障等。

3.RNG_DR(RNG数据寄存器):
用途:存储生成的32位随机数值。
作用:随机数生成器生成的随机数会被存储在该寄存器中,供后续程序使用。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四、RNG相关HAL库驱动介绍

在这里插入图片描述
在这里插入图片描述

这是与RNG模块相关的驱动函数及其功能描述以及关联的寄存器:
1.HAL_RNG_Init(…):
关联寄存器:RNG_CR
功能描述:用于初始化RNG模块,配置RNG控制寄存器,启用或禁用随机数发生器以及中断。

2.HAL_RNG_MspInit(…):
初始化回调
功能描述:在初始化过程中调用,用于初始化RNG模块的外设、时钟和选择时钟源等。

3.HAL_RCCEx_PeriphCLKConfig(…):
关联寄存器:RCC_BDCR
功能描述:设置RNG模块的时钟源,通常设置为PLL。

4.HAL_RNG_GenerateRandomNumber(…):
关联寄存器:RNG_DR
功能描述:用于生成随机数,会检查DRDY位以确定是否有随机数可用,并读取随机数。

5.__HAL_RCC_RNG_CLK_ENABLE(…):
关联寄存器:AHB2ENR
功能描述:使能RNG模块的时钟,确保RNG模块能够正常工作。

6.__HAL_RNG_GET_FLAG(…):
关联寄存器:RNG_SR
功能描述:用于获取RNG模块相关的标记,例如随机数生成完成标志位等。

五、RNG基本驱动步骤

在这里插入图片描述
在这里插入图片描述
RNG基本驱动步骤:
1.使能RNG时钟:
使用 __HAL_RCC_RNG_CLK_ENABLE() 函数来启用RNG模块的时钟。

2.初始化随机数发生器:
使用 HAL_RNG_Init() 函数初始化RNG模块,配置RNG控制寄存器等。
在初始化过程中,需要调用 HAL_RNG_MspInit() 函数来初始化RNG模块的外设、时钟以及选择时钟源等设置,可能需要使用 HAL_RCCEx_PeriphCLKConfig() 函数来配置RNG模块的时钟源。

3.读取随机数值:
使用 HAL_RNG_GenerateRandomNumber() 函数来生成随机数。
在生成随机数之前,通常会判断 DRDY 位,以确保随机数已经就绪可以读取。

六、编程实战

在这里插入图片描述

  • 17
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值