本帖最后由 奔跑的黑蚂蚁 于 2018-7-9 10:58 编辑
本次所要发布的是野火挑战者STM32F429开发板的串口和STM32F429单片机内部的真随机数模块的使用过程,以及F429内部的随机数发生器与C标准库中的随机函数rand()的对比。
首先介绍一下F429内部的“真随机数发生器”的工作原理,F429内部的随机数发生器以它内部的一个模拟噪声作为种子数,然后将这个种子输送给硬件随机数发生电路,硬件随机数发生电路根据本次接收到的“种子”进行输出最终的随机数。每一次的随机数都是由“新的”种子进行生成,所以说重复率是极低的。下图是官方手册的简介:
F429内部的随机数模块使用起来也是很方便的,但是有一个前提条件,必须将芯片的时钟频率从默认的180MHz降低为168MHz,这是因为芯片设计的时候就设计成,如果要使用随机数模块和USB模块的话,其工作频率分频后必须是48MHz。但是芯片主频率在180MHz的情况下无法给随机数模块和USB模块提供48MHz的频率,所以必须降频至168MHz。设置完频率后,我们可以直接使用官方固件库的函数进行激活随机数模块,程序如下:
获取随机数的程序如下:
下面是F429的串口配置部分:
上图中的黄色框框中的步骤不可缺少
串口发送一个字节的子函数
重定义printf函数至串口
上图是主程序,其中z是用于测试和打印的随机数,在主函数中调用了srand()和rand()函数,用于和F429内部的随机数输出对比,以下是串口打印输出对比:
使用F429内部的随机数发生器产生的随机数,图中两个窗口是芯片下载程序后重新上电两次的数据结果
使用srand()和rand()产生的随机数,图中两个窗口是芯片下载程序后重新上电两次的数据结果结果:使用srand()和rand()函数输出随机数的时候,在种子相同的情况下,每次输出的随机数的顺序是相同的,是个伪随机数。但是STM32F429的随机数模块每次上电后输出的随机数都不重复,且数据顺序不一。
本帖最后由 奔跑的黑蚂蚁 于 2018-7-9 10:58 编辑
本次所要发布的是野火挑战者STM32F429开发板的串口和STM32F429单片机内部的真随机数模块的使用过程,以及F429内部的随机数发生器与C标准库中的随机函数rand()的对比。
首先介绍一下F429内部的“真随机数发生器”的工作原理,F429内部的随机数发生器以它内部的一个模拟噪声作为种子数,然后将这个种子输送给硬件随机数发生电路,硬件随机数发生电路根据本次接收到的“种子”进行输出最终的随机数。每一次的随机数都是由“新的”种子进行生成,所以说重复率是极低的。下图是官方手册的简介:
F429内部的随机数模块使用起来也是很方便的,但是有一个前提条件,必须将芯片的时钟频率从默认的180MHz降低为168MHz,这是因为芯片设计的时候就设计成,如果要使用随机数模块和USB模块的话,其工作频率分频后必须是48MHz。但是芯片主频率在180MHz的情况下无法给随机数模块和USB模块提供48MHz的频率,所以必须降频至168MHz。设置完频率后,我们可以直接使用官方固件库的函数进行激活随机数模块,程序如下:
获取随机数的程序如下:
下面是F429的串口配置部分:
上图中的黄色框框中的步骤不可缺少
串口发送一个字节的子函数
重定义printf函数至串口
上图是主程序,其中z是用于测试和打印的随机数,在主函数中调用了srand()和rand()函数,用于和F429内部的随机数输出对比,以下是串口打印输出对比:
使用F429内部的随机数发生器产生的随机数,图中两个窗口是芯片下载程序后重新上电两次的数据结果
使用srand()和rand()产生的随机数,图中两个窗口是芯片下载程序后重新上电两次的数据结果结果:使用srand()和rand()函数输出随机数的时候,在种子相同的情况下,每次输出的随机数的顺序是相同的,是个伪随机数。但是STM32F429的随机数模块每次上电后输出的随机数都不重复,且数据顺序不一。