13 STM32-随机数发生器 (RNG)

13.1 随机数发生器 (RNG)简介

RNG 处理器是一个以连续模拟噪声为基础的随机数发生器,在主机读数时提供一个 32 位的随机数.
RNG 提供由模拟量发生器产生的 32 位随机数,两个连续随机数的间隔为 40 个 PLL48CLK 时钟信号周期

13.2 RNG框图

在这里插入图片描述

随机数发生器采用模拟电路实现。模拟电路会源源不断的产生随机数的种子,并放入LFSR中,当将大量种子引入 RNG_LFSR 后,RNG_LFSR 的内容会传入数据寄存器 (RNG_DR),即产生了随机数。同时,系统会监视模拟种子和专用时钟 PLL48CLK。状态位(RNG_SR 寄存器中)指示何时在种子上出现异常序列,或指示何时 PLL48CLK 时钟频率过低。检测到错误或生成随机数时可以生成中断。
如果 CEIS 位的值为 1(时钟错误)出现时钟错误时,RNG 无法再产生随机数,因为 PLL48CLK 时钟不正确。此时应检查时钟控制器是否正确配置,是否可提供 RNG 时钟,然后将 CEIS 位清零。当 CECS 位为 0 时,RNG 可正常工作。时钟错误对产生的上一个随机数没有影响,RNG_DR 寄存器内容可以使用。
如果 SEIS 位的值为 1(种子错误)出现种子错误时,只要 SECS 位为 1,就会中断随机数产生。如果 RNG_DR 寄存器中有可用随机数,不能使用该随机数,因为它可能没有足够的熵。
应执行以下操作:将 SEIS 位清零,然后将 RNGEN 位清零并置 1,以便重新初始化和重新启动 RNG。
13.3 寄存器
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

13.4 示例

#include "stm32f4xx.h"
#include "usart.h"
#include "delay.h"


void RngInit()
{
   
    RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_RNG,ENABLE); // 使能随机数时钟
    RNG_Cmd(ENABLE); // 命令开始
    RNG_ITConfig(ENABLE); // 使能中断
}


int main(void)
{
   
    uint32_t t=0;
    uart_init(38400);
    delay_init(168);
    RngInit();

    while(1)
    {
   
        t = RNG_GetRandomNumber();
        printf("t:%d\r\n",t);
        delay_ms(1000);
    }
}

// 随机数发生错误中断
void HASH_RNG_IRQHandler()
{
   
    if(RNG_GetITStatus(RNG_IT_CEI))
    {
   
        RNG_ClearITPendingBit(RNG_IT_CEI);
        while(1);
    }
    
    if(RNG_GetITStatus(RNG_IT_SEI))
    {
   
        RNG_ClearITPendingBit(RNG_IT_SEI);
        while(1);
    }
}

结果:
串口输出随机数,1秒一个
t:1022588955
t:-657224238
t:749173973
t:1695776011
t:59840523
t:963349731
t:146175500
t:-1360248947
t:1275759650
t:-1859302243
t:-971661004
t:1853953939
t:-72955338
t:-465182740
t:1388639291
t:-1443259421
t:121775036
t:815789949
t:1291676023
t:867471519
t:-1935526956

相关推荐

  1. <span style='color:red;'>STM</span><span style='color:red;'>32</span>F<span style='color:red;'>103</span>

    STM32F103

    2024-01-23 08:42:02      51 阅读
  2. 15 STM32 - SPI

    2024-01-23 08:42:02       37 阅读

最近更新

  1. Linux系统管理面试题

    2024-01-23 08:42:02       0 阅读
  2. IO练习网络爬虫获取

    2024-01-23 08:42:02       0 阅读
  3. C++设计模式---备忘录模式

    2024-01-23 08:42:02       0 阅读
  4. WHAT - React useEffect 依赖的 Object.is

    2024-01-23 08:42:02       0 阅读

热门阅读

  1. gin框架复习

    2024-01-23 08:42:02       35 阅读
  2. Elasticsearch 查询超过10000 的解决方案 - Python

    2024-01-23 08:42:02       39 阅读
  3. vue v-for 为什么要加 key

    2024-01-23 08:42:02       30 阅读
  4. mac os电脑用n切换node版本

    2024-01-23 08:42:02       28 阅读
  5. 如何进行技术选型

    2024-01-23 08:42:02       32 阅读
  6. 网络安全小白进阶试题——附答案

    2024-01-23 08:42:02       30 阅读
  7. flask web 学习之用户认证与会话管理

    2024-01-23 08:42:02       36 阅读