0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

W55MH32以太网单片机开发教程 第三十四章 TRNG——真随机数

W55MH32 ? 来源:W55MH32 ? 作者: W55MH32 ? 2025-07-01 16:10 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

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

wKgZPGhjkceAQighABA5X7BENG0290.png

第三十四章 TRNG——真随机数

在当今数字化时代,信息安全已成为嵌入式系统设计中不可忽视的关键因素。从物联网设备的身份认证到加密通信的密钥生成,高质量的随机数是构建安全系统的基石。W55MH32内置的真随机数生成器(TRNG)模块为开发者提供了硬件级别的随机数解决方案。

本文将通过W55MH32 TRNG的工作原理、应用场景、程序设计等方面对真随机数进行讲解。

1TRNG概述

1.1简介

TRNG(True Random Number Generator)即真随机数生成器,与伪随机数生成器(PRNG)不同,其随机性来源于物理噪声,而非确定性算法。W55MH32的TRNG模块利用芯片内部的物理噪声源(如热噪声、时钟抖动等)生成不可预测的随机数,适用于加密、安全认证、随机密钥生成等对随机性要求高的场景。

1.2硬件结构

W55MH32的TRNG模块主要由以下部分组成:

  1. 噪声源:通常基于MOS管的热噪声或环形振荡器的抖动,产生原始随机信号
  2. 放大与整形电路:增强噪声信号并转换为可处理的数字信号
  3. 采样电路:对噪声信号进行采样,生成原始随机比特流。
  4. 熵累积器:收集采样得到的熵,积累足够的随机性。
  5. 随机数生成器:将累积的熵转换为可用的随机数(如32位整数)。
  6. 硬件测试与校准:确保噪声源正常工作,必要时进行校准。

1.3真随机与伪随机的区别

随机数在计算机科学中主要分为两类——真随机和伪随机,其对比如下所示:

特性

真随机数(TRNG)

伪随机数(PRNG)

随机性来源

物理噪声(热噪声、时钟抖动)

数学算法(如线性同余法)

可预测性

不可预测(基于物理现象)

理论上可预测(已知种子和算法)

周期性

无周期性

存在周期性(周期长度取决于算法)

硬件依赖

需要特定硬件模块

纯软件实现

应用场景

加密、安全认证、密码学

模拟、游戏、非安全场景随机数

1.4工作流程

TRNG的工作流程可以分为以下几个关键步骤:

  1. 噪声采集阶段:多个环形振荡器同时工作,其输出频率的微小差异被捕获并放大。这些差异作为原始随机信号输入到后续处理电路。
  2. 数字化阶段:模拟的随机信号被采样并转换为数字比特流。采样过程通常使用高速时钟进行,确保捕获到足够的随机信息。
  3. 随机性增强阶段:原始数字信号可能存在统计偏差,需要通过算法进行后处理。W55MH32的TRNG使用一种称为"异或树"的结构,将多个环形振荡器的输出进行异或运算,增强随机性并消除可能的偏差。
  4. 质量检测阶段:生成的随机数经过实时统计测试,确保其符合随机性标准。W55MH32的TRNG实现了两种主要测试:
  5. 单比特频率测试:确保0和1的出现概率接近50%
  6. 游程测试:检测连续相同比特的长度是否符合随机分布
  7. 输出阶段:通过质量检测的随机数被存储在数据寄存器中,供CPU读取使用。当检测到质量问题时,TRNG会自动禁用输出并设置错误标志。

2应用场景

  1. 加密密钥生成:为AES、RSA等加密算法生成初始密钥。
  2. 安全认证:生成随机挑战值(Challenge)用于身份验证。
  3. 随机数种子:为PRNG提供高质量的初始种子。
  4. 安全协议:如TLS握手、VPN密钥协商等场景。
  5. 游戏:需要高随机性的虚拟骰子、卡牌等应用。

3注意事项

  1. 低功耗模式:在睡眠或停机模式下,TRNG可能停止工作,需重新初始化。
  2. 噪声源依赖性:温度、电压等环境因素可能影响噪声源强度,导致随机性波动。
  3. 验证测试:在关键应用中,建议对生成的随机数进行离线测试(如使用NIST测试工具)。
  4. 多线程安全:在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);
}

