本應(yīng)用筆記介紹如何利用DS2790溫度寄存器的最低4位產(chǎn)生16位隨機值。本說明還提供了用于生成 16 位隨機值的示例 C 代碼。
介紹
隨機數(shù)用于許多加密和身份驗證方案。隨機數(shù)的生成涉及查找隨機行為并使用此行為生成隨機值。因此,使用微控制器生成隨機數(shù)可能是一項艱巨的任務(wù),因為微控制器經(jīng)常表現(xiàn)出重復(fù)行為。
幸運的是,DS2790允許設(shè)計人員使用溫度寄存器的最低4位來產(chǎn)生16位隨機值。雖然數(shù)據(jù)手冊中只有溫度寄存器的最高11位被定義為溫度信息,但所有16位都被報告。此功能,加上寄存器的最低4位是高度隨機的,使其成為生成16位隨機值的理想選擇。
擴展溫度數(shù)據(jù)是隨機的嗎?
表1是將DS2790浸入受控溫度浴中得出的。將器件放置在如此嚴(yán)格控制的溫度環(huán)境中會迅速暴露非隨機溫度值。下面的數(shù)據(jù)顯示了內(nèi)存中存儲溫度的地址的最低 4 位。
表 1.DS2790的擴展溫度數(shù)據(jù)
價值 | 計數(shù) | 增量計數(shù) | 三角洲平均 |
0 | 23657 | -453.625 | -1.8814% |
1 | 23822 | -288.625 | -1.1971% |
2 | 24422 | 311.375 | 1.2914% |
3 | 24091 | -19.625 | -0.0814% |
4 | 24222 | 111.375 | 0.4619% |
5 | 23994 | -116.625 | -0.4837% |
6 | 24218 | 107.375 | 0.4453% |
7 | 24258 | 147.375 | 0.6112% |
8 | 24612 | 501.375 | 2.0795% |
9 | 23984 | -126.625 | -0.5252% |
一個 | 23974 | -136.625 | -0.5667% |
B | 24005 | -105.625 | -0.4381% |
C | 24178 | 67.375 | 0.2794% |
D | 24066 | -44.625 | -0.1851% |
E | 23954 | -156.625 | -0.6496% |
F | 24313 | 202.375 | 0.8394% |
共計數(shù): | 385770 | ||
總數(shù)的 1/16: | 24110.625 |
值列以十六進制顯示溫度寄存器最低 4 位的值。“計數(shù)”列顯示每個值在大約 24 小時內(nèi)出現(xiàn)的次數(shù)。在完全隨機的系統(tǒng)中,給定無限的時間來監(jiān)測DS2790的行為,我們會看到每個值在1/16的時間內(nèi)出現(xiàn)。增量計數(shù)列顯示與理想 1/16 值相比,每個值出現(xiàn)的次數(shù)的絕對誤差。Delta-Avg 列顯示的誤差與理想 1/16 值的百分比相同,即理想隨機行為與 1/16 時間發(fā)生的值之間的百分比差異。非常低的百分比值表明溫度寄存器的最低4位是高度隨機的。
生成 16 位隨機數(shù)
為了確保在需要時隨機數(shù)可用,該示例會在每次完成溫度轉(zhuǎn)換結(jié)果時更新隨機值。若要生成 16 位隨機數(shù),請使用以下步驟。
將DS2790配置為在溫度轉(zhuǎn)換完成時產(chǎn)生中斷。
注意溫度中斷發(fā)生的時間。
發(fā)生中斷時,將溫度寄存器的最低4位移入變量。
這些步驟導(dǎo)致DS2790每220ms (標(biāo)稱值)產(chǎn)生一個溫度轉(zhuǎn)換中斷。由于每次溫度轉(zhuǎn)換提供 4 位,并且我們正在生成一個 16 位數(shù)字,因此每 880ms(標(biāo)稱值)提供一個全新的隨機數(shù)。
示例 C 代碼
下面的示例 C 代碼生成一個 16 位隨機值,該值可用作全局變量rand_num。請注意,必須初始化該器件,以便在溫度中斷完成時啟用中斷。溫度中斷在代碼中定義為EINT_ti。
unsigned short rand_num; /* Global random number */ /* This is the main Interrupt Service Routine*/ void FuelGaugeISR(void) __interrupt { char temp_low4bits; /* Store the low 4 bits of temperature here */ /* Stay in the loop if there is an interrupt. */ while (IIR & IMR_IM0 || IIR & IMR_IM1) { /* The IIR signifies if a Module 0 or Module 1 interrupt has occured.*/ /* Module 0 will be treated with priority. */ if (IIR & IMR_IM0) /* Module 0 Interrupt */ { /* Detect and Service Higher Priority Module 0 Interrupts here. */ if (EINT & EINT_ti) /* A temperature conversion completion int occurs every 220ms. */ { EINT &= ~EINT_ti; /* Reset the temperature interrupt bit. */ /* This code builds a new 16 bit random number every 4 temperature interrupts */ /* The global variable rand_num is fully updated every 880ms */ /* Next statement clears all but low 4 bits of the temperature register */ temp_low4bits = (char)((pADC->TEMPERATURE) & 0x000F); /* Next statement shifts the old random number left by 4 bits. */ rand_num = rand_num << 4; /* Next statement "shifts" the new bits in by adding them. */ rand_num = rand_num + temp_low4bits; } } else /* This is a module 1 interrupt. */ { /* Handle module 1 interrupts here. */ } }? }
審核編輯:郭婷
-
微控制器
+關(guān)注
關(guān)注
48文章
7496瀏覽量
151087 -
寄存器
+關(guān)注
關(guān)注
31文章
5325瀏覽量
120054
發(fā)布評論請先 登錄
相關(guān)推薦
評論