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


    有硬件随机数发生器,(RNG)

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

    在这里插入图片描述

    无硬件随机数发生器

    中低端的MCU是不包含RNG单元的,但是也有办法产生随机数。
    在这里插入图片描述

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

    有srand()和rand()这两个函数,需要配对使用。
    srand()是输入一个随机数种子,然后调用rand()函数得到一个随机数,这个数呢,其实是通过各种加减乘除算出来的,并不是真随机数。如果srand()提供的种子不变,则rand()生成的不是真随机数。
    要想输出真随机数,就需要给的种子也是随机的,但这不容易办到。如果每次给他的种子变一下,则rand()就可以输出接近真随机数了。
    但是这个变,又不能像1,2,3,4这样来搞,对于STM32来说,可以调用SYSTICK时钟计数器的值作为种子,这样rand()就可以输出“真”随机数了。当然这个“真”是打了引号的,并不是真正的随机数,只是看起来比较像而已。

    srand(SysTick->VAL);	//将systick计数器的值作为种子
    k=rand()%100;			//获得100以内的随机数
    
    • 1
    • 2

    通过ADC,生成真随机数

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

  • 相关阅读:
    SoildNet: Soiling Degradation Detection inAutonomous Driving 个人理解
    无序标签的使用
    借助ChatGPT使用Python搭建一个工具网站
    web前端期末大作业:基于HTML+CSS+JavaScript奥迪企业bootstrap响应式网站
    单词故事嵌入:通过自然语言处理解开叙事
    python文本操作
    计算机视觉与深度学习 | 视觉里程计理论
    Leetcode 503.下一个更大元素Ⅱ
    【操作系统】线程的使用
    GTH insertion loss at nyquist设置
  • 原文地址:https://blog.csdn.net/13011803189/article/details/126837541