STM32F4学习笔记12——RNG随机数发生器

发布者:CrystalClear最新更新时间:2021-12-08 来源: eefocus关键字:STM32F4  RNG  随机数发生器 手机看文章 扫描二维码
随时随地手机看文章

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不能被正确的检测到

关键字:STM32F4  RNG  随机数发生器 引用地址:STM32F4学习笔记12——RNG随机数发生器

上一篇:STM32F4学习笔记2——时钟与复位系统
下一篇:STM32F4学习笔记11——CRC循环冗余校验

推荐阅读最新更新时间:2024-11-17 09:17

stm32F4XX之独立看门狗 HAL库
1:简介 独立看门狗 (IWDG) 由其专用低速时钟 (LSI) 驱动,因此即便在主时钟发生故障时仍然保持 工作状态。窗口看门狗 (WWDG) 时钟由 APB1 时钟经预分频后提供,通过可配置的时间窗 口来检测应用程序非正常的过迟或过早的操作。 IWDG 最适合应用于那些需要看门狗作为一个在主程序之外,能够完全独立工作,并且对时 间精度要求较低的场合。WWDG 最适合那些要求看门狗在精确计时窗口起作用的应用程序。 独立看门狗的时钟是一个内部 RC时钟,所以并不是准确的 32Khz,而是在 15~47Khz 之间的一个可变化的时钟,只是我们在估算的时候,以 32Khz 的频率来计算,看门狗对时间的要求不是很精确,所以,时
[单片机]
<font color='red'>stm32F4</font>XX之独立看门狗 HAL库
STM32F4xx固件库搭建后编译出错的一种解决办法
最近在学习Stm32F4xx开发板,开始搭建固件库上面已经让我非常烦恼。因为按照之前的教程搭建完固件库后,程序编译总是出现错误。看了一遍发现网上F4xx系列的靠谱的搭建教程不多。 解决方法为:删去固件库的一个外设,路径为Target/FWLIB/stm32f4xx_fmc.c(如下图所示),因为这个外设时给F2和F3系列控制板用的,所以F4系列在编译的时候就会经常报错。 这个是搭建STM32F4xx固件库比较好的一个教程:https://blog.csdn.net/Cowena/article/details/49994743
[单片机]
<font color='red'>STM32F4</font>xx固件库搭建后编译出错的一种解决办法
STM32F407各定时器的时钟频率
TIM1、TIM8~TIM11的时钟为APB2时钟的两倍即168M,TIM2~TIM7、TIM12~TIM14的时钟为APB1的时钟的两倍即84M。
[单片机]
<font color='red'>STM32F4</font>07各定时器的时钟频率
第28章 STM32F429的系统bootloader基础知识
28.1 初学者重要提示 本章主要为大家介绍系统bootloader的理论知识,下个章节为大家实战。 更多系统bootloader的基础知识看本帖的AN2606应用笔记:http://www.armbbs.cn/forum.php?mod=viewthread&tid=96573 28.2 系统bootLoader基础知识 STM32的系统存储区自带bootloader,此程序是ST在芯片出厂时烧录进去的,主要用于将用户应用程序下载到芯片内部Flash。支持USB,SPI,I2C,CAN,UART等接口方式下载。如果大家的应用程序打算采用这种接口方式进行升级,可以考虑采用系统bootloader,简单易用,无需用户自己写b
[单片机]
第28章 <font color='red'>STM32F4</font>29的系统bootloader基础知识
STM32F429i-DISCO 液晶模块
STM32F429i-DISCO 液晶模块 HSD-8189J-E8 STM32F429ZIT6 芯片手册 datasheet: https://my.st.com/content/my_st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32-high-performance-mcus/stm32f4-series/stm32f429-439/stm32f429zi.html 参考手册: RM0090 Reference manual STM32F405/415, STM32F407/417, STM32F427/437 and
[单片机]
<font color='red'>STM32F4</font>29i-DISCO 液晶模块
STM32开发笔记51:STM32F4+DP83848以太网通信指南系列(五)
本章为系列指南的第五章,讲述STM32F407上MAC层以及其DMA的配置。我们在第一章知识储备章节说到,STM32F407会在168MHz主频之外分配一定的时间释放总线数据用来处理DMA,这其中就包含MAC层的DMA,复习一下STM32F4的总线架构图,(图片来自RM0090ST中文STM32F4手册P50): 我们看到,在上图红框标注的的S6阶段,就是MAC层的DMA总线,CPU会在核心逻辑之外,有专门的时间片轮转周期处理这一阶段的DMA,所有的数据读写都是DMA来控制,不需要我们在核心逻辑中编写。 本章的要解决的任务只有一个:能编写一个自己构建的DP83848Init()函数,就像任何类似的UARTInit(),Dela
[单片机]
STM32开发笔记51:<font color='red'>STM32F4</font>+DP83848以太网通信指南系列(五)
STM32F4 RTC的使用
比较F1的片子对于F4的RTC来说有很大提升,F4的RTC提供了日历时钟和两个可编程闹钟中断,一个周期性可编程唤醒标志。这样很方便设置系统时间,并不会像F1的RTC那样要自己计算年月日时分秒。F4的RTC是一个独立的BCD定时计数器,系统可以自动将月份天数补偿为28、29(闰年)、30、31天。并且还可以进行夏令时补偿。 由此可见RTC,下面贴出代码方便以后查看(这里特别提一下RTC_AlarmMask=RTC_AlarmMask_DateWeekDay;//屏蔽日期和星期后设置的日期和星期是无效的,RTC闹钟只会比较设置的时分秒,当时分秒匹配后触发闹钟中断。同样如果设置RTC_AlarmMask=RTC_AlarmMask_No
[单片机]
stm32F407的Systick的问题
最近买了一款stm32f407zgt6的核心板,毫不犹豫地写了一个用定时器点亮led灯的程序(由于程序比较简单就不贴上来了)。在进行1秒闪烁功能实现时,明显发现了led的闪烁时间不对,刚开始是拿手机进行简单的计时,结果显示的是大约3秒的延时(测了10秒亮了两次),在仔细检查代码后,确定不是代码问题(因为代码是用的野火的示例代码) SystemCoreClock是系统预设的系统时钟,在System_stm32f4xx.c文件中查的,f407对应的系统时钟是168mhz 由SysTick_Init()函数,通过计算处理肯定能得到精确的定时,后通过定时器控制GPIO引脚连接至示波器检测,在高电平延时1ms的情况下,
[单片机]
<font color='red'>stm32F4</font>07的Systick的问题
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved