摘要: 本应用笔记描述了如何使用DS2790温度寄存器的最低4位来生成16位随机值。本文还提供了生成16位随机值的示例C代码。
随机数在许多加密和身份验证方案中使用。随机数的生成涉及找到一个随机行为,并使用该行为生成一个随机值。因此,用微控制器生成随机数可能是一项困难的任务,因为微控制器经常表现出重复的行为。
幸运的是,DS2790允许设计人员使用温度寄存器的最低4位来生成16位随机值。虽然在数据表中只有温度寄存器的最高11位被定义为温度信息,但所有16位都被报告。这个功能,加上寄存器的最低4位是高度随机的,使得它们非常适合生成16位随机值。
表1将DS2790浸入温度可控的浴液中。将零件置于如此严格控制的温度环境中,会迅速暴露出非随机的温度值。下面的数据显示了存储温度的内存中地址的最低4位。
表1 DS2790的扩展温度数据
价值 | 数 | Delta-Counts | Delta-Avg |
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 |
Value列以十六进制形式显示温度寄存器的最低4位的值。Count列显示每个值在大约24小时内出现的次数。在一个完全随机的系统中,给定无限的时间来监视DS2790的行为,我们将看到每个值出现1/16的时间。Delta-Counts列显示了与理想的1/16值相比,每个值出现的次数的绝对误差。Delta-Avg列显示了与理想1/16值的百分比相同的误差,即理想随机行为与发生1/16次的值之间的百分比差。非常低的百分比值表明温度寄存器的最低4位是高度随机的。
为了确保在需要时可用随机数,该示例在每次完成温度转换结果时更新随机值。按照以下步骤生成16位随机数。
配置DS2790在温度转换完成时产生中断。
注意温度中断发生的时间。
当中断发生时,将温度寄存器的最低4位移到一个变量中。
这些步骤导致DS2790每220毫秒(名义上)产生一次温度转换中断。由于每次温度转换提供4位,而我们正在生成一个16位的数字,因此每880ms(名义上)一个全新的随机数可用。
下面的示例C代码生成一个16位随机值,用户可以将其作为全局变量rand_num使用。注意,该部件必须初始化,以便在温度中断完成时启用中断。温度中断在代码中定义为EINT_ti。
Unsigned short rand_num;/*全局随机数*/ /*这是主要的中断服务程序*/ void FuelGaugeISR(void) __interrupt { char temp_low4bits;/*存储低4位温度在这里*/ /*留在循环中,如果有一个中断。*/ while (IIR &IMR_IM0 || IIR &IMR_IM1) { /* IIR表示模块0或模块1中断是否已经发生。*/ /*模块0将被优先处理。*/ if (IIR &IMR_IM0) /*模块0中断*/ { /*检测和服务高优先级模块0中断在这里。*/ if (EINT &EINT_ti) /*温度转换完成int每220ms发生一次。*/ { EINT &= ~EINT_ti;/*复位温度中断位。*/ /*这段代码每4次温度中断构建一个新的16位随机数*/ /*全局变量rand_num每880ms完全更新一次*/ /*下一条语句清除温度寄存器的低4位以外的所有*/ temp_low4bits = (char)((pADC-> temperature) & /*下一条语句将旧的随机数左移4位。*/ rand_num = rand_num < /* Next语句通过添加新位来“移位”新位。*/ rand_num = rand_num + temp_low4bits;} } else /*这是一个模块1中断。*/ { /*处理模块1中断在这里。*/ } } }
社群二维码
关注“华强商城“微信公众号
Copyright 2010-2023 hqbuy.com,Inc.All right reserved. 服务热线:400-830-6691 粤ICP备05106676号 经营许可证:粤B2-20210308