全部例程

TRNG-真随机数发生器

W55MH32

更新于 2026年9月23日

本篇总结

使用硬件 TRNG,生成真随机数。

🔑 KEIL MDK、UART调试、TRNG

硬件平台:本例程基于 W55MH32L-EVB 开发板运行。

采购推荐:点击前往 WIZnet 官方淘宝店铺 选购 W55MH32L-EVB

W55MH32 集成了专用的硬件外设——真随机数发生器 (TRNG)。
本示例演示 TRNG 的轮询(Polling)使用方式,通过串口打印每次生成的 128 位随机数。

前置工具准备

开始本例程前,请确认以下工具已安装:

硬件连接

TRNG 为片内外设,利用内部模拟噪声源产生随机性,无需外部连线。结果通过 USART1 串口打印,USART1 的 TX(PA9) 和 RX(PA10) 通过板载 USB 转串口芯片连接到 DEBUG USB 口。仅需一根 Micro USB 线连接开发板 DEBUG USB 口到 PC 即可。

引脚功能方向模式
PA9USART1_TX开发板 → PC复用推挽输出 (AF_PP)
PA10USART1_RXPC → 开发板浮空输入 (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 种子注入——加密安全的基石

下载本章例程

我们提供完整的工程文件以及配套开发板,方便你随时测试,快速完成产品开发:

开发环境: Keil MDK5 配套开发板

Andy

W5500 技术支持专家