單芯片解決方案,開啟全新體驗——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瀏覽量
11152
發布評論請先 登錄
第十四章 ADC(下篇)

W55MH32高性能以太網單片機開發課件 第十四章 ADC(上篇)

WIZnet W55MH32以太網單片機開發教程第十一章 通用定時器(下篇)

WIZnet W55MH32以太網單片機開發教程 第十一章 通用定時器(上篇)

W55MH32高性能以太網單片機教程 第九章 窗口看門狗(WWDG)

第二章 開發板與芯片介紹 詳解W55MH32芯片及開發板

第一章 W55MH32 高性能以太網單片機的學習方法概述

第十章 W55MH32中斷應用概覽

雅特力AT32 MCU的隨機數生成

評論