历史上的今天
返回首页

历史上的今天

今天是:2025年01月02日(星期四)

正在发生

2020年01月02日 | STM8学习笔记---利用UID码实现开机产生随机数

2020-01-02 来源:eefocus

有时候项目中需要用到开机产生随机数,而软件产生随机数必须要一个随机种子。随机种子的产生通常有下面几种方式:

用一路AD采集温度或电源噪声,取后几位作为随机信号;

将用户的交互信号时间作为随机信号;

利用时钟芯片或RTC获取当前时间再经处理作为随机信号;

自己搭一个硬件电路用来产生随机信号;


有时候条件限制上面这几种方式都用不了,那还有没有其他方式能获得随机数呢。每个单片机都有一个唯一的ID,如果我们希望的是,每个单片机开机时产生的随机数和其他单片机产生的随机数不一样,那么就可以利用单片机的UID做为随机种子。由于每个单片机的码是不会变的,所以用UID码产生的随机种子每次开机都是一样的,每次产生的随机数也是一样的。所以用UID码产生随机数只适合于开机时不同单片机需要随机数不同的情况下。实现代码如下:

#define ID_BaseAddr    0x4865

unsigned char STM8S_ID[12]={0};

void Get_STM8S_UniqueID( void )

{  

    unsigned char i = 0;

    for( i = 0; i < 12; i++ )

    {     

        STM8S_ID[i] = *( unsigned char* )( ID_BaseAddr + i );

    }

}

void main( void )

{

    unsigned int seed = 0;

    unsigned int t = 0;

    SysClkInit();

    __asm( "sim" );                       //禁止中断

    LED_GPIO_Init();

    __asm( "rim" );                       //开启中断

    LED = 0;

    Get_STM8S_UniqueID();                 //读取UID  

    seed = STM8S_ID[9] * 100 + STM8S_ID[10] * 10 + STM8S_ID[11];

    srand( seed );                        //产生随机种子

    t = rand() % 100;

    while( 1 )

    {

        LED = 0;                       

        delay_ms( t * 10 );

        LED = 1;

        delay_ms( t * 10 );

    }

}


用 t = rand() % 100;这行代码产生的随机数在0–99范围内,如果希望有更大的范围将100改为其他值就可以了。


这样用上述方法产生的随机数,理论上可以认为100台设备同时开机后,LED灯闪烁的时间都不一样。

推荐阅读

史海拾趣

CINCH公司的发展小趣事

CINCH公司深知人才是企业发展的核心竞争力。因此,公司高度重视人才培养和团队建设。公司设立了完善的培训体系,为员工提供了广阔的晋升空间和发展机会。同时,公司还积极引进优秀人才,打造了一支高素质、专业化的团队。这支团队在公司的各项业务发展中发挥了重要作用,为公司的长远发展奠定了坚实基础。

Continental Industries公司的发展小趣事

经过多年的发展,Continental Industries已经成为电子行业中的佼佼者。公司不断追求创新和发展,积极拓展新的业务领域和市场空间。未来,随着电子行业的不断发展和变革,Continental Industries将继续保持敏锐的市场洞察力和强大的技术实力,努力成为行业的领导者。

这五个故事展示了Continental Industries在电子行业中的发展历程和取得的成就。虽然无法涵盖公司的全部发展细节,但通过这些故事,我们可以感受到公司在技术创新、市场拓展、合作共赢、应对挑战以及持续发展等方面的努力和成果。

Gilway Technical Lamp公司的发展小趣事
使用万用表测量压缩机的运行绕组和启动绕组电阻值,判断是否在正常范围内。如果电阻值异常,可能是绕组损坏。
Hanghsing Enterprise Co Ltd公司的发展小趣事
如果确认压缩机损坏且无法修复,需要更换新的压缩机。在更换过程中,需要注意选择与冰箱型号相匹配的压缩机,并确保正确安装和连接。
Dymec公司的发展小趣事

