STM32F4學習筆記12——RNG隨機數(shù)發(fā)生器
RNG主要特性
RNG 處理器是一個以連續(xù)模擬噪聲為基礎的隨機數(shù)發(fā)生器,在主機讀數(shù)時提供一個 32 位的 隨機數(shù)。
RNG的主要特性
● 提供由模擬量發(fā)生器產(chǎn)生的 32 位隨機數(shù)
● 兩個連續(xù)隨機數(shù)的間隔為 40 個 PLL48CLK 時鐘信號周期
● 通過監(jiān)視 RNG 熵來標識異常行為(產(chǎn)生穩(wěn)定值,或產(chǎn)生穩(wěn)定的值序列)
● 可被禁止以降低功耗
RNG功能描述
隨機數(shù)發(fā)生器采用模擬電路實現(xiàn)。此電路產(chǎn)生饋入線性反饋移位寄存器 (RNG_LFSR) 的種子, 用于生成 32 位隨機數(shù)。
該模擬電路由幾個環(huán)形振蕩器組成,振蕩器的輸出進行異或運算以產(chǎn)生種子。RNG_LFSR 由 專用時鐘 (PLL48CLK) 按恒定頻率提供時鐘信息,因此隨機數(shù)質(zhì)量與 HCLK 頻率無關。當將 大量種子引入 RNG_LFSR 后,RNG_LFSR 的內(nèi)容會傳入數(shù)據(jù)寄存器 (RNG_DR)。
同時,系統(tǒng)會監(jiān)視模擬種子和專用時鐘 PLL48CLK。狀態(tài)位(RNG_SR 寄存器中)指示何時 在種子上出現(xiàn)異常序列,或指示何時 PLL48CLK 時鐘頻率過低。檢測到錯誤時生成中斷。
操作
要運行 RNG,請按以下步驟操作:
1.如果需要,使能中斷(為此,將 RNG_CR 寄存器中的 IE 位置 1)。準備好隨機數(shù)時或 出現(xiàn)錯誤時生成中斷。
2. 通過將 RNG_CR 寄存器中的 RNGEN 位置 1 使能隨機數(shù)產(chǎn)生。這會激活模擬部分、RNG_LFSR 和錯誤檢測器。
3. 每次中斷時,檢查確認未出現(xiàn)錯誤(RNG_SR 寄存器中的 SEIS 和 CEIS 位應為 0), 并且隨機數(shù)已準備就緒(RNG_SR 寄存器中的 DRDY 位為 1)。然后即可讀取 RNG_DR 寄存器中的內(nèi)容。
按照 FIPS PUB(聯(lián)邦信息處理標準出版物)140-2 的要求,將 RNGEN 位置 1 后產(chǎn)生的第 一個隨機數(shù)不應使用,但應保存起來,與產(chǎn)生的下一個隨機數(shù)進行比較。隨后產(chǎn)生的每個隨機數(shù)都需要與產(chǎn)生的上一個隨機數(shù)進行比較。如果任何一對進行比較的數(shù)字相等,則測試失?。ㄟB續(xù)隨機數(shù)發(fā)生器測試)
錯誤管理
如果 CEIS 位的值為 1(時鐘錯誤)
出現(xiàn)時鐘錯誤時,RNG 無法再產(chǎn)生隨機數(shù),因為 PLL48CLK 時鐘不正確。檢查時鐘控制器是 否正確配置,是否可提供 RNG 時鐘,然后將 CEIS 位清零。當 CECS 位為 0 時,RNG 可正 常工作。時鐘錯誤對產(chǎn)生的上一個隨機數(shù)沒有影響,因此 RNG_DR 寄存器內(nèi)容可以使用。
如果 SEIS 位的值為 1(種子錯誤)
出現(xiàn)種子錯誤時,只要 SECS 位為 1,就會中斷隨機數(shù)產(chǎn)生。如果 RNG_DR 寄存器中有可 用隨機數(shù),不能使用該隨機數(shù),因為它可能沒有足夠的熵。
應執(zhí)行以下操作:將 SEIS 位清零,然后將 RNGEN 位清零并置 1,以便重新初始化和重新 啟動 RNG。
STM32F4的RNG庫
如何使用RNG驅動
1.通過函數(shù)RCC_AHB2PeriphClockCmd(RCC_AHB2Perph_RNG,ENABLE)使能RNG控制器時鐘。
2.通過函數(shù)RNG_Cmd()使能RNG。
3.等待直到隨機數(shù)發(fā)生器產(chǎn)生有效的隨機數(shù)(中斷或查詢模式)。
4.通過函數(shù)RNG_GetRandomNumber()得到隨機數(shù)。
從上面第三步開始繼續(xù)得到后面的隨機數(shù)。
初始化和配置函數(shù)
這部分函數(shù)主要提供以下功能
· 初始化RNG外設
· 使能或禁止RNG外設。
void RNG_DeInit()功能:從新初始化RNG外設寄存器數(shù)據(jù)到復位值。
void RNG_Cmd(FunctionanState NewState)功能:使能或禁止RNG
得到32位隨機數(shù)函數(shù)
uint32_t RNG_GetRandomNumber(void)
函數(shù)功能:返回32位隨機數(shù)
調(diào)用此函數(shù)之前需要等待直到DRDY標志置位,調(diào)用函數(shù)RNG_GetFlagStatus(RNG_FLAG_DRDY)進行等待標志位。每次在的調(diào)用RNG_GetrandomNumber(void)后RNG_FLAG_DRDY標志自動清除。
在seed錯誤的情況下只要SECS位是1,隨機數(shù)產(chǎn)生將被中斷。如果RNG_DR寄存器中有數(shù)據(jù)可用,但是請不要使用,應為沒有足夠的entopy。這種情況下推薦用戶通過函數(shù)RNG_ClearFlag(RNG_FLAG_SECS)清除SEIS標志,然后禁止并重新使能RNG外設(通過函數(shù)RNG_Cmd())來從新初始化和啟動RNG。
在時鐘錯誤的情況下,應為PLL48CLK時鐘的不準確,RNG將無法產(chǎn)生隨機數(shù)。檢查是否正確配置時鐘控制器RNG時鐘,同時清除CEIS(通過函數(shù)RNG——ClearFlag(RNG_FLAG_CECS))位。當CECS位是0的時候RNG次啊能正常工作。時鐘錯誤對先前殘生的隨機數(shù)沒有影響,RNG_DR寄存器中的數(shù)據(jù)仍然可以使用。
中斷標志管理
· 標志
RNG_FLAG_DRDY:RNG_DR寄存器有有效隨機數(shù)時,通過讀此寄存器來清除標志(可通過函數(shù)RNG_GetRandomNumber()實現(xiàn))。
RNG_FLAG_CECS:seed檢測錯誤
RNG_FLAG_SECS:時鐘檢測錯誤
· 中斷
如果是能了RNG中斷,下面三種情況僵尸的RNG中斷會被掛起。
RNG_DR寄存器含有有效的隨機數(shù),只有通過讀RNG_DR寄存器才能清除中斷源,也就是清除中斷掛起標志。
發(fā)生seed錯誤,檢測到下面的錯誤序列之一:
64個以上的的連續(xù)位都是0或者1
32個以上出現(xiàn)連續(xù)的01.
通過函數(shù)RNG_ClearITPendingBit(RNG_IT_SEI)清除此中斷源。
發(fā)生時鐘錯誤,PLL48CLK不能被正確的檢測到