第16章 硬件随机数实验

第十六章 硬件随机数实验

1. 硬件设计

本实验用到的硬件资源有:

  • 指示灯 DS0

  • 串口

  • KEY0 按键

  • 随机数发生器(RNG)

  • TFTLCD 模块

这些资源,我们都已经介绍了,硬件连接上面也不需要任何变动,插上 TFTLCD 模块即可。

2. 软件设计

2.1 初始化RNG

// 初始化RNG
u8 RNG_Init(void)
{
    u16 retry = 0; // 重试次数
    RNG_Handler.Instance = RNG; // 选择RNG
    HAL_RNG_Init(&RNG_Handler); // 初始化RNG
    while(__HAL_RNG_GET_FLAG(&RNG_Handler, RNG_FLAG_DRDY) == RESET&&retry<10000) // 等待RNG准备就绪
    {
        retry++;
        delay_us(10);
    }
    if(retry>=10000) 
        return 1;//随机数产生器工作不正常
    return 0;
}
// RNG MSP初始化
void HAL_RNG_MspInit(RNG_HandleTypeDef *hrng)
{
     __HAL_RCC_RNG_CLK_ENABLE(); // 使能RNG时钟
} 

2.2 获取随机数

// 得到随机数
// 返回值:获取到的随机数
u32 RNG_Get_RandomNum(void)
{
    return HAL_RNG_GetRandomNumber(&RNG_Handler);
}

2.3 生成规定范围内的随机数

// 生成[min,max]范围的随机数
int RNG_Get_RandomRange(int min,int max)
{ 
   return HAL_RNG_GetRandomNumber(&RNG_Handler)%(max-min+1) + min;
}

2.4 主函数

int main(void)
{
    u32 random;
    u8 t=0,key;
	
    HAL_Init();                 // 初始化HAL库    
    Stm32_Clock_Init(336,8,2,7);// 设置时钟,168Mhz
	delay_init(168);            // 初始化延时函数
	uart_init(115200);          // 初始化USART
	LED_Init();				    // 初始化LED	
	KEY_Init();				    // 初始化KEY
 	LCD_Init();           		// 初始化LCD
	usmart_dev.init(84); 		// 初始化USMART	
	POINT_COLOR = RED; // 设置字体颜色为红色	
    while(RNG_Init())	 		    //初始化随机数发生器
	{
		LCD_ShowString(30,130,200,16,16,"  RNG Error! ");	 
		delay_ms(200);
		LCD_ShowString(30,130,200,16,16,"RNG Trying...");	 
	}                                 
	LCD_ShowString(30,130,200,16,16,"RNG Ready!   ");	 
	LCD_ShowString(30,150,200,16,16,"KEY0:Get Random Num");	 
	LCD_ShowString(30,180,200,16,16,"Random Num:");	 
	LCD_ShowString(30,210,200,16,16,"Random Num[0-9]:"); 	   
    while(1)
    {
		key = KEY_Scan(0); // 检测按键
		if(key==KEY0_PRES) // 按键KEY0被按下
		{
			random = RNG_Get_RandomNum(); //获得随机数
			LCD_ShowNum(30+8*11,180,random,10,16); //显示随机数
		} 
		if((t%20)==0) // 每200ms
		{ 
			LED0 = !LED0;	                     // 每200ms,翻转一次LED0 
			random = RNG_Get_RandomRange(0,9);   // 获取[0,9]区间的随机数
			LCD_ShowNum(30+8*16,210,random,1,16);//显示随机数
		 }
		delay_ms(10);
		t++;
	} 
}

在所有外设初始化成功后,进入死循环,等待按键按下,如果 KEY0按下,则调用 RNG_Get_RandomNum 函数,读取随机数值,并将读到的随机数显示在 LCD 上面。每隔 200ms 获取一次区间[0,9]的随机数,并实时显示在液晶上。同时 DS0,周期性闪烁, 400ms 闪烁一次。

3. 小结

本章比较简单,主要就是运用了一个函数,来获得随机数:

HAL_RNG_GetRandomNumber(&RNG_Hand);

我们再来简单回顾一下吧:

1. 功能概述

  • 随机数生成:RNG能够生成符合统计学标准的随机数,适用于加密、安全通信等应用。
  • 硬件支持:由于是硬件实现,RNG可以比软件生成的随机数更快、更可靠。

2. 工作原理

  • RNG基于噪声源,利用内部电路产生随机性,并通过后处理算法确保输出的随机数具有良好的随机性和均匀性。

3. 主要特点

  • 速度快:硬件随机数生成速度快,能够实时生成随机数。
  • 低功耗:在低功耗模式下也能持续提供随机数,适合嵌入式应用。
  • 简单易用:通过简单的API接口获取随机数,无需复杂配置。

4. 使用方法

  • 在使用时,用户只需初始化RNG外设,然后通过相应的HAL库函数读取随机数。
  • 常用的函数包括:
    • HAL_RNG_Init():初始化RNG。
    • HAL_RNG_GenerateRandomNumber():生成随机数。

5. 示例代码

#include "stm32f4xx_hal.h"

RNG_HandleTypeDef hrng;

void RNG_Init(void) {
    __HAL_RCC_RNG_CLK_ENABLE();  // 启用RNG时钟
    hrng.Instance = RNG;
    HAL_RNG_Init(&hrng);  // 初始化RNG
}

uint32_t GetRandomNumber(void) {
    uint32_t randomNum;
    HAL_RNG_GenerateRandomNumber(&hrng, &randomNum);  // 生成随机数
    return randomNum;
}
posted @ 2024-10-11 11:11  hazy1k  阅读(4)  评论(0编辑  收藏  举报