W55MH32以太网单片机开发教程 第三十四章 TRNG——真随机数 单芯片解决方案,开启全新体验——W55MH32高性能以太网单片机
W55MH32是WIZnet重磅推出的高性能以太网单片机,它为用户带来前所未有的集成化体验。这颗芯片将强大的组件集于一身,具体来说,一颗W55MH32内置高性能Arm® Cortex-M3核心,其主频最高可达216MHz;配备1024KB FLASH与96KB SRAM,满足存储与数据处理需求;集成TOE引擎,包含WIZnet全硬件TCP/IP协议栈、内置MAC以及PHY,拥有独立的32KB以太网收发缓存,可供8个独立硬件socket使用。如此配置,真正实现了All-in-One解决方案,为开发者提供极大便利。
在封装规格上,W55MH32 提供了两种选择:QFN100和QFN68。
W55MH32L采用QFN100封装版本,尺寸为12x12mm,其资源丰富,专为各种复杂工控场景设计。它拥有66个GPIO、3个ADC、12通道DMA、17个定时器、2个I2C、5个串口、2个SPI接口(其中1个带I2S接口复用)、1个CAN、1个USB2.0以及1个SDIO接口。如此丰富的外设资源,能够轻松应对工业控制中多样化的连接需求,无论是与各类传感器、执行器的通信,还是对复杂工业协议的支持,都能游刃有余,成为复杂工控领域的理想选择。同系列还有QFN68封装的W55MH32Q版本,该版本体积更小,仅为8x8mm,成本低,适合集成度高的网关模组等场景,软件使用方法一致。
此外,本W55MH32支持硬件加密算法单元,WIZnet还推出TOE+SSL应用,涵盖TCP SSL、HTTP SSL以及 MQTT SSL等,为网络通信安全再添保障。
为助力开发者快速上手与深入开发,基于W55MH32L这颗芯片,WIZnet精心打造了配套开发板。开发板集成WIZ-Link芯片,借助一根USB C口数据线,就能轻松实现调试、下载以及串口打印日志等功能。开发板将所有外设全部引出,拓展功能也大幅提升,便于开发者全面评估芯片性能。

