STM32F4X RNG随机数发生器

news2024/11/27 2:27:02

STM32F4X RNG随机数发生器

  • 随机数的作用
  • STM32F4X 随机数发生器
    • RNG控制寄存器
    • RNG状态寄存器
    • RNG数据寄存器
    • RNG数据步骤
    • RNG例程

随机数的作用

随机数顾名思义就是随机产生的数字,这种数字最大的特点就是其不确定性,你不知道它下一次产生的数字是什么。随机数被广泛应用于密码学、模拟实验、游戏开发领域等。

STM32F4X 随机数发生器

RNG控制寄存器

在这里插入图片描述
在这里插入图片描述
RNG的控制寄存器的bit0使能随机数发生器是否工作,bit1则使能是否使用中断

RNG状态寄存器

在这里插入图片描述
在这里插入图片描述
状态寄存器是判断随机数发生器工作是否正常,通过判断状态寄存器的位可以知道随机数是否产生是否正确

RNG数据寄存器

在这里插入图片描述
如果上面的随机数的状态寄存器里面的状态都没有异常,而且数据已经准备就绪了,用户就可以读取数据寄存器把随机数读出来。

RNG数据步骤

STM32F4X的数据手册给出了随机数发生器的使用步骤
在这里插入图片描述

RNG例程

#include "rng.h"



void rng_init(void)
{
	NVIC_InitTypeDef NVIC_InitStruct;
	
	RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_RNG,ENABLE); // 使能RNG时钟
	
#ifdef RNG_INIT
	NVIC_InitStruct.NVIC_IRQChannel = HASH_RNG_IRQn; //  中断编号
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 2; // 抢占优先级为1
	NVIC_InitStruct.NVIC_IRQChannelSubPriority =  2; // 响应优先级为1
	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; // 使能中断
	NVIC_Init(&NVIC_InitStruct); // 初始化中断
	RNG_ITConfig(ENABLE);
	
#endif	
	RNG_Cmd(ENABLE);
	
	
}

uint32_t get_rng_randomdata(void)
{
	static uint32_t first_random_num = 0,second_random_num = 0,count = 0;

	if(RNG_GetFlagStatus(RNG_FLAG_CECS | RNG_FLAG_SECS) == RESET) // 判断CECS 和 SECS
	{
		if(RNG_GetFlagStatus(RNG_FLAG_DRDY) == SET) // 判断随机数是都准备好
		{
			count++;
			if (count >= 0xFFFFFFFF)
				count = 0;
			if (count == 1)
				return;
			
			second_random_num = first_random_num;
			first_random_num = RNG_GetRandomNumber(); // 读取随机数
			if(first_random_num != second_random_num) // 本次生成的随机数跟上一次生成的随机数对比
				printf("random create success %8X %8X\r\n",first_random_num,second_random_num);
			else 
				printf("random create fail \r\n");
		}

		RNG_ClearFlag(RNG_FLAG_CECS | RNG_FLAG_SECS);
			
	}
	return 0;
}
	
void HASH_RNG_IRQHandler(void)
{
	static uint32_t first_random_num = 0,second_random_num = 0,count = 0;
	if(RNG_GetITStatus(RNG_IT_CEI | RNG_IT_SEI) == RESET)
	{
		if(RNG_GetFlagStatus(RNG_FLAG_DRDY) == SET)
		{
			count++;
			if (count >= 0xFFFFFFFF)
				count = 0;
			if (count == 1)
				return;
			
			second_random_num = first_random_num;
			first_random_num = RNG_GetRandomNumber(); // 读取随机数
			if(first_random_num != second_random_num) // 本次生成的随机数跟上一次生成的随机数对比
				printf("random create success %8X %8X\r\n",first_random_num,second_random_num);
			else 
				printf("random create fail \r\n");
		}
		RNG_ClearITPendingBit(RNG_IT_CEI | RNG_IT_SEI);
		
	}
		
		
}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

差分数组/前缀和

