stm32F4 硬件随机数实例
一、STM32F4硬件随机数发生器简介
STM32F4系列的硬件随机数发生器(RNG)是一个基于连续模拟噪声的随机数发生器。该发生器在主机读数时提供一个32位的随机数,两个连续的随机数的间隔为40个PLL48CLK时钟信号周期。其内部工作原理相对复杂,但简而言之,RNG通过模拟电路产生种子,这些种子馈入线性反馈移位寄存器(LFSR),最终生成32位随机数。该过程由专用时钟(PLL48CLK)按恒定频率提供时钟信息,因此随机数质量与HCLK频率无关。
二、硬件随机数发生器的主要寄存器
STM32F4的RNG模块包含几个关键寄存器,用于配置和控制随机数生成过程:
控制寄存器(RNG_CR):用于使能随机数发生器和中断。通过设置相应的位,可以启动RNG模块并配置中断。
状态寄存器(RNG_SR):反映RNG模块的状态,特别是DRDY位,用于表示数据寄存器(RNG_DR)中的随机数数据是否有效。当DRDY位为1时,表示可以读取随机数。
数据寄存器(RNG_DR):存储生成的32位随机数。在读取随机数后,DRDY位自动清零,等待下一个随机数生成。
三、STM32F4硬件随机数发生器的应用实例
以下是一个使用STM32F4硬件随机数发生器的简单实例,演示如何初始化RNG模块并获取随机数。该实例基于STM32标准外设库或HAL库进行开发。
1. 初始化RNG模块
首先,需要使能RNG模块的时钟,并配置RNG模块的相关参数。这可以通过直接操作寄存器或使用HAL库函数来完成。
#include “stm32f4xx.h” // 或者包含 HAL 库的相关头文件
// 初始化RNG模块
void RNG_Init(void) {
// 使能RNG时钟
RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_RNG, ENABLE);
// 使能RNG模块
RNG_Cmd(ENABLE);
// 等待RNG准备就绪(可选,但推荐)
while (RNG_GetFlagStatus(RNG_FLAG_DRDY) == RESET) {
// 可以添加延时或其他处理
}
}
如果使用HAL库,则可以简化为:
RNG_HandleTypeDef RNG_Handler;
void HAL_RNG_MspInit(RNG_HandleTypeDef* hrng) {
__HAL_RCC_RNG_CLK_ENABLE(); // 使能RNG时钟
}
// 初始化RNG
void RNG_Config(void) {
RNG_Handler.Instance = RNG;
HAL_RNG_Init(&RNG_Handler);
}
2. 获取随机数
在RNG模块初始化完成后,可以通过读取RNG_DR寄存器或使用HAL库函数来获取随机数。
// 获取随机数(直接操作寄存器)
uint32_t GetRandomNumber(void) {
// 等待随机数准备就绪
while (RNG_GetFlagStatus(RNG_FLAG_DRDY) == RESET) {
// 可以添加延时或其他处理
}
// 获取随机数并清除DRDY位
return RNG_GetRandomNumber();
}
// 或者使用HAL库函数获取随机数
uint32_t HAL_GetRandomNumber(void) {
return HAL_RNG_GetRandomNumber(&RNG_Handler);
}
3. 生成指定范围内的随机数
在实际应用中,有时需要生成指定范围内的随机数。这可以通过对生成的32位随机数进行取模运算来实现。
// 生成[min, max]范围内的随机数
uint32_t GetRandomRange(uint32_t min, uint32_t max) {
return (GetRandomNumber() % (max - min + 1)) + min;
}
四、总结
STM32F4系列MCU自带的硬件随机数发生器以其高效、可靠的特性,为嵌入式系统设计提供了强有力的支持。通过合理配置和初始化RNG模块,可以轻松获取高质量的随机数,满足加密通信、安全认证等多种应用需求。