随着业务的不断拓展,Dymec公司逐渐意识到品质对于品牌的重要性。公司决定加大对产品质量的投入,从原材料采购到生产流程,再到质量检测,每一个环节都严格把控。这种对品质的执着追求使得Dymec公司的产品在市场上获得了良好的口碑,公司也逐渐成为了电子连接器行业的知名品牌。

Antex公司的发展小趣事

面对日新月异的电子行业发展趋势,Antex公司始终保持敏锐的市场洞察力和创新精神。公司积极推进技术开发、设备强化,不断探索新的生产技术和应用领域。同时,Antex还注重人才培养和团队建设,为公司的未来发展储备了丰富的人才资源。

这些故事只是Antex公司发展历程中的一部分,它们展示了公司在电子行业中的不断努力和追求卓越的精神。未来,随着技术的不断进步和市场的不断变化,Antex将继续保持创新和发展,为电子行业的繁荣做出更大的贡献。

请注意,以上内容仅为概述,并未详细展开每个故事的每一个细节。如果需要更具体、更详细的故事,建议查阅Antex公司的官方资料或相关新闻报道,以获取更准确、更全面的信息。

问答坊 | AI 解惑

三洋818s伺服电机怎样提高速度

我这有一套用溧阳92-03伺服电机改三洋818s电机的速度系统,改过后,实际速度只有原来的1/5,请教高手我该怎么处理…

查看全部问答>

LPC1300中文手册(完整版)--无广告

我整理了一下,方便大家阅读,呵呵   …

查看全部问答>

关于手机开发和JavaEE开发哪个好?

毕业在即,是选择JAVAEE的培训还是接受老师推荐,去做手机开发呢,前提是我是一个没有任何嵌入式基础的专科生。…

查看全部问答>

如何将SMDK2440变成多个版本?例如我的产品210,对应的BSP是smdk2440210,产品220对应的是smdk2440220

本人菜鸟,现在碰到一个问题,希望向大家求助一下. 现在我的wince目录中的PLATFORM只有smdk2440一个bsp,这样产生了很多不方便的地方. 第一,目前有3个系列的产品,虽然都是基于2440的,但是在BSP上,还是有些地方是不同的,要维护这三个系列的产品.虽然 ...…

查看全部问答>

DDK编译程序出现的怪现象

DDK可以编译成两种版本。一个Free另外一个好象是Checked版本 有什么不同。 有时候我用Checked编译通过  Free不能通过编译  晕。 还有 VC里面不能 _asm mov ebp,esp 不能修改ebp的值吗?…

查看全部问答>

EVC中在基于对话框的情况下,怎样不使用按钮就能读取指定的路径呢?

用按钮的打开对话框我会,但是不用按钮直接读取得就不知道怎么弄了? 那位高手可以指点一下呢? 应该用哪个函数呢?…

查看全部问答>

急!ARM D/A转换程序实现多种波形输出

ARM D/A转换程序设计 1.编程实现多种波形(正弦波信号、三角波信号、方波信号)的输出,在 DA接口利用示波器观测实验输出。 2.在 LCD上显示信号…

查看全部问答>

stm32 i2c问题

我用的是神州stm32103系列的芯片,用开发板提供的程序i2c读写的读写函数放在液晶显示初始化ili9320的初始化程序下面就不能运行,我跟踪了程序,是在i2c读写函数的checkevent这里出现死循环, 导致程序没有办法继续往下执行,求指点,很急。 ...…

查看全部问答>

AVR与液晶的直接访问和间接访问

请假,利用AVR实现与液晶屏的访问,如果采用直接访问(给液晶屏分配一个地址空间),直接接到对应的地址和数据线上,对应的RD和WR信号分别接到AVR的RD和WR上。但是如果采用间接访问的话,液晶屏幕的RD和WR信号是不是一般不能接在对应AVR的RD和WR信 ...…

查看全部问答>