在当今数字化时代,信息安全已成为嵌入式系统设计中不可忽视的关键因素。从物联网设备的身份认证到加密通信的密钥生成,高质量的随机数是构建安全系统的基石。W55MH32内置的真随机数生成器(TRNG)模块为开发者提供了硬件级别的随机数解决方案。
本文将通过W55MH32 TRNG的工作原理、应用场景、程序设计等方面对真随机数进行讲解。
TRNG(True Random Number Generator)即真随机数生成器,与伪随机数生成器(PRNG)不同,其随机性来源于物理噪声,而非确定性算法。W55MH32的TRNG模块利用芯片内部的物理噪声源(如热噪声、时钟抖动等)生成不可预测的随机数,适用于加密、安全认证、随机密钥生成等对随机性要求高的场景。
W55MH32的TRNG模块主要由以下部分组成:
随机数在计算机科学中主要分为两类——真随机和伪随机,其对比如下所示:
|
特性 |
真随机数(TRNG) |
伪随机数(PRNG) |
|
随机性来源 |
物理噪声(热噪声、时钟抖动) |
数学算法(如线性同余法) |
|
可预测性 |
不可预测(基于物理现象) |
理论上可预测(已知种子和算法) |
|
周期性 |
无周期性 |
存在周期性(周期长度取决于算法) |
|
硬件依赖 |
需要特定硬件模块 |
纯软件实现 |
|
应用场景 |
加密、安全认证、密码学 |
模拟、游戏、非安全场景随机数 |
TRNG的工作流程可以分为以下几个关键步骤:
TRNG_IntTest例程主要实现了基于W55MH32芯片的真随机数生成器(TRNG)中断测试功能。以下是实现过程和结果验证:
TRNG的中断配置、TRNG输出使能、中断使能、随机种子设置和启动TRNG硬件主要在TRNG_Int()函数中实现:
void TRNG_Int(void)
{
NVIC_Configuration();
TRNG_Out(ENABLE);
TRNG_ITConfig(ENABLE);
TRNG_SetPseudoRandom(0X12345560);
TRNG_Start();
}
NVIC_Configuration()为中断配置函数:
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_SetPriorityGrouping(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel = TRNG_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
该函数主要进行了如下配置:
TRNG_Out()函数是TRNG初始化过程中的关键步骤,通过控制时钟来启用或禁用TRNG模块,从而间接控制随机数的生成:
void TRNG_Out(FunctionalState NewState)
{
if (NewState != DISABLE)
{
RCC- >RCC_SYSCFG_CONFIG = 0x01;
SYSCFG- >SYSCFG_LOCK = 0xCDED3526;
SYSCFG- >SSC_CLK_EN |= TRNG_RNG_ENABLE;
}
else
{
RCC- >RCC_SYSCFG_CONFIG = 0x00;
SYSCFG- >SSC_CLK_EN &= ~TRNG_RNG_ENABLE;
}
}
当使能TRNG输出时,首先配置SYSCFG时钟域(RCC_SYSCFG_CONFIG=0x01),然后向锁定寄存器写入特定密钥(SYSCFG_LOCK=0xCDED3526)以解锁SYSCFG寄存器,最后设置安全系统时钟使能寄存器(SSC_CLK_EN)的对应位以开启TRNG时钟。
当失能输出时,则执行相反操作:清除时钟域配置并禁用TRNG时钟。这种设计通过时钟控制间接管理TRNG模块,是低功耗和安全设计的常见做法,其中锁定机制可防止意外修改寄存器。
TRNG_ITConfig()是控制TRNG中断功能的函数,主要用于启用或禁用TRNG模块的中断机制:
void TRNG_ITConfig(FunctionalState NewState)
{
if (NewState != DISABLE)
{
TRNG- >RNG_CSR |= TRNG_RNG_CSR_INTP_EN_Mask;
}
else
{
TRNG- >RNG_CSR &= ~TRNG_RNG_CSR_INTP_EN_Mask;
}
}
当传入参数为ENABLE使能中断时,函数通过位操作(|=)将 TRNG 控制状态寄存器(RNG_CSR)中的中断使能位(TRNG_RNG_CSR_INTP_EN_Mask)置 1,允许 TRNG 在随机数生成完成或检测到错误时触发中断。
当传入为DISABLE失能中断时,则通过位操作(&= ~)清除该位,禁用中断功能。
通过TRNG_SetPseudoRandom()函数设置伪随机种子,主要用于增强随机数生成的质量或实现特定应用场景:
void TRNG_SetPseudoRandom(uint32_t TRNG_PseudoRandom)
{
TRNG- >RNG_PN = TRNG_PseudoRandom;
}
该函数将传入的32位种子值写入RNG_PN寄存器。
TRNG_Start()为启动TRNG(真随机数生成器)的函数,通过配置特定寄存器来激活TRNG模块:
void TRNG_Start(void)
{
TRNG- >RNG_AMA &= ~TRNG_RNG_AMA_PD_ALL_Mask;
TRNG- >RNG_CSR &= ~TRNG_RNG_CSR_S128_TRNG0_Mask;
}
函数首先通过TRNG->RNG_AMA &= ~TRNG_RNG_AMA_PD_ALL_Mask来清除电源关闭位,将TRNG的模拟电路从低功耗模式唤醒,激活环形振荡器等物理随机源;接着通过TRNG->RNG_CSR &= ~TRNG_RNG_CSR_S128_TRNG0_Mask清除128位采样模式标志。这两个步骤共同完成TRNG的启动初始化,为后续生成随机数做准备。
RNG_IRQHandler()是处理TRNG中断的函数,主要用于响应随机数生成完成事件和检测到的安全攻击事件:
void RNG_IRQHandler(void)
{
if (TRNG_GetITStatus(TRNG_IT_RNG0_S128) == SET)
{
printf("Rng : %08X %08X %08X %08X rn", TRNG- >RNG_DATA, TRNG- >RNG_DATA, TRNG- >RNG_DATA, TRNG- >RNG_DATA);
TRNG_ClearITPendingBit(TRNG_IT_RNG0_S128);
}
if (TRNG_GetITStatus(TRNG_IT_RNG0_ATTACK) == SET)
{
TRNG_ClearITPendingBit(TRNG_IT_RNG0_ATTACK);
}
NVIC_ClearPendingIRQ(TRNG_IRQn);
}
当128位随机数生成完成(TRNG_IT_RNG0_S128标志置位)时,函数通过连续4次读取RNG_DATA寄存器获取128位随机数(4个32位值)并打印输出,随后清除中断标志;当检测到安全攻击(TRNG_IT_RNG0_ATTACK标志置位)时,清除中断标志。最后,函数清除NVIC中断挂起标志以允许后续中断。
主函数main()如下:
int main(void)
{
RCC_ClocksTypeDef clocks;
delay_init();
UART_Configuration(115200);
printf("TRNG Int Out Test.n");
RCC_GetClocksFreq(&clocks);
printf("SYSCLK: %3.1fMhz, HCLK: %3.1fMhz, PCLK1: %3.1fMhz, PCLK2: %3.1fMhz, ADCCLK: %3.1fMhzn",
(float)clocks.SYSCLK_Frequency / 1000000, (float)clocks.HCLK_Frequency / 1000000,
(float)clocks.PCLK1_Frequency / 1000000, (float)clocks.PCLK2_Frequency / 1000000, (float)clocks.ADCCLK_Frequency / 1000000);
TRNG_Int();
while (1);
}
程序首先初始化延时函数并配置串口通信(波特率115200),随后打印系统各时钟频率(SYSCLK、HCLK、PCLK1/2、ADCCLK)。接着调用TRNG_Int()函数初始化TRNG,该函数会配置NVIC中断、使能TRNG输出、设置中断模式和伪随机种子并启动TRNG。最后程序进入无限循环,等待TRNG生成128位随机数时触发中断,由中断处理函数RNG_IRQHandler()读取并打印随机数。
程序下载运行后,首先打印了示例名称和系统各时钟的频率,然后便不停地打印生成的随机数:

TRNG_PollingTest例程为TRNG的轮询模式操作,与之前的中断模式不同,此函数通过主动查询方式获取随机数。
TRNG的输出使能、启动和查询打印的功能主要在TRNG_Polling()函数中实现:
void TRNG_Polling(void)
{
uint32_t Buf[4];
TRNG_Out(ENABLE);
TRNG_Start();
while (1)
{
if (0 == TRNG_Get(Buf))
{
printf("Rng : %08X %08X %08X %08X rn", Buf[0], Buf[1], Buf[2], Buf[3]);
TRNG_ClearITPendingBit(TRNG_IT_RNG0_S128);
}
}
}
首先定义了一个4元素的32位整数数组作为缓冲区,然后调用TRNG_Out(ENABLE)使能TRNG输出,并通过TRNG_Start()启动TRNG生成随机数。随后进入无限循环,不断调用TRNG_Get()函数尝试获取随机数,当该函数返回0时表示获取成功,此时将4个32位随机数打印输出,并清除中断标志位(即使在轮询模式下也需清除)。
TRNG_Start()和TRNG_Get()在上节内容已经讲解,且主函数仅示例名称和执行函数有所修改,其他保持一致,这里就不再赘述。
程序下载运行后,首先打印了示例名称和各系统时钟频率,接着便不断打印生成的随机数:

W55MH32的TRNG模块为嵌入式系统提供了硬件级别的真随机数生成能力,是构建安全系统的重要组成部分。通过合理配置和使用,可以生成高质量的随机数,满足加密、认证等安全敏感应用的需求。
WIZnet是一家无晶圆厂半导体公司,成立于1998年。产品包括互联网处理器iMCU™,它采用TOE(TCP/IP卸载引擎)技术,基于独特的专利全硬连线TCP/IP。iMCU™面向各种应用中的嵌入式互联网设备。
WIZnet在全球拥有70多家分销商,在香港、韩国、美国设有办事处,提供技术支持和产品营销。
香港办事处管理的区域包括:澳大利亚、印度、土耳其、亚洲(韩国和日本除外)。
全部0条评论
快来发表一下你的评论吧 !