天天看點

硬體随機數發生器

文章目錄

      • RNG-硬體随機數發生器
      • RNG寄存器
        • 控制寄存器 RNG_CR
        • 狀态寄存器 RNG_SR
        • 資料寄存器RNG_DR
        • RNG庫函數
        • 實驗代碼

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,"[email protected]");
	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++;
	}	
}