文章目录 1094. 拼车1109. 航班预定统计303. 区域和检索 - 数组不可变560. 和为K的子数组523. 连续的子数组的和 1094. 拼车 class Solution {public boolean carPooling(int[][] trips, int capacity) {int[] diff new int[1001]; // 记录每个站点改变的人数,比如…

c语言---指针

指针 前言 记录一个数据对象在内存中的存储位置,需要两个信息: 1、数据对象的首地址。 2、数据对象占用存储空间大小 基础数据类型所占内存空间大小(字节),一个字节代表8个二进制位 char 1 short 2 int 4 lon…

Java中的网络编程------基于Socket的TCP编程和基于UDP的网络编程,netstat指令

Socket 在Java中,Socket是一种用于网络通信的编程接口,它允许不同计算机之间的程序进行数据交换和通信。Socket使得网络应用程序能够通过TCP或UDP协议在不同主机之间建立连接、发送数据和接收数据。以下是Socket的基本介绍: Socket类型&…

机器学习:可解释学习

文章目录 可解释学习为什么需要可解释机器学习可解释还是强模型可解释学习的目标可解释机器学习Local ExplanationGlobal Explanation 可解释学习 神马汉斯,只有在有人看的时候能够答对。 为什么需要可解释机器学习 贷款,医疗需要给出理由,让…

学生宿舍水电费自动缴费系统/基于javaweb的水电缴费系统

摘 要 “互联网”的战略实施后,很多行业的信息化水平都有了很大的提升。但是目前很多学校日常工作仍是通过人工管理的方式进行,需要在各个岗位投入大量的人力进行很多重复性工作,这样就浪费了许多的人力物力,工作效率较低&#x…

职场中的道德与伦理:如何在工作中坚守原则?

引言 在快节奏的职场环境中,道德与伦理问题时常出现,但却往往被忽视。面对各种压力和诱惑,如何在工作中坚守原则,不仅是个人修养的体现,也是职业成功的关键。本文将探讨职场中的道德与伦理问题,以及如何在…

Orangepi安装外设库 wiringPi

注意:mobaXterm传送文件要在SSH登陆环境下才可以。 同时电脑和orangepi都在同一个wifi下。

docker 笔记6:高级篇 DockerFile解析

目录 1.是什么? 2.构建三步骤 3.DockerFile构建过程解析 3.1 Dockerfile内容基础知识 3.2Docker执行Dockerfile的大致流程 总结 4.DockerFile常用保留字指令 5.案例:自定义镜像 5.1 要求: Centos7镜像具备vimifconfigjdk8 5.2编写 5…

deque容器

1 deque容器基本概念 功能: 双端数组,可以对头端进行插入删除操作 deque与vector区别: vector对于头部的插入删除效率低,数据量越大,效率越低deque相对而言,对头部的插入删除速度回比vector快vector访问…

如何在java中做基准测试

最近公司在搞新项目,由于是实验性质,且不会直接面对客户的项目,这次的技术选型非常激进,如,直接使用了Java 17。 作为公司里练习两年半的个人练习生,我自然也是深度的参与到了技术选型的工作中。不知道大家…

Gitea--私有git服务器搭建详细教程

一.官方文档 https://docs.gitea.com/zh-cn/说明 gitea 是一个自己托管的Git服务程序。他和GitHub, Gitlab等比较类似。他是从 Gogs 发展而来,gitea的创作团队重新fork了代码,并命名为giteagitea 功能特性多,能够满足我们所有的的代码管理需…

预推免,保研------长安大学保内,附加分面试准备【记录帖】

🚀长安大学——人工智能系——程惠泽 🚌前六学期专业排名:7/82 🚌信息门户GPA:3.94 🚌平均成绩:89.83 🚌加权成绩:89.15 / ☁️本人比较菜,只能保研本校&…

认识doubbo和rpc

开个新坑,和大家一起学习Dubbo 3.X。我们按照一个由浅入深顺序来学习,先从使用Dubbo开始,再深入Dubbo的核心原理。 今天我们就从认识Dubbo开始,整体的内容可以分为3个部分: Dubbo是什么RPC是什么Dubbo的架构 正式开…

面试如何回答弹性盒子布局这个问题呢?

在我们面试中如果被问道css方面的面试题 那么极有可能被问到的一道面试题就是弹性盒子,本篇文章通过一张图带你拿捏这道面试题。 1、首先需要说一说弹性盒子的基本概念:弹性盒子是一种用于网页布局中创建灵活和响应式设计的CSS布局模型。 2、其次需要说…

父组件调用子组件 ref 不生效?组件暴露 ref ?

向你的组件暴露 ref 要暴露 ref 最关键的就是 forwardRef forwardRef 是 React 中的一个高阶函数,用于在函数组件中将 ref 属性向下传递给子组件。 在 React 中,我们可以使用 ref 属性来获取对一个组件实例的引用,以便在父组件中操作子组件。…

IDEA复制一个工程为多个并启动,测试负载均衡

1 找到服务按钮 2 选择复制配置 3 更改新的名称与虚拟机参数 复制下面的代码在VM参数中 -Dserver.port8082 4 最后启动即可

【80天学习完《深入理解计算机系统》】第十二天3.6数组和结构体

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客,如有问题交流,欢迎评论区留言,一定尽快回复!(大家可以去看我的专栏,是所有文章的目录)   文章字体风格: 红色文字表示&#…

排序之归并排序

文章目录 前言一、归并排序1、归并排序基本思想2、归并排序代码实现3、归并排序效率分析 二、归并排序非递归实现(循环实现)1、归并排序非递归实现(循环实现)基本思想2、归并排序非递归实现(循环实现)代码 三、计数排序1、计数排序基本思想2、计数排序代码实现3、计数排序效率分…

大数据-玩转数据-Flink状态编程(上)

一、Flink状态编程 有状态的计算是流处理框架要实现的重要功能,因为稍复杂的流处理场景都需要记录状态,然后在新流入数据的基础上不断更新状态。 SparkStreaming在状态管理这块做的不好, 很多时候需要借助于外部存储(例如Redis)来手动管理状态, 增加了编…

顺式元件热图+柱状图

写在前面 本教程来自粉丝投稿,主要做得是顺式元件的预测和热图绘制。类似的教程,在我们基于TBtools做基因家族分析也做过,流程基本一致。我们前期的教程,主要是基于TBtools,本教程主要是基于纯代码,也是值得学习收藏的…