访问手机版页面
你的位置:老古开发网 > STM32单片机 > STM32单片机教程 > 正文  
STM32F4学习笔记12——RNG随机数发生器
内容导读:
RNG主要特性RNG 处理器是一个以连续模拟噪声为基础的随机数发生器,在主机读数时提供一个 32 位的 随机数。RNG的主要特性● 提供由模拟量发生器产生的 32 位随机数● 两个连续随机数的间隔为 40 个 PLL48CLK 时钟信号

RNG主要特性
RNG 处理器是一个以连续模拟噪声为基础的随机数发生器,在主机读数时提供一个 32 位的 随机数。

RNG的主要特性
● 提供由模拟量发生器产生的 32 位随机数
● 两个连续随机数的间隔为 40 个 PLL48CLK 时钟信号周期
● 通过监视 RNG 熵来标识异常行为(产生稳定值,或产生稳定的值序列)
● 可被禁止以降低功耗

RNG功能描述

随机数发生器采用模拟电路实现。此电路产生馈入线性反馈移位寄存器 (RNG_LFSR) 的种子, 用于生成 32 位随机数。
该模拟电路由几个环形振荡器组成,振荡器的输出进行异或运算以产生种子。RNG_LFSR 由 专用时钟 (PLL48CLK) 按恒定频率提供时钟信息,因此随机数质量与 HCLK 频率无关。当将 大量种子引入 RNG_LFSR 后,RNG_LFSR 的内容会传入数据寄存器 (RNG_DR)。
同时,系统会监视模拟种子和专用时钟 PLL48CLK。状态位(RNG_SR 寄存器中)指示何时 在种子上出现异常序列,或指示何时 PLL48CLK 时钟频率过低。检测到错误时生成中断。

操作
要运行 RNG,请按以下步骤操作:
1.如果需要,使能中断(为此,将 RNG_CR 寄存器中的 IE 位置 1)。准备好随机数时或 出现错误时生成中断。
2. 通过将 RNG_CR 寄存器中的 RNGEN 位置 1 使能随机数产生。这会激活模拟部分、RNG_LFSR 和错误检测器。
3. 每次中断时,检查确认未出现错误(RNG_SR 寄存器中的 SEIS 和 CEIS 位应为 0), 并且随机数已准备就绪(RNG_SR 寄存器中的 DRDY 位为 1)。然后即可读取 RNG_DR 寄存器中的内容。
按照 FIPS PUB(联邦信息处理标准出版物)140-2 的要求,将 RNGEN 位置 1 后产生的第 一个随机数不应使用,但应保存起来,与产生的下一个随机数进行比较。随后产生的每个随机数都需要与产生的上一个随机数进行比较。如果任何一对进行比较的数字相等,则测试失败(连续随机数发生器测试)

错误管理
如果 CEIS 位的值为 1(时钟错误)
出现时钟错误时,RNG 无法再产生随机数,因为 PLL48CLK 时钟不正确。检查时钟控制器是 否正确配置,是否可提供 RNG 时钟,然后将 CEIS 位清零。当 CECS 位为 0 时,RNG 可正 常工作。时钟错误对产生的上一个随机数没有影响,因此 RNG_DR 寄存器内容可以使用。
如果 SEIS 位的值为 1(种子错误)
出现种子错误时,只要 SECS 位为 1,就会中断随机数产生。如果 RNG_DR 寄存器中有可 用随机数,不能使用该随机数,因为它可能没有足够的熵。
应执行以下操作:将 SEIS 位清零,然后将 RNGEN 位清零并置 1,以便重新初始化和重新 启动 RNG。

STM32F4的RNG库
如何使用RNG驱动
1.通过函数RCC_AHB2PeriphClockCmd(RCC_AHB2Perph_RNG,ENABLE)使能RNG控制器时钟。
2.通过函数RNG_Cmd()使能RNG。
3.等待直到随机数发生器产生有效的随机数(中断或查询模式)。
4.通过函数RNG_GetRandomNumber()得到随机数。
从上面第三步开始继续得到后面的随机数。

初始化和配置函数
这部分函数主要提供以下功能
· 初始化RNG外设
· 使能或禁止RNG外设。
void RNG_DeInit()功能:从新初始化RNG外设寄存器数据到复位值。
void RNG_Cmd(FunctionanState NewState)功能:使能或禁止RNG

得到32位随机数函数
uint32_t RNG_GetRandomNumber(void)
函数功能:返回32位随机数
调用此函数之前需要等待直到DRDY标志置位,调用函数RNG_GetFlagStatus(RNG_FLAG_DRDY)进行等待标志位。每次在的调用RNG_GetrandomNumber(void)后RNG_FLAG_DRDY标志自动清除。
在seed错误的情况下只要SECS位是1,随机数产生将被中断。如果RNG_DR寄存器中有数据可用,但是请不要使用,应为没有足够的entopy。这种情况下推荐用户通过函数RNG_ClearFlag(RNG_FLAG_SECS)清除SEIS标志,然后禁止并重新使能RNG外设(通过函数RNG_Cmd())来从新初始化和启动RNG。
在时钟错误的情况下,应为PLL48CLK时钟的不准确,RNG将无法产生随机数。检查是否正确配置时钟控制器RNG时钟,同时清除CEIS(通过函数RNG——ClearFlag(RNG_FLAG_CECS))位。当CECS位是0的时候RNG次啊能正常工作。时钟错误对先前残生的随机数没有影响,RNG_DR寄存器中的数据仍然可以使用。

中断标志管理
· 标志
RNG_FLAG_DRDY:RNG_DR寄存器有有效随机数时,通过读此寄存器来清除标志(可通过函数RNG_GetRandomNumber()实现)。
RNG_FLAG_CECS:seed检测错误
RNG_FLAG_SECS:时钟检测错误
· 中断
如果是能了RNG中断,下面三种情况僵尸的RNG中断会被挂起。
RNG_DR寄存器含有有效的随机数,只有通过读RNG_DR寄存器才能清除中断源,也就是清除中断挂起标志。
发生seed错误,检测到下面的错误序列之一:
64个以上的的连续位都是0或者1
32个以上出现连续的01.
通过函数RNG_ClearITPendingBit(RNG_IT_SEI)清除此中断源。
发生时钟错误,PLL48CLK不能被正确的检测到


标签: rng,stm32f4,随机数发生器,
来源:互联网 作者:karen 时间:2018/8/27 10:40:01
相关阅读
推荐阅读
阅读排行
最近更新
商品推荐