在线时间19 小时
UID3174642
ST金币0
蝴蝶豆0
注册时间2015-10-25
中级会员
- 最后登录
- 2019-1-4
|
a0a.1 32b0c
这次的NUCLEO-L476RG学习笔记,为大家带来的是硬件随机数。
STM32F4系列单片机自带了硬件随机数发生器( RNG ), RNG 处理器是一个以连续模拟噪声为基础的 随机数发生器,在主读时提供一个 32 位的随机数。 STM32F4 的随机数发生器构图如图1:
STM32F4的随机数发生器采用模拟电路实现。此电路产生馈入线性反馈移位寄存器 (RNG_LFSR)的种子,用于生成 32 位随机数。
该模拟电路由几个环形振荡器组成,的输出进行异或运算以产生种子。 RNG_LF 由专用时钟 (PLL48CLK) 按恒定频率提供时钟信息,因此随机数质量与 HCLK 频率无关。当将大量种子引入 RNG_LFSR 后, RNG_LFSR 的内容会传入数据寄存器 (RNG_DR) 。同时,系统会监视模拟种子和专用时钟 PLL48CLK,当种子上出现异常序列,或 PLL48CLK 时钟频率过低,可以由 RNG_SR 寄存器的对应位读取到,如果设置了中断则在检测到错误时,还可以产生中断。
随机数发生器操作步骤如下:
1.使能随机数发生器时钟
随机数发生器时钟来自PLL48CK,通过AHB2ENR寄存器使能。
2.势能随机数发生器
通过RNG_CR寄存器的最低位设置为1,使能随机数发生器。
3.判断DRDY位,读取随机数值
每次读取随机数之前,先判断RNG_SR寄存器的DRDY位,如果该位为1.则可以读取RNG_DR得到的随机数。
实现随机数的具体函数(库函数版本):
- u8 RNG_Init(void)//函数功能:初始化RNG
- {
- u16 retry=0;
- RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_RNG, ENABLE);//开启RNG时钟,来自PLL48CLK
- RNG_Cmd(ENABLE); //使能RNG
- while(RNG_GetFlagStatus(RNG_FLAG_DRDY)==RESET&&retry<10000) //等待随机数就绪
- {
- retry++;
- delay_us(100);
- }
- if(retry>=10000)return 1;//随机数产生器工作不正常
- return 0;
- }
- u32 RNG_Get_RandomNum(void)//函数功能:得到随机数。返回值:获取到的随机数
- {
- while(RNG_GetFlagStatus(RNG_FLAG_DRDY)==RESET); //等待随机数就绪
- return RNG_GetRandomNumber();
- }
- int RNG_Get_RandomRange(int min,int max)//函数功能:生成[min,max]范围的随机数
- {
- return RNG_Get_RandomNum()%(max-min+1) +min;
- }
复制代码
以上函数可以成功产生随机数,别忘了添加库函数!!
当然,主函数因人而异,有的朋友喜欢串口打印,有的喜欢显示屏输出,在这里我就不贴出来了。
以后有机会还会和大家分享学习成果!!
|
-
|