除了c标准库的随机发生器得到随机数以外;
stm也有一个硬件随机发生器,是通过种子信号模块模拟噪音得到的随机数;
RNG 简介
RNG 处理器是一个以连续模拟噪声为基础的随机数发生器,在主机读数时提供一个 32 位的
随机数。
RNG 主要特性
● 提供由模拟量发生器产生的 32 位随机数
● 两个连续随机数的间隔为 40 个 PLL48CLK 时钟信号周期
● 通过监视 RNG 熵来标识异常行为(产生稳定值,或产生稳定的值序列)
● 可被禁止以降低功耗
得到一个信息,时间周期长;尽量使用中断;
结构框图
1、挂在AHB总线上,所以时钟在AHB
2、模拟种子可以得到转态位监控,通过线性反馈寄存器,最后在数据寄存器得到随机数;
程序
#include"rang.h""
/****
初始化成功返回1 不成功返回0
****/
typedef struct{
uint32_t random;//存随机数
bool random_end_flag;//随机数中断的标志
bool RNG_Clock_error_flag;//时钟错误标志,没用
bool RNG_seed_error_flag;//种子模拟器的错误标志
}random_struct;
random_struct randmod_messge;
uint8_t rang_init()
{
uint32_t time=100000;
uint8_t state;
NVIC_InitTypeDef NVIC_InitStruct;
RCC_AHB2PeriphClockCmd( RCC_AHB2Periph_RNG , ENABLE); //使能随机模块时钟
RNG_Cmd(ENABLE);//使能随机发生器
while(time--)
{
if( RNG_GetFlagStatus(RNG_FLAG_DRDY) )//等待到可以产生随机数,
{
break;
}
}
NVIC_InitStruct.NVIC_IRQChannel= HASH_RNG_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=2;
NVIC_InitStruct.NVIC_IRQChannelSubPriority=2;
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStruct);
RNG_GetFlagStatus(RNG_FLAG_DRDY);
RNG_ITConfig(ENABLE);
if( time == 0)
{
state=0;
}
else
{
state=1;
}
return state;
}
void HASH_RNG_IRQHandler()
{
if(RNG_GetFlagStatus(RNG_FLAG_DRDY))
{
randmod_messge.random=RNG_GetRandomNumber();
randmod_messge.random_end_flag=true;
}
if(RNG_GetITStatus(RNG_IT_CEI))
{
randmod_messge.RNG_Clock_error_flag=true;
RNG_ClearITPendingBit(RNG_IT_CEI);
}
if(RNG_GetITStatus(RNG_IT_SEI))
{
randmod_messge.RNG_seed_error_flag=true;
RNG_ClearITPendingBit(RNG_IT_SEI);
}
}
void get_random_num( uint32_t *p)
{
uint32_t temp;
if(randmod_messge.random_end_flag == true )
{
temp =randmod_messge.random ;
randmod_messge.random_end_flag == false;
*p=temp;
}
}