STM32F4X RNG随机数发生器

STM32F4X RNG随机数发生器

随机数的作用

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

STM32F4X 随机数发生器

RNG控制寄存器


RNG的控制寄存器的bit0使能随机数发生器是否工作,bit1则使能是否使用中断

RNG状态寄存器


状态寄存器是判断随机数发生器工作是否正常,通过判断状态寄存器的位可以知道随机数是否产生是否正确

RNG数据寄存器

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

RNG数据步骤

STM32F4X的数据手册给出了随机数发生器的使用步骤

RNG例程

c 复制代码
#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);
		
	}
		
		
}
相关推荐
电鱼智能的电小鱼2 小时前
基于电鱼 AI 工控机的智慧工地视频智能分析方案——边缘端AI检测,实现无人值守下的实时安全预警
网络·人工智能·嵌入式硬件·算法·安全·音视频
电院工程师7 小时前
SIMON64/128算法Verilog流水线实现(附Python实现)
python·嵌入式硬件·算法·密码学
Shang180989357267 小时前
T41LQ 一款高性能、低功耗的系统级芯片(SoC) 适用于各种AIoT应用智能安防、智能家居方案优选T41L
人工智能·驱动开发·嵌入式硬件·fpga开发·信息与通信·信号处理·t41lq
BreezeJuvenile8 小时前
外设模块学习(8)——HC-SR04超声波模块(STM32)
stm32·单片机·嵌入式硬件·学习·超声波测距模块·hc-sr04
安庆平.Я11 小时前
STM32——定时器
stm32·单片机·嵌入式硬件·定时器
ACP广源盛1392462567311 小时前
(ACP广源盛)GSV2231---DisplayPort 1.4 MST 到 HDMI 2.0/DP/Type-C 转换器(带嵌入式 MCU)
c语言·开发语言·单片机·嵌入式硬件·音视频·mst
电鱼智能的电小鱼12 小时前
基于电鱼 ARM 边缘网关的智慧工地数据可靠传输方案——断点续传 + 4G/5G冗余通信,保障数据完整上传
arm开发·人工智能·嵌入式硬件·深度学习·5g·机器学习
范纹杉想快点毕业12 小时前
12个月嵌入式进阶计划ZYNQ 系列芯片嵌入式与硬件系统知识学习全计划(基于国内视频资源)
c语言·arm开发·单片机·嵌入式硬件·学习·fpga开发·音视频
NEU-UUN13 小时前
1.2.STM32简介——全程手敲板书
stm32·单片机·嵌入式硬件
三佛科技-1341638421213 小时前
全自动削皮机方案,果蔬去皮机/削皮机MCU控制方案开发设计
单片机·嵌入式硬件