历史上的今天
今天是: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灯闪烁的时间都不一样。
史海拾趣
|
如何将SMDK2440变成多个版本?例如我的产品210,对应的BSP是smdk2440210,产品220对应的是smdk2440220 本人菜鸟,现在碰到一个问题,希望向大家求助一下. 现在我的wince目录中的PLATFORM只有smdk2440一个bsp,这样产生了很多不方便的地方. 第一,目前有3个系列的产品,虽然都是基于2440的,但是在BSP上,还是有些地方是不同的,要维护这三个系列的产品.虽然 ...… 查看全部问答> |
|
DDK可以编译成两种版本。一个Free另外一个好象是Checked版本 有什么不同。 有时候我用Checked编译通过 Free不能通过编译 晕。 还有 VC里面不能 _asm mov ebp,esp 不能修改ebp的值吗?… 查看全部问答> |
|
ARM D/A转换程序设计 1.编程实现多种波形(正弦波信号、三角波信号、方波信号)的输出,在 DA接口利用示波器观测实验输出。 2.在 LCD上显示信号… 查看全部问答> |
|
我用的是神州stm32103系列的芯片,用开发板提供的程序i2c读写的读写函数放在液晶显示初始化ili9320的初始化程序下面就不能运行,我跟踪了程序,是在i2c读写函数的checkevent这里出现死循环, 导致程序没有办法继续往下执行,求指点,很急。 ...… 查看全部问答> |
|
请假,利用AVR实现与液晶屏的访问,如果采用直接访问(给液晶屏分配一个地址空间),直接接到对应的地址和数据线上,对应的RD和WR信号分别接到AVR的RD和WR上。但是如果采用间接访问的话,液晶屏幕的RD和WR信号是不是一般不能接在对应AVR的RD和WR信 ...… 查看全部问答> |




