打印
[STM32F4]

STM32F4X RNG随机数发生器

[复制链接]
1009|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
随机数的作用

随机数顾名思义就是随机产生的数字,这种数字最大的特点就是其不确定性,你不知道它下一次产生的数字是什么。随机数被广泛应用于密码学、模拟实验、游戏开发领域等。

STM32F4X 随机数发生器RNG控制寄存器


RNG的控制寄存器的bit0使能随机数发生器是否工作,bit1则使能是否使用中断

使用特权

评论回复
沙发
梅花香自123|  楼主 | 2023-12-27 13:08 | 只看该作者
RNG状态寄存器


使用特权

评论回复
板凳
梅花香自123|  楼主 | 2023-12-27 13:08 | 只看该作者

状态寄存器是判断随机数发生器工作是否正常,通过判断状态寄存器的位可以知道随机数是否产生是否正确

使用特权

评论回复
地板
梅花香自123|  楼主 | 2023-12-27 13:08 | 只看该作者
RNG数据寄存器

如果上面的随机数的状态寄存器里面的状态都没有异常,而且数据已经准备就绪了,用户就可以读取数据寄存器把随机数读出来。

使用特权

评论回复
5
梅花香自123|  楼主 | 2023-12-27 13:09 | 只看该作者
RNG数据步骤
STM32F4X的数据手册给出了随机数发生器的使用步骤

使用特权

评论回复
6
梅花香自123|  楼主 | 2023-12-27 13:09 | 只看该作者
RNG例程

#include "rng.h"



void rng_init(void)
{
        NVIC_InitTypeDef NVIC_InitStruct;
       
        RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_RNG,ENABLE); // 使能RNG时钟
       
#ifdef RNG_INIT
        NVIC_InitStruct.NVIC_IRQChannel = HASH_RNG_IRQn; //  中断编号
        NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 2; // 抢占优先级为1
        NVIC_InitStruct.NVIC_IRQChannelSubPriority =  2; // 响应优先级为1
        NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; // 使能中断
        NVIC_Init(&NVIC_InitStruct); // 初始化中断
        RNG_ITConfig(ENABLE);
       
#endif       
        RNG_Cmd(ENABLE);
       
       
}

uint32_t get_rng_randomdata(void)
{
        static uint32_t first_random_num = 0,second_random_num = 0,count = 0;

        if(RNG_GetFlagStatus(RNG_FLAG_CECS | RNG_FLAG_SECS) == RESET) // 判断CECS 和 SECS
        {
                if(RNG_GetFlagStatus(RNG_FLAG_DRDY) == SET) // 判断随机数是都准备好
                {
                        count++;
                        if (count >= 0xFFFFFFFF)
                                count = 0;
                        if (count == 1)
                                return;
                       
                        second_random_num = first_random_num;
                        first_random_num = RNG_GetRandomNumber(); // 读取随机数
                        if(first_random_num != second_random_num) // 本次生成的随机数跟上一次生成的随机数对比
                                printf("random create success %8X %8X\r\n",first_random_num,second_random_num);
                        else
                                printf("random create fail \r\n");
                }

                RNG_ClearFlag(RNG_FLAG_CECS | RNG_FLAG_SECS);
                       
        }
        return 0;
}
       
void HASH_RNG_IRQHandler(void)
{
        static uint32_t first_random_num = 0,second_random_num = 0,count = 0;
        if(RNG_GetITStatus(RNG_IT_CEI | RNG_IT_SEI) == RESET)
        {
                if(RNG_GetFlagStatus(RNG_FLAG_DRDY) == SET)
                {
                        count++;
                        if (count >= 0xFFFFFFFF)
                                count = 0;
                        if (count == 1)
                                return;
                       
                        second_random_num = first_random_num;
                        first_random_num = RNG_GetRandomNumber(); // 读取随机数
                        if(first_random_num != second_random_num) // 本次生成的随机数跟上一次生成的随机数对比
                                printf("random create success %8X %8X\r\n",first_random_num,second_random_num);
                        else
                                printf("random create fail \r\n");
                }
                RNG_ClearITPendingBit(RNG_IT_CEI | RNG_IT_SEI);
               
        }
               
               
}

使用特权

评论回复
7
梅花香自123|  楼主 | 2023-12-27 13:09 | 只看该作者

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

101

主题

1108

帖子

0

粉丝