单芯片解决方案,开启全新体验——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口数据线,就能轻松实现调试、下载以及串口打印日志等功能。开发板将所有外设全部引出,拓展功能也大幅提升,便于开发者全面评估芯片性能。

第三十四章 TRNG——真随机数
在当今数字化时代,信息安全已成为嵌入式系统设计中不可忽视的关键因素。从物联网设备的身份认证到加密通信的密钥生成,高质量的随机数是构建安全系统的基石。W55MH32内置的真随机数生成器(TRNG)模块为开发者提供了硬件级别的随机数解决方案。
本文将通过W55MH32 TRNG的工作原理、应用场景、程序设计等方面对真随机数进行讲解。
1TRNG概述
1.1简介
TRNG(True Random Number Generator)即真随机数生成器,与伪随机数生成器(PRNG)不同,其随机性来源于物理噪声,而非确定性算法。W55MH32的TRNG模块利用芯片内部的物理噪声源(如热噪声、时钟抖动等)生成不可预测的随机数,适用于加密、安全认证、随机密钥生成等对随机性要求高的场景。
1.2硬件结构
W55MH32的TRNG模块主要由以下部分组成:
- 噪声源:通常基于MOS管的热噪声或环形振荡器的抖动,产生原始随机信号。
- 放大与整形电路:增强噪声信号并转换为可处理的数字信号。
- 采样电路:对噪声信号进行采样,生成原始随机比特流。
- 熵累积器:收集采样得到的熵,积累足够的随机性。
- 随机数生成器:将累积的熵转换为可用的随机数(如32位整数)。
- 硬件测试与校准:确保噪声源正常工作,必要时进行校准。
1.3真随机与伪随机的区别
随机数在计算机科学中主要分为两类——真随机和伪随机,其对比如下所示:
特性 |
真随机数(TRNG) |
伪随机数(PRNG) |
随机性来源 |
物理噪声(热噪声、时钟抖动) |
数学算法(如线性同余法) |
可预测性 |
不可预测(基于物理现象) |
理论上可预测(已知种子和算法) |
周期性 |
无周期性 |
存在周期性(周期长度取决于算法) |
硬件依赖 |
需要特定硬件模块 |
纯软件实现 |
应用场景 |
加密、安全认证、密码学 |
模拟、游戏、非安全场景随机数 |
1.4工作流程
TRNG的工作流程可以分为以下几个关键步骤:
- 噪声采集阶段:多个环形振荡器同时工作,其输出频率的微小差异被捕获并放大。这些差异作为原始随机信号输入到后续处理电路。
- 数字化阶段:模拟的随机信号被采样并转换为数字比特流。采样过程通常使用高速时钟进行,确保捕获到足够的随机信息。
- 随机性增强阶段:原始数字信号可能存在统计偏差,需要通过算法进行后处理。W55MH32的TRNG使用一种称为"异或树"的结构,将多个环形振荡器的输出进行异或运算,增强随机性并消除可能的偏差。
- 质量检测阶段:生成的随机数经过实时统计测试,确保其符合随机性标准。W55MH32的TRNG实现了两种主要测试:
- 单比特频率测试:确保0和1的出现概率接近50%
- 游程测试:检测连续相同比特的长度是否符合随机分布
- 输出阶段:通过质量检测的随机数被存储在数据寄存器中,供CPU读取使用。当检测到质量问题时,TRNG会自动禁用输出并设置错误标志。
2应用场景
- 加密密钥生成:为AES、RSA等加密算法生成初始密钥。
- 安全认证:生成随机挑战值(Challenge)用于身份验证。
- 随机数种子:为PRNG提供高质量的初始种子。
- 安全协议:如TLS握手、VPN密钥协商等场景。
- 游戏:需要高随机性的虚拟骰子、卡牌等应用。
3注意事项
- 低功耗模式:在睡眠或停机模式下,TRNG可能停止工作,需重新初始化。
- 噪声源依赖性:温度、电压等环境因素可能影响噪声源强度,导致随机性波动。
- 验证测试:在关键应用中,建议对生成的随机数进行离线测试(如使用NIST测试工具)。
- 多线程安全:在RTOS环境中,访问TRNG时需加锁,避免竞争条件。
4程序设计
4.1TRNG_IntTest例程
TRNG_IntTest例程主要实现了基于W55MH32芯片的真随机数生成器(TRNG)中断测试功能。以下是实现过程和结果验证:
4.1.1执行函数TRNG_Int()
TRNG的中断配置、TRNG输出使能、中断使能、随机种子设置和启动TRNG硬件主要在TRNG_Int()函数中实现:
void TRNG_Int(void)
{
NVIC_Configuration();
TRNG_Out(ENABLE);
TRNG_ITConfig(ENABLE);
TRNG_SetPseudoRandom(0X12345560);
TRNG_Start();
}
4.1.2配置嵌套向量中断控制器
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);
}
该函数主要进行了如下配置:
- NVIC_PriorityGroup_1:表示使用优先级分组模式1,即:
- 抢占优先级占1位(0-1)
- 子优先级占3位(0-7)
- 中断参数配置:
- 中断源:TRNG_IRQn(真随机数生成器中断)
- 双重优先级机制:抢占优先级1可以打断更低抢占优先级的中断
- 子优先级1:相同抢占优先级时决定响应顺序
- 使能TRNG硬件中断通道
- NVIC初始化
4.1.3使能TRNG输出功能
TRNG_Out()函数是TRNG初始化过程中的关键步骤,通过控制时钟来启用或禁用TRNG模块,从而间接控制随机数的生成:
void TRNG_Out(FunctionalStateNewState)
{
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模块,是低功耗和安全设计的常见做法,其中锁定机制可防止意外修改寄存器。
4.1.4使能TRNG中断
TRNG_ITConfig()是控制TRNG中断功能的函数,主要用于启用或禁用TRNG模块的中断机制:
void TRNG_ITConfig(FunctionalStateNewState)
{
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失能中断时,则通过位操作(&= ~)清除该位,禁用中断功能。
4.1.5设置伪随机数种子
通过TRNG_SetPseudoRandom()函数设置伪随机种子,主要用于增强随机数生成的质量或实现特定应用场景:
void TRNG_SetPseudoRandom(uint32_t TRNG_PseudoRandom)
{
TRNG->RNG_PN= TRNG_PseudoRandom;
}
该函数将传入的32位种子值写入RNG_PN寄存器。
4.1.6启动TRNG硬件
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的启动初始化,为后续生成随机数做准备。
4.1.7中断服务函数
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中断挂起标志以允许后续中断。
4.1.8主函数main()
主函数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()读取并打印随机数。
4.1.9下载验证
程序下载运行后,首先打印了示例名称和系统各时钟的频率,然后便不停地打印生成的随机数:

4.2TRNG_PollingTest例程
TRNG_PollingTest例程为TRNG的轮询模式操作,与之前的中断模式不同,此函数通过主动查询方式获取随机数。
4.2.1执行函数TRNG_Polling()
TRNG的输出使能、启动和查询打印的功能主要在TRNG_Polling()函数中实现:
void TRNG_Polling(void)
{
uint32_tBuf[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()在上节内容已经讲解,且主函数仅示例名称和执行函数有所修改,其他保持一致,这里就不再赘述。
4.2.2下载验证
程序下载运行后,首先打印了示例名称和各系统时钟频率,接着便不断打印生成的随机数:

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

第二十六章 W55MH32?上位机搜索和配置示例

第十八章 W55MH32 FTP_Server示例

第十五章 W55MH32 SNMP示例

第十四章 W55MH32 TFTP示例

第九章 W55MH32 HTTP Server示例

第五章 W55MH32 UDP示例

W55MH32高性能以太网单片机开发课件 第十四章 ADC(上篇)

WIZnet W55MH32以太网单片机开发教程第十一章 通用定时器(下篇)

WIZnet W55MH32以太网单片机开发教程 第十一章 通用定时器(上篇)

W55MH32高性能以太网单片机教程 第九章 窗口看门狗(WWDG)

第二章 开发板与芯片介绍 详解W55MH32芯片及开发板

第一章 W55MH32 高性能以太网单片机的学习方法概述

评论