STM32 硬件随机数发生器(RNG)

2024-02-07 20:44

本文主要是介绍STM32 硬件随机数发生器(RNG),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

STM32 硬件随机数发生器


文章目录

  • STM32 硬件随机数发生器
  • 前言
  • 第1章 随机数发生器简介
    • 1.1 RNG主要特性
    • 1.2.RNG应用
  • 第2章 RNG原理框图
  • 第3章 RNG相关寄存器
    • 3.1 RNG 控制寄存器 (RNG_CR)
    • 3.2 RNG 状态寄存器 (RNG_SR)
    • 3.3 RNG 数据寄存器 (RNG_DR)
  • 第3章 RNG代码部分
  • 第4章 STM32F1 软件模拟RNG


前言

在日常生活中有很多情况都有用到随机数的应用,比如手机验证码、快递取件码等。


第1章 随机数发生器简介

随机数发生器(Random Number Generators,RNG),用于生成随机数的程序或硬件
STM32F4自带了硬件随机数发生器(RNG),RNG 处理器是一个以连续模拟噪声为基础的随机数发生器,在主机读数时提供一个 32 位的(真)随机数。

RNG 已通过 FIPS PUB 140-2( 2001 年 10 月 10 日)测试,成功率达 99%。

注意:M3内核等低端些的的芯片不具有这个硬件随机数发生器,具体需要参考“芯片选型手册”! 如果要产生随机数,只能利用软件方式模拟生成伪随机数。

在这里插入图片描述

在这里插入图片描述

1.1 RNG主要特性

1、提供由模拟量发生器产生的 32 位随机数。
2、两个连续随机数的间隔为 40 个 PLL48CLK 时钟信号周期。
3、通过监视 RNG 熵来标识异常行为(产生稳定值,或产生稳定的值序列)。
4、可被禁止以降低功耗。
5、真随机数:完全随机,毫无规律(STM32的部分型号上具备真随机数发生器)。
6、伪随机数:伪随机数是用确定性的算法计算出的随机数序列,并非真正的随机。

1.2.RNG应用

验证码、快递取件码、贪吃蛇游戏食物坐标等应用。

第2章 RNG原理框图

STM32F4 的随机数发生器框图如下图所示:

在这里插入图片描述

随机数发生器采用模拟电路实现的。此电路产生馈入线性反馈移位寄存器 (RNG_LFSR) 的种子,用于生成 32 位随机数。该模拟电路由几个环形振荡器组成,振荡器的输出进行异或运算以产生种子。

RNG_LFSR 由专用时钟 (PLL48CLK) 按恒定频率提供时钟信息,因此随机数质量与 HCLK 频率无关。当将大量种子引入 RNG_LFSR 后,RNG_LFSR 的内容会传入数据寄存器 (RNG_DR)。同时,系统会监视模拟种子和专用时钟 PLL48CLK。状态位( RNG_SR 寄存器中)指示何时在种子上出现异常序列,或指示何时PLL48CLK 时钟频率过低,出现过低时可以由RNG_SR寄存器的对应位读取,如果设置了中断,则在检测到错误时生成中断。

第3章 RNG相关寄存器

3.1 RNG 控制寄存器 (RNG_CR)

在这里插入图片描述

该寄存器主要用RNGEN 位,该位用于使能随机数发生器,所以设置为 1。

3.2 RNG 状态寄存器 (RNG_SR)

在这里插入图片描述

该寄存器需要用到DRDY 位,该位用于表示 RNG_DR 寄存器包含的随机数数据是否有效,如果该位为 1,则说明 RNG_DR 的数据是有效的,可以读取出来了。读 RNG_DR后,该位自动清零。

3.3 RNG 数据寄存器 (RNG_DR)

在这里插入图片描述

RNG_DR 寄存器是只读寄存器,可以读取该寄存器获得 32 位随机数值。此寄存器在最多 40 个 PLL48CLK 时钟周期后,又可以提供新的随机数值。

