这一章在干嘛?

硬件随机数实验:RNG 外设、内置模拟电路熵源、种子与随机数。学会后密码学、安全通信更可靠。

23.1 随机数发生器简介

23.2 硬件设计

23.3 程序设计

23.4 下载验证

23.1 随机数发生器简介

F407 内置 RNG(Random Number Generator)硬件外设:

  • 模拟电路产生连续随机位流;
  • 通过 LFSR 校验输出;
  • 产生 32 位真随机数。

原书图 23.1.1:RNG 框图原书图 23.1.1:RNG 框图

项目RNG
随机源模拟噪声
速度~16 Mbps
是否需要种子否(真随机)
典型应用密码学密钥、协议随机数

RNG 是真随机数,而 srand(time()) 是伪随机(依赖种子)。

23.2 硬件设计

无外部电路,纯片内外设。

23.3 程序设计

23.3.1 CubeMX 配置

  • RCC → RNG Clock Source
  • RNG → Activated, Interrupt on Seed Done (可选)

23.3.2 关键代码

HAL_RNG_Init(&hrng);
uint32_t r;
HAL_RNG_GenerateRandomNumber(&hrng, &r);
printf("Random: 0x%08X\n", r);

异步模式:

HAL_RNG_GenerateRandomNumber_IT(&hrng);

void HAL_RNG_ReadyCallback(RNG_HandleTypeDef *hrng) {
    uint32_t r;
    HAL_RNG_GenerateRandomNumber(hrng, &r);
    printf("Random: 0x%08X\n", r);
}

原书图 23.3.2.1:RNG 产生随机数流程图原书图 23.3.2.1:RNG 产生随机数流程图

RNG 时钟来自 HSI(16 MHz),不是 HSE。所以即便主时钟来自 HSE,RNG 仍能工作(独立时钟域)。

23.4 下载验证

串口每 200ms 打印一个随机数(应该是 32 位无规律值)。

原书图 23.4.1:串口打印随机数原书图 23.4.1:串口打印随机数