本篇总结
使用硬件 TRNG,生成真随机数。
🔑 KEIL MDK、UART调试、TRNG
硬件平台:本例程基于 W55MH32L-EVB 开发板运行。
采购推荐:点击前往 WIZnet 官方淘宝店铺 选购 W55MH32L-EVB
W55MH32 集成了专用的硬件外设——真随机数发生器 (TRNG)。
本示例演示 TRNG 的轮询(Polling)使用方式,通过串口打印每次生成的 128 位随机数。
前置工具准备
开始本例程前,请确认以下工具已安装:
- WIZ UartTool V1.0:串口调试工具:点击下载
硬件连接
TRNG 为片内外设,利用内部模拟噪声源产生随机性,无需外部连线。结果通过 USART1 串口打印,USART1 的 TX(PA9) 和 RX(PA10) 通过板载 USB 转串口芯片连接到 DEBUG USB 口。仅需一根 Micro USB 线连接开发板 DEBUG USB 口到 PC 即可。
| 引脚 | 功能 | 方向 | 模式 |
| PA9 | USART1_TX | 开发板 → PC | 复用推挽输出 (AF_PP) |
| PA10 | USART1_RX | PC → 开发板 | 浮空输入 (IN_FLOATING) |
工程结构
工程位于 SDK 内 1.SDK\ModuleDemo\ 下 TRNG 例程目录,核心文件如下:
TRNG例程/
├── USER/
│ ├── main.c ← TRNG 轮询测试 + printf 重定向
│ ├── w55mh32_conf.h ← 外设头文件集中包含
│ ├── w55mh32_it.c/h ← 中断服务函数
│ ├── system_w55mh32.c/h← 系统初始化(时钟配置)
│ └── startup_w55mh32.s ← 启动文件
└── SYSTEM/
└── delay/
└── delay.c/h ← SysTick 延时函数
TRNG 工作原理
W55MH32 的 TRNG 通过内部物理过程产生真正的随机性,遵循硬件 TRNG 标准架构,分为三个阶段:
- 熵源(Entropy Source):利用内部模拟噪声源(基于热噪声或时钟抖动)产生不可预测的电信号,是随机数生成的基础
- 数字化器(Digitizer):将熵源的模拟信号转换为原始二进制数据流,原始数据随机但可能存在统计偏差
- 调节器(Conditioner):对原始数据做后处理,消除偏差,确保比特流均匀分布,最终生成加密安全的随机数存入数据寄存器
TRNG vs PRNG
伪随机数发生器(PRNG)基于算法,给定相同种子必产生相同序列,可预测;真随机数发生器(TRNG)基于物理熵源,输出不可预测、不可重现,安全性远高于 PRNG,适合加密场景。
在 TLS/SSL 协议中,TRNG 为会话密钥生成(握手时客户端/服务器交换随机数派生共享密钥)和一次性随机数(Nonces)(防重放攻击)提供不可预测的随机值。此外还用于 IoT 设备唯一 ID 生成、安全启动、PRNG 种子注入等场景。
步骤1:轮询方式(Polling)
文件:USER/main.c | 函数:TRNG_Polling() — CPU 主动循环检查随机数是否就绪,就绪后读取并打印 128 位(4×32位)随机数。
void TRNG_Polling(void)
{
uint32_t Buf[4];
TRNG_Out(ENABLE); // 使能 TRNG 输出
TRNG_Start(); // 启动 TRNG
while (1)
{
if (0 == TRNG_Get(Buf)) // 轮询:返回 0 表示随机数就绪
{
printf("Rng : %08X %08X %08X %08X \r\n",
Buf[0], Buf[1], Buf[2], Buf[3]);
TRNG_ClearITPendingBit(TRNG_IT_RNG0_S128); // 清除就绪标志,准备下一次
}
}
}
流程:启动 TRNG 后进入无限循环,不断调用 TRNG_Get(Buf) 检查状态。返回 0 表示已生成 128 位随机数并存入 Buf,随即打印并清除标志位以触发下一次生成。轮询方式实现简单,CPU 占用相对可控,适合功能单一的测试场景。
如果你想自定义
- 调整打印节奏 → 修改
delay_ms(1000) 的参数,如改为 100 即每 100ms 打印一次
- 退出循环 → 将
while(1) 改为按需循环(如计数到 N 次后退出),即可获取指定数量的随机数
- 取部分位 → 128 位随机数存于 Buf[0..3],可按需取其中 32 位(Buf[0])或 64 位(Buf[0]+Buf[1])
运行验证
打开 WIZ UartTool V1.0,选择开发板对应 COM 口,波特率 115200 / 8N1,打开串口。程序运行后(轮询方式)串口每 1 秒打印一行 128 位随机数。预期输出如下(每次数值均不同):
TRNG Polling Out Test.
SYSCLK: 72.0Mhz, HCLK: 72.0Mhz, PCLK1: 36.0Mhz, PCLK2: 72.0Mhz, ADCCLK: 36.0Mhz
Rng : 54117318 F6C46E32 4F638A0C 4B43F139
Rng : 0B8F2D34 4F7B1D5C 7B96952A D66A44AC
Rng : 111D51C0 07D2FCB5 E768472F 298E030A
...(每次数值不同,不可预测)
WIZ UartTool 串口输出 — TRNG 随机数生成测试结果
WIZ UartTool 串口输出 — TRNG 随机数数据(续)
常见问题
Q: 轮询方式下 TRNG_Get() 一直不返回 0
确认已调用 TRNG_Out(ENABLE) 和 TRNG_Start() 启动引擎。若仍未就绪,检查 SDK 的 TRNG 驱动是否正确加入工程。
Q: 随机数看起来有规律/可预测
确认没有误用 PRNG 替代 TRNG。真随机数基于物理熵源,输出不可预测、不可重现;如果发现输出有规律,说明引擎工作异常或输入被固定。
Q: 随机数生成速率太慢
TRNG 基于物理熵源,生成速率受硬件限制(低于 PRNG)。若需大量随机数,可用 TRNG 为 PRNG 注入种子,再由 PRNG 高速生成——兼顾安全与速度。
Q: 编译报错找不到 TRNG 相关函数
检查 Include Paths 是否包含 TRNG 驱动头文件目录,并确认 SDK 的 TRNG 驱动源文件已加入工程编译列表。
Q: 串口输出乱码或无输出
先确认 PC 端波特率与 UART_Configuration(115200) 一致。若无任何输出,确认 COM 口号正确、下载后已按 RESET 键。
总结
本文基于 W55MH32 硬件 TRNG 实现了真随机数生成:
- 物理熵源:基于热噪声/时钟抖动,输出不可预测、不可重现的真随机数,安全性远高于算法 PRNG
- 三阶段架构:熵源 → 数字化器 → 调节器,消除统计偏差,保证比特流均匀分布
- 轮询方式:启动引擎后循环调用
TRNG_Get() 获取随机数,实现简单,适合功能单一的测试场景
- 核心应用:TLS/SSL 会话密钥生成、防重放 Nonce、IoT 设备唯一 ID、PRNG 种子注入——加密安全的基石