第3章 RNG代码部分

由于这个RNG涉及的寄存器比较少,可以直接用寄存器方式来操作即可,就不用库函数方式了,寄存器看上去就比较简洁。

示例代码如下:

//初始化RNG
//返回值:0,成功;1,失败
u8 RNG_Init(void)
{u16 retry=0; RCC->AHB2ENR=1<<6;	//开启RNG时钟,来自PLL48CLKRNG->CR|=1<<2;		//使能RNGwhile((RNG->SR&0X01)==0&&retry<10000)	//等待随机数就绪{retry++;delay_us(100);}if(retry>=10000)return 1;//随机数产生器工作不正常return 0;
}//得到随机数
//返回值:获取到的随机数
u32 RNG_Get_RandomNum(void)
{	 while((RNG->SR&0X01)==0);	//等待随机数就绪  return RNG->DR;	
}//得到某个范围内的随机数
//min,max,最小,最大值.
//返回值:得到的随机数(rval),满足:min<=rval<=max
int RNG_Get_RandomRange(int min,int max)
{ return RNG_Get_RandomNum()%(max-min+1)+min;
}
int main(void)
{u32 random = 0;delay_init(168);        // 初始化 延时函数uart_init(115200);      // 初始化串口,波特率为115200RNG_Init();             // 初始化 RNG 硬件接口while(1){random = RNG_Get_Random_Num();        // 获取一个32位的随机数 printf("random = %d\r\n", random);    // 显示32位随机数 random = RNG_Get_Random_Range(10, 20);// 获取[10, 20]区间内的随机数 printf("random = %d\r\n", random);    // 显示区间随机数 delay_ms(500);}
}

下载例程后,可以在串口看到不断输出随机数了。


第4章 STM32F1 软件模拟RNG

单纯用软件方式模拟生成一个伪随机数

#include "delay.h"
#include "usart.h"
#include <stdlib.h>           //* 使用rand函数,库文件,使用尖括号 *//* 设置随机数的取值区间范围 */
#define RANDOM_MIN    1000    // 随机数最小值
#define RANDOM_MAX    9999    // 随机数最大值int main(void)
{u32 random_value = 0;   // 保存随机值delay_init();           // 初始化 延时函数uart_init(115200);      // 初始化串口,波特率为115200while(1){/* 随机数生成 */random_value = rand();     //产生32位随机数 printf("当前随机数为:%d\r\n", random_value);random_value = rand() % (RANDOM_MAX + 1 - RANDOM_MIN) + RANDOM_MIN;// 产生区间随机数 printf("当前随机数为:%d\r\n", random_value);delay_ms(500);}
}

这种用软件生成的伪随机数只能说是接近实验目的效果,但是并不可取的方案。

这篇关于STM32 硬件随机数发生器(RNG)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/688883

相关文章

零基础STM32单片机编程入门(一)初识STM32单片机

文章目录 一.概要二.单片机型号命名规则三.STM32F103系统架构四.STM32F103C8T6单片机启动流程五.STM32F103C8T6单片机主要外设资源六.编程过程中芯片数据手册的作用1.单片机外设资源情况2.STM32单片机内部框图3.STM32单片机管脚图4.STM32单片机每个管脚可配功能5.单片机功耗数据6.FALSH编程时间,擦写次数7.I/O高低电平电压表格8.外设接口

硬件基础知识——自学习梳理

计算机存储分为闪存和永久性存储。 硬盘(永久存储)主要分为机械磁盘和固态硬盘。 机械磁盘主要靠磁颗粒的正负极方向来存储0或1,且机械磁盘没有使用寿命。 固态硬盘就有使用寿命了,大概支持30w次的读写操作。 闪存使用的是电容进行存储,断电数据就没了。 器件之间传输bit数据在总线上是一个一个传输的,因为通过电压传输(电流不稳定),但是电压属于电势能,所以可以叠加互相干扰,这也就是硬盘,U盘

