文章目錄
-
-
- 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++;
}
}