aabird 发表于 2015-11-18 10:56:56

【NUCLEO-L476RG开发】硬件随机数

      这次的NUCLEO-L476RG学习笔记,为大家带来的是硬件随机数。
      STM32F4系列单片机自带了硬件随机数发生器( RNG ), RNG 处理器是一个以连续模拟噪声为基础的 随机数发生器,在主读时提供一个 32 位的随机数。 STM32F4 的随机数发生器构图如图1:

      STM32F4的随机数发生器采用模拟电路实现。此电路产生馈入线性反馈移位寄存器 (RNG_LFSR)的种子,用于生成 32 位随机数。
      该模拟电路由几个环形振荡器组成,的输出进行异或运算以产生种子。 RNG_LF由专用时钟 (PLL48CLK) 按恒定频率提供时钟信息,因此随机数质量与 HCLK 频率无关。当将大量种子引入 RNG_LFSR 后, RNG_LFSR 的内容会传入数据寄存器 (RNG_DR) 。同时,系统会监视模拟种子和专用时钟 PLL48CLK,当种子上出现异常序列,或 PLL48CLK 时钟频率过低,可以由 RNG_SR 寄存器的对应位读取到,如果设置了中断则在检测到错误时,还可以产生中断。
      随机数发生器操作步骤如下:

      1.使能随机数发生器时钟
            随机数发生器时钟来自PLL48CK,通过AHB2ENR寄存器使能。
      2.势能随机数发生器
          通过RNG_CR寄存器的最低位设置为1,使能随机数发生器。
      3.判断DRDY位,读取随机数值
          每次读取随机数之前,先判断RNG_SR寄存器的DRDY位,如果该位为1.则可以读取RNG_DR得到的随机数。

实现随机数的具体函数(库函数版本):

u8 RNG_Init(void)//函数功能:初始化RNG
{
      u16 retry=0;
      RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_RNG, ENABLE);//开启RNG时钟,来自PLL48CLK
      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();      
}

int RNG_Get_RandomRange(int min,int max)//函数功能:生成范围的随机数
{
   return RNG_Get_RandomNum()%(max-min+1) +min;
}

以上函数可以成功产生随机数,别忘了添加库函数!!
当然,主函数因人而异,有的朋友喜欢串口打印,有的喜欢显示屏输出,在这里我就不贴出来了。
以后有机会还会和大家分享学习成果!!



风子 发表于 2015-11-18 11:59:54


sasmike 发表于 2015-11-18 12:07:21

多谢分享,学习了
页: [1]
查看完整版本: 【NUCLEO-L476RG开发】硬件随机数