除了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;}}