一站式电子元器件采购平台

华强商城公众号

一站式电子元器件采购平台

元器件移动商城,随时随地采购

华强商城M站

元器件移动商城,随时随地采购

半导体行业观察第一站!

芯八哥公众号

半导体行业观察第一站!

专注电子产业链,坚持深度原创

华强微电子公众号

专注电子产业链,
坚持深度原创

电子元器件原材料采购信息平台

华强电子网公众号

电子元器件原材料采购
信息平台

如何使用DS2790温度寄存器的最低4位来生成16位随机值

来源:analog 发布时间:2023-08-17

摘要: 本应用笔记描述了如何使用DS2790温度寄存器的最低4位来生成16位随机值。本文还提供了生成16位随机值的示例C代码。

随机数在许多加密和身份验证方案中使用。随机数的生成涉及找到一个随机行为,并使用该行为生成一个随机值。因此,用微控制器生成随机数可能是一项困难的任务,因为微控制器经常表现出重复的行为。

幸运的是,DS2790允许设计人员使用温度寄存器的最低4位来生成16位随机值。虽然在数据表中只有温度寄存器的最高11位被定义为温度信息,但所有16位都被报告。这个功能,加上寄存器的最低4位是高度随机的,使得它们非常适合生成16位随机值。

扩展温度数据是随机的吗?

表1将DS2790浸入温度可控的浴液中。将零件置于如此严格控制的温度环境中,会迅速暴露出非随机的温度值。下面的数据显示了存储温度的内存中地址的最低4位。

表1 DS2790的扩展温度数据

价值Delta-CountsDelta-Avg
023657-453.625-1.8814%
123822-288.625-1.1971%
224422311.3751.2914%
3.24091-19.625-0.0814%
424222111.3750.4619%
523994-116.625-0.4837%
624218107.3750.4453%
724258147.3750.6112%
824612501.3752.0795%
923984-126.625-0.5252%
一个23974-136.625-0.5667%
B24005-105.625-0.4381%
C2417867.3750.2794%
D24066-44.625-0.1851%
E23954-156.625-0.6496%
F24313202.3750.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位随机数

为了确保在需要时可用随机数,该示例在每次完成温度转换结果时更新随机值。按照以下步骤生成16位随机数。

  1. 配置DS2790在温度转换完成时产生中断。

  2. 注意温度中断发生的时间。

  3. 当中断发生时,将温度寄存器的最低4位移到一个变量中。

这些步骤导致DS2790每220毫秒(名义上)产生一次温度转换中断。由于每次温度转换提供4位,而我们正在生成一个16位的数字,因此每880ms(名义上)一个全新的随机数可用。

示例C代码

下面的示例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中断在这里。*/
}
} 
}
声明:本文观点仅代表作者本人,不代表华强商城的观点和立场。如有侵权或者其他问题,请联系本站修改或删除。

社群二维码

关注“华强商城“微信公众号

调查问卷

请问您是:

您希望看到什么内容: