目录
本节我们来介绍一下有关硬件随机数发生器的知识,这一节可以说是我遇到32中最简单的一节内容了,只要只用几个函数就好了,不需要繁琐的配置,和软件中的随机数一样舒服。
这是一个简单的框图,介绍了一下工作原理,而且值得注意的是,接入的是AHB2总线。
这章寄存器较少,就贴出来给大家看一下(水篇幅)。
1、使能随机数发生器时钟。
RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_RNG, ENABLE);//开启 RNG 时钟
2、使能随机数发生器。
RNG_Cmd(ENABLE); //使能 RNG
3、判断 DRDY 位,读取随机数值。
FlagStatus RNG_GetFlagStatus(uint8_t RNG_FLAG);
//库函数中,判断数据是否有效的入口参数为 RNG_FLAG_DRDY,所以等待就绪的方法为:
while(RNG_GetFlagStatus(RNG_FLAG_DRDY)==RESET);
//判断数据有效后,然后我们读取随机数发生器产生的随机数即可,调用函数为:
uint32_t RNG_GetRandomNumber(void);
#include "rng.h"
#include "delay.h"
//初始化RNG
u8 RNG_Init(void)
{
u16 retry=0;
RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_RNG, ENABLE);//开启RNG时钟,来自PLL48CLK,AHB2总线
RNG_Cmd(ENABLE); //使能RNG
while(RNG_GetFlagStatus(RNG_FLAG_DRDY)==RESET&&retry<10000) //等待随机数就绪
{
retry++;
delay_us(100);
}
if(retry>=10000)return 1;//随机数产生器工作不正常
return 0;
}
//得到随机数
//返回值:获取到的随机数
u32 RNG_Get_RandomNum(void)
{
while(RNG_GetFlagStatus(RNG_FLAG_DRDY)==RESET); //等待随机数就绪
return RNG_GetRandomNumber();
}
//生成[min,max]范围的随机数
int RNG_Get_RandomRange(int min,int max)
{
return RNG_Get_RandomNum()%(max-min+1) +min;
}
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "rng.h"
#include "key.h"
int main(void)
{
u32 random;
u8 t=0,key;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
delay_init(168); //初始化延时函数
uart_init(115200); //初始化串口波特率为115200
LED_Init(); //初始化LED
KEY_Init(); //按键初始化;
while(RNG_Init()) //初始化随机数发生器
{
printf(" RNG Error! \n");
delay_ms(200);
printf("RNG Trying...\n");
}
printf("RNG Ready! \n");
printf("KEY0:Get Random Num\n");
printf("Random Num:\n");
printf("Random Num[0-9]:\n");
while(1)
{
delay_ms(10);
key=KEY_Scan(0);
if(key==KEY0_PRES)
{
random=RNG_Get_RandomNum(); //获得随机数
printf("随机数:%d\n",random); //显示随机数
}
if((t%20)==0)
{
LED0=!LED0; //每200ms,翻转一次LED0
random=RNG_Get_RandomRange(0,9);//获取[0,9]区间的随机数
printf("%d\n",random); //显示随机数
}
delay_ms(10);
t++;
}
}
本节硬件随机数发生器的内容比较简单,我们就简单介绍一下,希望对大家有所帮助,谢谢大家了!