STM32 如何生成随机数

news/2024/10/11 19:15:14/文章来源:https://blog.csdn.net/qq_38072731/article/details/142199776

目录

一、引言

二、STM32 随机数发生器概述

三、工作原理

1.噪声源

2.线性反馈移位寄存器(LFSR)

3.数据寄存器(RNG_DR)

4.监控和检测电路:

5.控制和状态寄存器

6.生成流程

四、使用方法

1.使能随机数发生器

2.读取随机数 

3.错误处理

五、注意事项

1.随机数的质量

2.安全性

3.性能考虑

六、总结


一、引言

        在嵌入式系统开发中,随机数的生成常常是一个重要的需求。无论是用于加密、模拟、游戏还是其他需要不确定性的应用场景,可靠的随机数生成器都是必不可少的。STM32 系列微控制器提供了内置的随机数发生器(RNG),本文将详细介绍 STM32 随机数发生器的工作原理、使用方法以及一些注意事项。

二、STM32 随机数发生器概述

STM32 的随机数发生器是基于硬件的真随机数生成器,它利用了物理随机源来产生随机数。这个物理随机源通常是一个基于热噪声或其他物理现象的电路,能够产生高度随机的数字序列。

随机数发生器的主要特点包括:

  1. 真随机数生成:与软件生成的伪随机数不同,STM32 的随机数发生器生成的是真正的随机数,具有更高的安全性和不可预测性。
  2. 高速生成:能够快速生成随机数,满足实时应用的需求。
  3. 内置硬件:不需要外部设备或软件库的支持,直接在微控制器内部生成随机数。

三、工作原理

 

1.噪声源

  • 环形振荡器:这是产生随机数种子的关键部分。多个环形振荡器被集成在电路中,每个环形振荡器都会产生一定频率的振荡信号。由于制造工艺的微小差异以及电路中的各种随机因素,这些环形振荡器的输出频率和相位都存在一定的随机性。这些振荡器的输出信号被组合在一起,通常是通过异或运算等方式,产生一个初始的随机种子信号。这种基于物理现象产生的随机信号具有真正的随机性,是生成高质量随机数的基础。

2.线性反馈移位寄存器(LFSR)

  • 种子处理:从环形振荡器输出的随机种子信号被馈入到线性反馈移位寄存器中。LFSR 是一种特殊的电路结构,它可以对输入的种子信号进行处理和变换。通过特定的反馈逻辑和移位操作,LFSR 能够将初始的随机种子扩展和变换为更复杂的随机序列。这样可以增加随机数的复杂性和随机性,使其更难以被预测。
  • 时钟控制:LFSR 由专用时钟(PLL48CLK)按恒定频率提供时钟信息。这意味着随机数的生成过程是在一个稳定的时钟控制下进行的,保证了随机数生成的稳定性和可靠性。同时,由于随机数的生成与系统的主时钟(HCLK)频率无关,因此不受系统其他部分的时钟干扰,能够独立地生成高质量的随机数。

3.数据寄存器(RNG_DR)

随机数存储:经过 LFSR 处理后的随机数会被传送到数据寄存器(RNG_DR)中进行存储。当程序需要获取随机数时,就可以从这个数据寄存器中读取到生成的 32 位随机数值。数据寄存器起到了暂时存储随机数的作用,以便后续的程序使用。

4.监控和检测电路

  • 时钟监测:系统会监视专用时钟 PLL48CLK 的状态。如果时钟频率过低,可能会影响随机数的生成质量,甚至导致随机数生成异常。通过对时钟的监测,可以及时发现这种异常情况,并在必要时采取相应的措施,例如触发中断或设置相应的状态标志。
  • 种子异常检测:同时,电路还会对输入到 LFSR 的模拟种子信号进行监测。如果种子信号出现异常序列,例如连续出现相同或有规律的信号,这可能意味着随机数生成过程中出现了问题。检测到这种异常情况后,系统也会设置相应的状态标志或触发中断,以便程序进行处理。

5.控制和状态寄存器

  • 控制寄存器(RNG_CR):用于控制随机数发生器的启用和中断的使能等功能。通过设置控制寄存器的相关位,可以开启或关闭随机数发生器,以及控制是否允许中断的产生。这为程序对随机数发生器的操作提供了灵活的控制手段。
  • 状态寄存器(RNG_SR):显示随机数发生器当前的一些状态信息,例如随机数是否准备就绪(通过 DRDY 位表示)、是否出现时钟异常或种子异常等。程序可以通过读取状态寄存器的相关位来了解随机数发生器的工作状态,以便进行相应的操作。

6.生成流程

STM32 的随机数发生器通过以下步骤生成随机数:

  1. 物理随机源产生随机噪声信号。
  2. 随机噪声信号经过放大、滤波等处理后,被转换为数字信号。
  3. 数字信号经过一系列的算法处理,生成最终的随机数。