DDS信号的发生器(验证篇)——FPGA学习笔记8

前言:第一部分详细讲解DDS核心框图,还请读者深入阅读第一部分,以便理解DDS核心思想 三刷小梅哥视频总结! 小梅哥https://www.corecourse.com/lander 一、DDS简介         DDS(Direct Digital Synthesizer)即数字合成器,是一种新型的频率合成技术,具有低成本、低功耗、高分辨率、频率转换时间短、相位连续性好等优点,对数字信

STM32单片机PWR电源控制详解

文章目录 1. PWR概述 2. 电源结构框图 3. 上电复位和掉电复位 4. 可编程电压监测器 5. 低功耗模式 6. 模式选择 6.1 睡眠模式 6.2 停止模式 6.3 待机模式 7. 代码示例 1. PWR概述 PWR(Power Control)电源控制,负责管理STM32内部的电源供电部分,可以实现可编程电压监测器和低功耗模式的功能。 可编程电压监测器

STM32学习之一:什么是STM32

目录 1.什么是STM32 2.STM32命名规则 3.STM32外设资源 4. STM32的系统架构 5. 从0到1搭建一个STM32工程 学习stm32已经很久了,因为种种原因,也有很久一段时间没接触过stm32了。等我捡起来的时候,发现很多都已经忘记了,重新捡起来吧。 每次谈到stm32如何如何,那么该如何解释什么是stm32呢? 1.什么是STM32 stm32

硬件上STM32F4xx兼容STM32F1xx的方案

前言 2020年开始,因为疫情,全球晶圆缺货,加上不少供应商屯芯片,导致ST的芯片价格一路飙涨,特别是STM32F1系列的单片机,价格涨的特别离谱,还缺货。。。。问了以下ST代理商,说STM32F1系列的属于168nm产品线的,正在被ST淘汰,让尽快用先进一点工艺的代替,手里有个项目用的STMF103VET6,代理商推荐先用STM32F401VE代替,国内现在右不少厂家可以pin2pin替代ST

STM32学习 修改系统主频

前面时钟树的学习说明单片机的主频是可以修改的,那么怎么更改系统的主频,这里做一个简单的介绍。首先要明白,单片机的程序是如何运行,这里简单说明一下。 对应的代码在startup_stm32....文件里面,这里是复位程序的汇编代码。 复位子程序是系统上电后第一个执行的程序,调用 SystemInit 函数初始化系统时钟,然后调用 C 库函数 _mian,最终调用 main 函数去到 C

软考初级网络管理员_03_硬件单选题

1.CPU是一块超大规模的集成电路,其主要部件有()。 运算器、控制器和系统总线 运算器、寄存器组和内存储器 控制器、存储器和寄存器组 运算器、控制器和寄存器组 2.(请作答此空)是指CPU一次可以处理的二进制的位数,它直接关系到计算机的计算精度、速度等指标:运算速度是指计算机每秒能执行的指令条数,通常以()为单位来描述。 宽带 主频 字长 存储容量 3.CPU执行指令时,先根

使用J-Link Commander查找STM32死机问题

接口:PA13,PA14,请勿连接复位引脚。 输入usb命令 这里我已经连接过了STM32F407VET6了。 再输入connect命令 这里我已经默认选择了SWD接口,4000K速率。 可以输入speed 4000命令选择4000K速率: 写一段崩溃代码进行测试: void CashCode(void){*((volatile uint32_t*) 0x080FFFFF)

基于STM32的智能家居安防系统

目录 引言环境准备智能家居安防系统基础代码实现:实现智能家居安防系统 4.1 数据采集模块4.2 数据处理与分析4.3 控制系统实现4.4 用户界面与数据可视化应用场景:智能家居安防管理与优化问题解决方案与优化收尾与总结 1. 引言 智能家居安防系统通过使用STM32嵌入式系统,结合多种传感器和控制设备,实现对家庭环境的实时监测和安防管理。本文将详细介绍如何在STM32系统中实现一个智能家居