这一章在干嘛? 硬件随机数实验:RNG 外设、内置模拟电路熵源、种子与随机数。学会后密码学、安全通信更可靠。
23.1 随机数发生器简介
F407 内置 RNG(Random Number Generator)硬件外设:
- 模拟电路产生连续随机位流;
- 通过 LFSR 校验输出;
- 产生 32 位真随机数。
原书图 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 产生随机数流程图
RNG 时钟来自 HSI(16 MHz),不是 HSE。所以即便主时钟来自 HSE,RNG 仍能工作(独立时钟域)。
23.4 下载验证
串口每 200ms 打印一个随机数(应该是 32 位无规律值)。
原书图 23.4.1:串口打印随机数
🧠 小测验RNG 产生的随机数是真随机还是伪随机?
真随机(基于模拟噪声)。
RNG 需要种子吗?
不需要,上电即用。
`HAL_RNG_GenerateRandomNumber` 与 IT 版本区别?
IT 异步不阻塞,轮询会等数据 ready。