打印
[其他ST产品]

STM32无硬件随机数发生器时生成随机数的方法

[复制链接]
89|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
有硬件随机数发生器,(RNG)

对于有RNG功能的MCU,直接调用相关的函数即可,很简单
HAL_RNG_GetRandomNumber 获得随机数


srand(SysTick->VAL);        //将systick计数器的值作为种子

k=rand()%100;                        //获得100以内的随机数



无硬件随机数发生器

中低端的MCU是不包含RNG单元的,但是也有办法产生随机数。


通过随机数函数,生成伪随机数

有srand()和rand()这两个函数,需要配对使用。

srand()是输入一个随机数种子,然后调用rand()函数得到一个随机数,这个数呢,其实是通过各种加减乘除算出来的,并不是真随机数。如果srand()提供的种子不变,则rand()生成的不是真随机数。

要想输出真随机数,就需要给的种子也是随机的,但这不容易办到。如果每次给他的种子变一下,则rand()就可以输出接近真随机数了。

但是这个变,又不能像1,2,3,4这样来搞,对于STM32来说,可以调用SYSTICK时钟计数器的值作为种子,这样rand()就可以输出“真”随机数了。当然这个“真”是打了引号的,并不是真正的随机数,只是看起来比较像而已。




使用特权

评论回复
沙发
漫天星yl|  楼主 | 2023-12-20 15:37 | 只看该作者
srand(SysTick->VAL);        //将systick计数器的值作为种子
k=rand()%100;                        //获得100以内的随机数

使用特权

评论回复
板凳
漫天星yl|  楼主 | 2023-12-20 15:38 | 只看该作者
通过ADC,生成真随机数
STM32自带的ADC至少12位,而我们都知道ADC的最低1,2位其实是噪声,随机性比较大。
那么我们就可以将2个电阻分压后后,接入单片机的一个ADC引脚,多次读取ADC的值,取最低的1位或2位来组合成1个数值,这种办法得到的随机数是真正的随机数,其随机性与RNG单元基本相当,但这种方法非常耗MCU时间,酌情使用。
有一个折衷的办法,通过DMA来多次读取ADC的值,到最后再一次性的合并。这个办法虽然耗时较长,但不怎么占用MCU的开销。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

26

主题

311

帖子

0

粉丝