STM32——RNG随机数

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

RNG随机数配置步骤:
(1)使能RNG时钟

RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_RNG,ENABLE);

(2)使能RNG(开启RNG)

RNG_Cmd(ENABLE);//使能RNG

(3)判断DRDY位,读取随机数值

FlagStatus RNG_GetFlagStatus(uint8_t RNG_FLAG);

库函数中,判断数据是否有效的入口参数为 RNG_FLAG_DRDY,所以等待就绪的方法为:

while(RNG_GetFlagStatus(RNG_FLAG_DRDY)==0)  //等待DRDY稳定

判断数据有效后,我们读取随机数发生器产生的随机数即可,调用函数为:

uint32_t RNG_GetRandomNumber(void); 

rng.c

#include "rng.h"
#include "sysTick.h"

u8 RNG_Init(void)    //返回0 初始化成功,返回1初始化失败
{
		u16 i;
	
			//使能RNG时钟
			RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_RNG,ENABLE);  //时钟是专用的PLL时钟,化解到AHB2总线上
			
			//使能RNG
			RNG_Cmd(ENABLE);//使能RNG
			
			while(RNG_GetFlagStatus(RNG_FLAG_DRDY)==0){  //等待DRDY稳定,稳定之后不为0,返回1
					
					i++;
					myDelay_us(100);				
				  if(i >= 10000){
									return 1;       //超时强制返回
					}
						
			}
		
			return 0;     
}


//读取数值函数
u32 RNG_Get_RandomNum(void)
{
		while(RNG_GetFlagStatus(RNG_FLAG_DRDY)==0);   //等待稳定

    return RNG_GetRandomNumber();    //获取并返回数值
	
}

//对32位数据进行处理
int RNG_Get_RandnomRange(int min,int max)     //min 0    max  100
{
			return min +  RNG_Get_RandomNum()%(max-min+1);   //使数据位于某个范围
}




main.c

#include "system.h"
#include "SysTick.h"
#include "led.h"
#include "usart.h"
#include "input.h"
#include "touch.h"
#include "rng.h"


int main()
{
	u8 i=0;
	
	
	SysTick_Init(168);
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  //中断优先级分组 分2组
	LED_Init();
	USART1_Init(9600);
  
	while(RNG_Init()){    //返回为1失败,返回为0成功
	
			printf("rng error!\n\r");
	}
	printf("rng init success\n\r");
	
	
	
	while(1)
	{
    
		i++;
		if(i%20==0)
		{
			led1=!led1;
			printf("产生一个0-100随机数为%d\n\r",RNG_Get_RandnomRange(0,100));
		}
		myDelay_ms(10);
	}
}

		 


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值