该函数主要进行了如下配置:

  1. NVIC_PriorityGroup_1:表示使用优先级分组模式1,即:
  2. 抢占优先级占1位(0-1)
  3. 子优先级占3位(0-7)
  4. 中断参数配置:
  5. 中断源:TRNG_IRQn(真随机数生成器中断)
  6. 双重优先级机制:抢占优先级1可以打断更低抢占优先级的中断
  7. 子优先级1:相同抢占优先级时决定响应顺序
  8. 使能TRNG硬件中断通道
  9. 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下载验证

程序下载运行后,首先打印了示例名称和系统各时钟的频率,然后便不停地打印生成的随机数:

wKgZPGhjlouAKjwLAAmyAjekxeM732.png

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下载验证

程序下载运行后,首先打印了示例名称和各系统时钟频率,接着便不断打印生成的随机数:

wKgZO2hjloqAMDLsAAoewriwtFI329.png

5总结

W55MH32的TRNG模块为嵌入式系统提供了硬件级别的真随机数生成能力,是构建安全系统的重要组成部分。通过合理配置和使用,可以生成高质量的随机数,满足加密、认证等安全敏感应用的需求。

WIZnet是一家无晶圆厂半导体公司,成立于1998年。产品包括互联网处理器iMCU?,它采用TOE(TCP/IP卸载引擎)技术,基于独特的专利全硬连线TCP/IP。iMCU?面向各种应用中的嵌入式互联网设备。

WIZnet在全球拥有70多家分销商,在香港、韩国、美国设有办事处,提供技术支持和产品营销。