四、使用方法

1.使能随机数发生器

  • 在使用随机数发生器之前,需要先使能它。可以通过设置 RCC(Reset and Clock Control)寄存器中的相应位来实现。
  • 例如,在使用 STM32F4 系列微控制器时,可以使用以下代码使能随机数发生器:
RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_RNG, ENABLE);

2.读取随机数 

  • 一旦随机数发生器被使能,就可以通过读取 RNG_DR(Random Number Generator Data Register)寄存器来获取随机数。
  • 以下是一个读取随机数的示例代码:
uint32_t randomNumber;
while (RNG_GetFlagStatus(RNG_FLAG_DRDY) == RESET);
randomNumber = RNG_GetRandomNumber();
  • 在上述代码中,首先等待随机数发生器准备好新的随机数,然后通过读取 RNG_DR 寄存器获取随机数。

3.错误处理

  • 在使用随机数发生器时,可能会出现一些错误情况,例如随机数发生器未准备好、时钟错误等。
  • 可以通过检查 RNG_SR(Random Number Generator Status Register)寄存器中的相应标志位来判断是否发生了错误,并采取相应的处理措施。

五、注意事项

1.随机数的质量

  • 虽然 STM32 的随机数发生器生成的是真随机数,但随机数的质量仍然可能受到一些因素的影响,例如环境温度、电源噪声等。
  • 在对随机数质量要求较高的应用中,可以考虑对生成的随机数进行进一步的处理,例如使用加密算法进行加密或进行统计测试

2.安全性

  • 随机数在加密和安全应用中起着关键作用。因此,在使用随机数发生器时,需要确保随机数的安全性,避免被攻击者预测或篡改。
  • 可以采取一些措施来提高随机数的安全性,例如使用硬件加密模块、定期更新随机数种子等。

3.性能考虑

随机数发生器的生成速度可能会影响系统的性能。在对性能要求较高的应用中,可以考虑使用多个随机数发生器或采用其他随机数生成方法来提高生成速度。

六、总结

        STM32 的随机数发生器是一个强大的工具,可以为嵌入式系统提供可靠的随机数。通过了解其工作原理和使用方法,开发人员可以在自己的项目中充分利用这个功能,实现更加安全和可靠的应用。同时,在使用随机数发生器时,需要注意随机数的质量、安全性和性能等方面的问题,以确保系统的稳定性和可靠性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ldbm.cn/p/443616.html

如若内容造成侵权/违法违规/事实不符,请联系编程新知网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【JavaWeb】利用IDEA2024+tomcat10配置web6.0版本搭建JavaWeb开发项目

之前写过一篇文章:《【JavaWeb】利用IntelliJ IDEA 2024.1.4 Tomcat10 搭建Java Web项目开发环境(图文超详细)》详细讲解了如何搭建JavaWeb项目的开发环境,里面默认使用的Web版本是4.0版本的。但在某些时候tomcat10可能无法运行we…

ubuntu虚拟机装载共享文件夹导致的诡异错误

最近使用vmware station 15 安装了 ubuntu22.04 的虚拟机。在装载共享文件夹不久后便会出现诡异的错误。目前在网络上好像没有人把这归结到装载共享文件夹的问题上,故以供参考。 第一次: 在装载之后大概第二次开机,出现报错界面。 提示蓝牙…

RabbitMQ Spring客户端使用

注解声明式队列和交换机 java自带序列化工具类,将java对象序列化为字节数组,用于网络传输。 jdk序列号存在缺陷,(不安全,占用空间大等) 推荐使用JSON的序列化: springboot扫描包使配置生效&…

十五,Spring Boot 整合连接数据库(详细配置)

十五,Spring Boot 整合连接数据库(详细配置) 文章目录 十五,Spring Boot 整合连接数据库(详细配置)最后: JDBC HikariDataSource(Spring Boot内置的数据库) HikariDataSource: 目前市面上非常优秀的数据源,是 Spring Boot2默认数…

初始爬虫5

响应码: 数据处理: re模块(正则表达式) re模块是Python中用于正则表达式操作的标准库。它提供了一些功能强大的方法来执行模式匹配和文本处理。以下是re模块的一些常见用法及其详细说明: 1. 基本用法 1.1 匹配模式 …

数据权限的设计与实现系列9——前端筛选器组件Everright-filter集成框架开发2

