使用芯片===>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);//======设置时钟,180Mhzdelay_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);//初始化RNGwhile(__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的随机数。
四、结束语
这个例程相对来说还是比较简单的,希望能对你有些帮助。
(例程及相关资料参考于-->原子光盘,侵删)