本應用筆記介紹如何利用DS4溫度寄存器的最低2790位產生16位隨機值。本說明還提供了用于生成 16 位隨機值的示例 C 代碼。
介紹
隨機數用于許多加密和身份驗證方案。隨機數的生成涉及查找隨機行為并使用此行為生成隨機值。因此,使用微控制器生成隨機數可能是一項艱巨的任務,因為微控制器經常表現出重復行為。
幸運的是,DS2790允許設計人員使用溫度寄存器的最低4位來產生16位隨機值。雖然數據手冊中只有溫度寄存器的最高11位被定義為溫度信息,但所有16位都被報告。此功能,加上寄存器的最低4位是高度隨機的,使其成為生成16位隨機值的理想選擇。
擴展溫度數據是隨機的嗎?
表1是將DS2790浸入受控溫度浴中得出的。將器件放置在如此嚴格控制的溫度環境中會迅速暴露非隨機溫度值。下面的數據顯示了內存中存儲溫度的地址的最低 4 位。
表 1.DS2790的擴展溫度數據
價值 | 計數 | 增量計數 | 三角洲平均 |
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% |
共計數: | 385770 | ||
總數的 1/16: | 24110.625 |
值列以十六進制顯示溫度寄存器最低 4 位的值。“計數”列顯示每個值在大約 24 小時內出現的次數。在完全隨機的系統中,給定無限的時間來監測DS2790的行為,我們會看到每個值在1/16的時間內出現。增量計數列顯示與理想 1/16 值相比,每個值出現的次數的絕對誤差。Delta-Avg 列顯示的誤差與理想 1/16 值的百分比相同,即理想隨機行為與 1/16 時間發生的值之間的百分比差異。非常低的百分比值表明溫度寄存器的最低4位是高度隨機的。
生成 16 位隨機數
為了確保在需要時隨機數可用,該示例會在每次完成溫度轉換結果時更新隨機值。若要生成 16 位隨機數,請使用以下步驟。
將DS2790配置為在溫度轉換完成時產生中斷。
注意溫度中斷發生的時間。
發生中斷時,將溫度寄存器的最低4位移入變量。
這些步驟導致DS2790每220ms (標稱值)產生一個溫度轉換中斷。由于每次溫度轉換提供 4 位,并且我們正在生成一個 16 位數字,因此每 880ms(標稱值)提供一個全新的隨機數。
示例 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. */ } } }
審核編輯:郭婷
-
微控制器
+關注
關注
48文章
7542瀏覽量
151316 -
寄存器
+關注
關注
31文章
5336瀏覽量
120231 -
代碼
+關注
關注
30文章
4779瀏覽量
68525
發布評論請先 登錄
相關推薦
評論