RNG-硬件随机数发生器-STM32F4

使用芯片===>STM32F429IGT6

使用串口输出一组随机数,随机数范围(1-50)

(制作不易,希望大佬能给个赞支持下小丁)


目录

一、RNG-硬件随机数发生器简介

1、随机数发生器框图

2、相关寄存器

二、实验程序

1、main.c

2、rng.c

3、rng.h

三、实验结果

四、结束语


一、RNG-硬件随机数发生器简介

STM32自带了硬件随机数发生器(RNG),RNG处理器是一个以连续模拟噪声为基础的随机数发生器,在主机读数时提供一个32位的随机数。 两个连续的随机数的间隔为40个PLL48CLK时钟信号周期。 通过监控RNG熵来标识异常行为。 可以禁止来降低功耗。

1、随机数发生器框图

①、控制寄存器就是设置一些参数,状态寄存器来反映出相对的状态,RNG_CLk来提供时钟(不是框图的核心)。

②、核心为模拟种子,模拟种子表示这个随机数是怎么发生的。

③、模拟种子产生的随机数,随机数会保存到LFSR这个寄存器里面,当随机数在LFSR存储完成后,会将随机数传输到RNG_DR数据寄存器中。然后我们就可以将随机数从RNG_DR中读取出来。

④、在产生随机数的过程中,可以通过“时钟检查器和故障检测器”来检查是否出现故障,随机数是否正常的输出等。

2、相关寄存器

①、控制寄存器RNG_CR

②、状态寄存器RNG_SR

③、数据寄存器RNG_DR


二、实验程序

首先对随机数函数进行初始化,随后获取随机数,将获取到的随机数通过公式转换为相应应范围内的随机数,并把两个数一起输出出来

随机数转换到相应范围内的随机数,是通过将随机数在范围内的  "(最大值-最小值+1)取余+最小值"  得到的。

1、main.c

/**************************************************************************
**作者:        小丁工程               
**时间:        2021.01.16
***************************************************************************/
#include "sys.h"
//---------------------主函数-------------------------------------------------
 
int num,nums;
int main(void)
{
    HAL_Init();//========================初始化HAL库   
    Stm32_Clock_Init(360,25,2,8);//======设置时钟,180Mhz
    delay_init(180);//===================初始化延时函数
    uart_init(115200); 	
	  while(RNG_Init())	 		    //初始化随机数发生器
 	  { 
		delay_ms(200);
		printf("RNG Trying...\r\n");
	  } 
    while(1)
    {
    delay_ms(10);
		num=RNG_Get_RandomNum(); //获得随机数
		nums=RNG_Get_RandomRange(1,50);	
		printf("%d----%d\r\n",num,nums);
		} 	
}
//---------------------end-----------------------------------------------------

2、rng.c

#include "rng.h"
#include "delay.h"

RNG_HandleTypeDef RNG_Handler;  //RNG句柄

//初始化RNG
u8 RNG_Init(void)
{
    u16 retry=0;
    
    RNG_Handler.Instance=RNG;
    HAL_RNG_Init(&RNG_Handler);//初始化RNG
    while(__HAL_RNG_GET_FLAG(&RNG_Handler,RNG_FLAG_DRDY)==RESET&&retry<10000)//等待RNG准备就绪
    {
        retry++;
        delay_us(10);
    }
    if(retry>=10000) return 1;//随机数产生器工作不正常
    return 0;
}
void HAL_RNG_MspInit(RNG_HandleTypeDef *hrng)
{
     __HAL_RCC_RNG_CLK_ENABLE();//使能RNG时钟
}
//得到随机数
//返回值:获取到的随机数
u32 RNG_Get_RandomNum(void)
{
    return HAL_RNG_GetRandomNumber(&RNG_Handler);
}

//生成[min,max]范围的随机数
int RNG_Get_RandomRange(int min,int max)
{ 
   return HAL_RNG_GetRandomNumber(&RNG_Handler)%(max-min+1) +min;
}




3、rng.h

#ifndef __RNG_H
#define __RNG_H
#include "sys.h"

u8  RNG_Init(void);			//RNG初始化 
u32 RNG_Get_RandomNum(void);//得到随机数
int RNG_Get_RandomRange(int min,int max);//生成[min,max]范围的随机数
#endif


三、实验结果

每次输出的头一个数为单片机产生的随机数,第二个数是转换后1-50的随机数。



四、结束语

这个例程相对来说还是比较简单的,希望能对你有些帮助。

(例程及相关资料参考于-->原子光盘,侵删)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值