第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;
}