硬件随机数发生器

本文详细介绍了STM32F4的硬件随机数发生器(RNG)的工作原理,包括其内部结构、寄存器配置和中断处理。RNG通过模拟电路产生随机数,数据存储在RNG_DR寄存器中。文中还提供了RNG的初始化、启用、获取随机数等库函数的使用示例,并展示了如何通过中断处理错误状态。实验代码演示了如何在实际应用中获取并显示随机数。
摘要由CSDN通过智能技术生成

RNG-硬件随机数发生器

硬件随机数发生器(RNG),以连续模拟噪声为基础的随机数发生器,在主机读数时提供一个32位的随机数。
两个连续的随机数的间隔为40个PLL48CLK时钟信号周期
通过监控RNG熵来标识异常行为
在这里插入图片描述
由模拟种子产生随机数保存在LFSR里面,数据再一次性发送到RNG_DR寄存器中。

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

RNG寄存器

控制寄存器 RNG_CR

在这里插入图片描述

位31:4保留,必须保持复位值
位3 IE:中断使能(Interrupt enable)
0:禁止RNG中断。
1:使能 RNG中断。只要 RNG_SR寄存器中 DRDY=1或 SEIS=1或CEIS=1,就会引起中断。
位2 RNGEN:随机数发生器使能
0:禁止随机数发生器。
1:使能随机数发生器。
位1:0保留,必须保持复位值

状态寄存器 RNG_SR

在这里插入图片描述
位6 SEIS:种子错误中断状态
0:未检测到错误序列
1:检测到以下错误序列之一:
位5 CEIS:时钟错误中断状态(Clock error interrupt status)
0:正确检测到PLL48CLK时钟1:未正确检测到PLL48CLK时钟
位2 SECS:种子错误当前状态(Seed error current status)
0:目前未检测到错误序列。1:检测到以下错误序列
位1CECS:时钟错误当前状态(Clock error curent status)
0:正确检测到PLL48CLK时钟。1:来正确检测到PLL48CLK时钟
位0 DRDY:数据就绪(Data ready)
0:RNG_DR寄存器尚未有效,无可用随机数据1: RNG_DR寄存器包含有可用随机数

数据寄存器RNG_DR

在这里插入图片描述
位31:0 RNDATA:随机数据
32位随机数据

RNG库函数
void RNG_DeInit(void)//复位
{
  RCC_AHB2PeriphResetCmd(RCC_AHB2Periph_RNG, ENABLE);
  RCC_AHB2PeriphResetCmd(RCC_AHB2Periph_RNG, DISABLE);
}
void RNG_Cmd(FunctionalState NewState)//使能
{
  assert_param(IS_FUNCTIONAL_STATE(NewState));

  if (NewState != DISABLE)
  {
    /* Enable the RNG */
    RNG->CR |= RNG_CR_RNGEN;
  }
  else
  {
    /* Disable the RNG */
    RNG->CR &= ~RNG_CR_RNGEN;
  }
}
uint32_t RNG_GetRandomNumber(void)//获取硬件随机数
{
  /* Return the 32 bit random number from the DR register */
  return RNG->DR;
}

void RNG_ITConfig(FunctionalState NewState)
FlagStatus RNG_GetFlagStatus(uint8_t RNG_FLAG)
void RNG_ClearFlag(uint8_t RNG_FLAG)
ITStatus RNG_GetITStatus(uint8_t RNG_IT)
void RNG_ClearITPendingBit(uint8_t RNG_IT)//标志位
实验代码
int main(void)
{ 
	u32 random;
	u8 t=0,key;
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	delay_init(168);  
	uart_init(115200);		
	LED_Init();					
	KEY_Init();			
 	LCD_Init();         //初始化
	POINT_COLOR=RED;
	LCD_ShowString(30,50,200,16,16,"Explorer STM32F4");	
	LCD_ShowString(30,70,200,16,16,"RNG TEST");	
	LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");
	LCD_ShowString(30,110,200,16,16,"2014/5/5");	 
	while(RNG_Init())	 		//初始化随机数发生器
	{
		LCD_ShowString(30,130,200,16,16,"  RNG Error! ");	 
		delay_ms(200);
		LCD_ShowString(30,130,200,16,16,"RNG Trying...");	 
	}                                 
	LCD_ShowString(30,130,200,16,16,"RNG Ready!   ");	 
	LCD_ShowString(30,150,200,16,16,"KEY0:Get Random Num");	 
	LCD_ShowString(30,180,200,16,16,"Random Num:");	 
	LCD_ShowString(30,210,200,16,16,"Random Num[0-9]:");	 	
  
	POINT_COLOR=BLUE;
	while(1) 
	{		
		delay_ms(10);
		key=KEY_Scan(0);
		if(key==KEY0_PRES)
		{
			random=RNG_Get_RandomNum(); //获取随机数
			LCD_ShowNum(30+8*11,180,random,10,16); //显示随机数

		} 
		if((t%20)==0)
		{ 
			LED0=!LED0;	//每200ms翻转一次
			random=RNG_Get_RandomRange(0,9);//获取[0,9]内的随机数
			LCD_ShowNum(30+8*16,210,random,1,16); //显示
		 }
		delay_ms(10);
		t++;
	}	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

。✧* ꧁流痕꧂✧*。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值