栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

STM32-随机数发生器---RNG

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

STM32-随机数发生器---RNG

随机数发生器—RNG 1.介绍

硬件随机数发生器RNG,为主机读数时提供一个32位随机数。

模拟电路由环形振荡器组成,振荡器的输出进行异或运算以产生种子。RNG_LFSR由专用时钟提供。大量种子引入LFSR后,将数据传给数据寄存器RNG_DR。同时会监视种子和专用时钟PLL48CLK。当种子出现异常序列或PLL48CLK频率过低时,由状态寄存器RNG_SR读到。设置中断后,产生错误可以触发中断。

2.相关寄存器
typedef struct 
{
  __IO uint32_t CR;  //随机数控制寄存器,使能中断和使能随机数
  __IO uint32_t SR;  //随机数状态寄存器,错误状态和数据就绪(DRDY)
  __IO uint32_t DR;  //随机数数据寄存器,存储数据
} RNG_TypeDef;
3.配置方法 3.1RNG初始化详解

(1)使能RNG时钟

RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_RNG,ENABLE);//使能RNG时钟 AHB2

(2)使能RNG

RNG_Cmd(ENABLE);//使能RNG

(3)判断DRDY位,等待随机数发生器稳定

while(RNG_GetFlagStatus(RNG_FLAG_DRDY)==0)  //等待DRDY稳定
	{
		i++;
		delay_us(100);
		if(i>=10000)
		{
			return 1; //随机数发生器不正常
		}
	}
//
FlagStatus RNG_GetFlagStatus(uint8_t RNG_FLAG)
{
  FlagStatus bitstatus = RESET;
  assert_param(IS_RNG_GET_FLAG(RNG_FLAG));
  if ((RNG->SR & RNG_FLAG) != (uint8_t)RESET)
  {
    bitstatus = SET;
  }
  else
  {
    bitstatus = RESET;
  }
  return  bitstatus;
}
3.2完整初始化
u8 RNG_Init(void)
{
	u16 i;
	RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_RNG,ENABLE);//使能RNG时钟 AHB2
	RNG_Cmd(ENABLE);//使能RNG
	while(RNG_GetFlagStatus(RNG_FLAG_DRDY)==0)  //等待DRDY稳定
	{
		i++;
		delay_us(100);
		if(i>=10000)
		{
			return 1; //随机数发生器不正常
		}
	}
	return 0;
}
3.3 随机数调用函数
int RNG_Get_RandomRange(int min,int max)
{
	return min+RNG_Get_RandomNum()%(max-min+1);
}
u32 RNG_Get_RandomNum(void)
{
	while(RNG_GetFlagStatus(RNG_FLAG_DRDY)==0);
	return RNG_GetRandomNumber();
}

讲解不到位的希望大家指出,有需要我讲解的部分,希望大家提出,我会出文档讲解。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/784472.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号