本文主要是介绍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完整初始化
/*******************************************************************************
* 函 数 名 : RNG_Init
* 函数功能 : RNG初始化函数
* 输 入 : 无
* 输 出 : 1:错误,0:成功
*******************************************************************************/
u8 RNG_Init(void)
{u16 i;RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_RNG,ENABLE);//使能RNG时钟 AHB2RNG_Cmd(ENABLE);//使能RNGwhile(RNG_GetFlagStatus(RNG_FLAG_DRDY)==0) //等待DRDY稳定{i++;delay_us(100);if(i>=10000){return 1; //随机数发生器不正常}}return 0;
}
3.3 随机数调用函数
/*******************************************************************************
* 函 数 名 : RNG_Get_RandomNum
* 函数功能 : 生成[min,max]范围的随机数
* 输 入 : [min,max]值
* 输 出 : 返回[min,max]范围的随机数
*******************************************************************************/
int RNG_Get_RandomRange(int min,int max)
{return min+RNG_Get_RandomNum()%(max-min+1);
}
/*******************************************************************************
* 函 数 名 : RNG_Get_RandomNum
* 函数功能 : 返回32位随机数
* 输 入 : 无
* 输 出 : 返回32位随机数
*******************************************************************************/
u32 RNG_Get_RandomNum(void)
{while(RNG_GetFlagStatus(RNG_FLAG_DRDY)==0);return RNG_GetRandomNumber();
}
讲解不到位的希望大家指出,有需要我讲解的部分,希望大家提出,我会出文档讲解。
这篇关于STM32-随机数发生器---RNG的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!