香港办事处管理的区域包括:澳大利亚、印度、土耳其、亚洲(韩国和日本除外)。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    第三十W55MH32 HTTP_Server&NetBIOS示例

    本文讲解了如何在 W55MH32?芯片上实现 HTTP_Server?与 NetBIOS?功能,并通过 NetBIOS?访问 HTTP?服务器网页内容,通过实战例程展示了在主循环中并行处理 HTTP?与 NetBIOS?相关事务的过程。
    的头像 发表于 07-24 16:21 ?192次阅读
    <b class='flag-5'>第三十</b>章 <b class='flag-5'>W55MH32</b> HTTP_Server&amp;NetBIOS示例

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

    本文讲解了如何在 W55MH32?芯片上实现上位搜索和配置功能,通过实战例程展示了使用开源上位配置工具 SmartConfigTool?搜索局域中的
    的头像 发表于 07-24 16:13 ?146次阅读
    第二十六章 <b class='flag-5'>W55MH32</b>?上位<b class='flag-5'>机</b>搜索和配置示例

    第十八章 W55MH32 FTP_Server示例

    本文讲解了如何在 W55MH32?芯片上实现 FTP?协议的服务器模式,通过实战例程展示了使用 W55MH32?作为 FTP?服务器与 PC?端进行文件传输、目录操作等功能的过程,涵盖获取网络配置
    的头像 发表于 07-24 11:55 ?99次阅读
    第十八章 <b class='flag-5'>W55MH32</b> FTP_Server示例

    第十五章 W55MH32 SNMP示例

    本文讲解了如何在 W55MH32?芯片上实现 SNMP?功能,通过实战例程展示了使用 MIB Browser?管理 W55MH32?的具体过程,涵盖在 MIB Browser?中创建分支、添加叶子
    的头像 发表于 07-24 10:43 ?202次阅读
    第十五章 <b class='flag-5'>W55MH32</b> SNMP示例

    十四章 W55MH32 TFTP示例

    本文讲解了如何在 W55MH32?芯片上实现 TFTP?协议,通过实战例程详细展示了使用 TFTP?客户端模式从服务器获取文本文件的过程,涵盖 TFTP?初始化、发送读请求、运行协议并处理结果等核心
    的头像 发表于 07-24 10:37 ?181次阅读
    第<b class='flag-5'>十四章</b> <b class='flag-5'>W55MH32</b> TFTP示例

    第九章 W55MH32 HTTP Server示例

    本文介绍了在 W55MH32?芯片上实现 HTTP Server?功能,并通过浏览器修改其网络地址信息的方法。阐述了 HTTP?协议的概念、特点、应用场景、工作流程、请求方法、响应内容,以及 Web?页面构成和交互方式。展示了在W55MH32上实现的过程。
    的头像 发表于 07-24 09:35 ?158次阅读
    第九章 <b class='flag-5'>W55MH32</b> HTTP Server示例

    第五章 W55MH32 UDP示例

    本文介绍了在 W55MH32?芯片上实现 UDP?通信及数据回环测试的方法。阐述了 UDP?协议的概念、特点、应用场景、报文传输流程和报文结构,展示了实现过程,借助网络调试工具完成测试。
    的头像 发表于 07-24 09:13 ?124次阅读
    第五章 <b class='flag-5'>W55MH32</b> UDP示例

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

    本章介绍了W55MH32的12位ADC(上篇),其有18通道,支持单次、连续等转换模式,具有自校准、模拟看门狗等功能。还含ADC_AnalogWatchdog 例程,可监测电压超阈值并触发中断。
    的头像 发表于 05-28 13:52 ?271次阅读
    <b class='flag-5'>W55MH32</b>高性能<b class='flag-5'>以太网</b><b class='flag-5'>单片机</b><b class='flag-5'>开发</b>课件 第<b class='flag-5'>十四章</b> ADC(上篇)

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

    本章为W55MH32通用定时器的下篇,介绍了TIM_InputCapture 等 4 个程序设计例程,涉及输入捕获、PWM 输出、中断测试、触摸检测等功能和例程下载验证情况,如串口输出、波形检测等。
    的头像 发表于 05-28 10:48 ?519次阅读
    WIZnet <b class='flag-5'>W55MH32</b><b class='flag-5'>以太网</b><b class='flag-5'>单片机</b><b class='flag-5'>开发</b>教程第十一章 通用定时器(下篇)

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

    本章介绍了W55MH32的通用定时器TIM2~TIM5,其由 16 位计数器等构成,具输入捕获等功能,有多种计数模式及时钟选择。对例程进行了讲解并下载验证,TIM9~14功能类似,详见《W55MH32参考手册》。
    的头像 发表于 05-28 10:12 ?430次阅读
    WIZnet <b class='flag-5'>W55MH32</b><b class='flag-5'>以太网</b><b class='flag-5'>单片机</b><b class='flag-5'>开发</b>教程 第十一章 通用定时器(上篇)

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

    本章介绍了W55MH32的窗口看门狗(WWDG),其用于监测软件故障,具可编程递减计数器等特性。从寄存器、中断喂狗和复位测试两个程序例程进行讲解。
    的头像 发表于 05-27 10:26 ?394次阅读
    <b class='flag-5'>W55MH32</b>高性能<b class='flag-5'>以太网</b><b class='flag-5'>单片机</b>教程 第九章 窗口看门狗(WWDG)

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

    本章介绍了W55MH32芯片及开发板。该芯片采用Cortex-M3内核,主频216MHz,集成以太网功能,有L和Q两种型号。配套开发板L-EVB功能丰富、Q-EVB为最小系统板,均含仿
    的头像 发表于 05-26 09:19 ?473次阅读
    第二章 <b class='flag-5'>开发</b>板与芯片介绍  详解<b class='flag-5'>W55MH32</b>芯片及<b class='flag-5'>开发</b>板

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

    本章介绍W55MH32的学习方法,建议先了解硬件资源,按基础篇、入门篇循序渐进学习。参考两份手册,提供例程资料,还给出官、github 等学习资料查找渠道。让我们一起踏上W55MH32高性能
    的头像 发表于 05-26 09:07 ?158次阅读
    第一章 <b class='flag-5'>W55MH32</b> 高性能<b class='flag-5'>以太网</b><b class='flag-5'>单片机</b>的学习方法概述

    即刻启程,踏上W55MH32高性能以太网单片机学习之路!

    即刻启程,踏上W55MH32高性能以太网单片机学习之路!即刻开启W55MH32学习之旅!本教系列程配套官方手册与W55MH32L
    的头像 发表于 05-07 18:51 ?453次阅读
    即刻启程,踏上<b class='flag-5'>W55MH32</b>高性能<b class='flag-5'>以太网</b><b class='flag-5'>单片机</b>学习之路!

    WIZnet高性能以太网单片机W55MH32重磅发布!

    WIZnet高性能以太网单片机W55MH32重磅发布!本文详细解析了W55MH32芯片的高性能网络处理能力与硬件资源,以及两款开发板(L/Q
    的头像 发表于 05-07 16:17 ?475次阅读
    WIZnet高性能<b class='flag-5'>以太网</b><b class='flag-5'>单片机</b><b class='flag-5'>W55MH32</b>重磅发布!