功能实现 ‍ 规则转换为 SQL 片段‍ 规则解析 首先我们来构造一个典型的规则,包括两个条件组,每个组由两个条件组成,由且与或两种逻辑关系,如下图: 然后看看生成的规则,如下: {"filt…

一款.NET开源的i茅台自动预约小助手

前言 今天大姚给大家分享一款.NET开源、基于WPF实现的i茅台APP接口自动化每日自动预约(抢茅台)小助手:HyggeImaotai。 项目介绍 该项目通过接口自动化模拟i茅台APP实现每日自动预约茅台酒的功能,软件会在指定时间开始对管理的用…

算法之搜索--最长公共子序列LCS

最长公共子序列&#xff08;longest common sequence&#xff09;:可以不连续 最长公共子串&#xff08;longest common substring&#xff09;&#xff1a;连续 demo for (int i 1;i<lena;i){for (int j 1;j<lenb;j){if(a[i-1]b[j-1]){dp[i][j]dp[i-1][j-1]1;}el…

计算机毕业设计 公寓出租系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

一次RPC调用过程是怎么样的?

注册中心 RPC&#xff08;Remote Procedure Call&#xff09;翻译成中文就是 {远程过程调用}。RPC 框架起到的作用就是为了实现&#xff0c;调用远程方法时&#xff0c;能够做到和调用本地方法一样&#xff0c;让开发人员更专注于业务开发&#xff0c;不用去考虑网络编程等细节…

【例题】lanqiao4425 咖啡馆订单系统

样例输入 3 2 2 1 3 1 2样例输出 3 2样例说明 输入的数组为&#xff1a;【3&#xff0c;1&#xff0c;2】 增量序列为&#xff1a;【2&#xff0c;1】 当增量 h2&#xff1a;对于每一个索引 i&#xff0c;我们会将数组元素 arr[i] 与 arr[i−h] 进行比较&#xff0c;并进行可…

鸿蒙开发之ArkUI 界面篇 二

鸿蒙App开发使用的是ArkUI(方舟开发框架)&#xff0c;构建页面最小的单位是“组件” “组件”分为基础“组件”和“容器组件”&#xff0c;基础“组件”像Image、Text、Button&#xff0c;“容器组件”像Row、Column&#xff0c;布局的思路&#xff0c;先有大框架、排版&#…

探索 Python 的火焰:Fire 库的神秘力量

文章目录 &#x1f525; 探索 Python 的火焰&#xff1a;Fire 库的神秘力量第一部分&#xff1a;背景介绍第二部分&#xff1a;Fire 库是什么&#xff1f;第三部分&#xff1a;如何安装 Fire&#xff1f;第四部分&#xff1a;简单库函数使用方法第五部分&#xff1a;场景应用第…

Amoco:一款针对二进制源码的安全分析工具

关于Amoco Amoco是一款功能强大的二进制源码静态分析工具&#xff0c;该工具基于Python 3.8开发&#xff0c;可以帮助广大研究人员轻松对二进制程序执行静态符号分析。 工具特性 1、一个通用的指令解码框架&#xff0c;旨在减少实现对新架构的支持所需的时间。例如&#xff0c…

工厂模式(二):工厂方法模式

一、概念 工厂方法模式&#xff08;Factory Method&#xff09;&#xff0c;定义一个用于创建对象的接口&#xff0c;让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。从而使得系统更加灵活。客户端可以通过调用工厂方法来创建所需的产品&#xff0c;而不必…

Vue3+TS项目封装一个公共的el-table组件二次封装

前言 支持动态传入列&#xff0c;列内容可以指定插槽&#xff0c;指定格式化显示 样式没太写&#xff0c;主要分享基础功能封装 效果 Table组件代码BaseTable.vue <template><el-table :data"data" border><template v-for"col in columns&q…

计算机毕业设计选题推荐-共享图书管理系统-小程序/App

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

【深海王国】初中生也能画的电路板?目录合集

Hi٩(๑ ^ o ^ ๑)۶, 各位深海王国的同志们&#xff0c;早上下午晚上凌晨好呀~辛勤工作的你今天也辛苦啦 (o゜▽゜)o☆ 今天大都督为大家带来系列文章《初中生也能画的电路板》&#xff0c;帮你一周内快速入门PCB设计&#xff0c;手把手教你从元器件库添加、电路原理图绘制、…

Maven 安装

Maven 安装 Maven 下载安装 下载MAVEN 选择版本注意&#xff1a; IDEA 2022 兼容maven 3.8.1及之前的所用版本 IDEA 2021 兼容maven 3.8.1及之前的所用版本 IDEA 2020 兼容Maven 3.6.3及之前所有版本 IDEA 2018 兼容Maven3.6.1及之前所有版本 打开MAVEN官网 下载需要的版本 Wi…

kali——foremost的使用

目录 前言 使用方法 前言 foremost工具是一个在Kali Linux中用于数字取证和数据恢复的强大工具。 使用方法 foremost -t all -i 数据包绝对路径修复好的数据包&#xff0c;将会自动保存在output目录里。