当前位置: 首页 > news >正文

STM32F4X RNG随机数发生器

STM32F4X RNG随机数发生器

  • 随机数的作用
  • STM32F4X 随机数发生器
    • RNG控制寄存器
    • RNG状态寄存器
    • RNG数据寄存器
    • RNG数据步骤
    • RNG例程

随机数的作用

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

STM32F4X 随机数发生器

RNG控制寄存器

在这里插入图片描述
在这里插入图片描述
RNG的控制寄存器的bit0使能随机数发生器是否工作,bit1则使能是否使用中断

RNG状态寄存器

在这里插入图片描述
在这里插入图片描述
状态寄存器是判断随机数发生器工作是否正常,通过判断状态寄存器的位可以知道随机数是否产生是否正确

RNG数据寄存器

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

RNG数据步骤

STM32F4X的数据手册给出了随机数发生器的使用步骤
在这里插入图片描述

RNG例程

#include "rng.h"void rng_init(void)
{NVIC_InitTypeDef NVIC_InitStruct;RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_RNG,ENABLE); // 使能RNG时钟#ifdef RNG_INITNVIC_InitStruct.NVIC_IRQChannel = HASH_RNG_IRQn; //  中断编号NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 2; // 抢占优先级为1NVIC_InitStruct.NVIC_IRQChannelSubPriority =  2; // 响应优先级为1NVIC_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);}}

在这里插入图片描述

http://www.lryc.cn/news/156269.html

相关文章:

  • 5、QT中SQLite数据库的操作
  • git回退到某个提交
  • 对可再生能源和微电网集成研究的新控制技术和保护算法进行基线和测试及静态、时域和频率分析研究(Matlab代码实现)
  • Full authentication is required to access this resource解决办法
  • Jetty:使用上下文文件部署离线瓦片.md
  • Docker实战:docker compose 搭建Rocketmq
  • STL常用容器 (C++核心基础教程之STL容器详解)String的API
  • 《人生苦短,我学Python》——条件判断->(if-elif-else)多向选择 条件嵌套
  • MongoDB 数据库性能优化技巧
  • 网络安全人才缺口超百万,如今的就业情况怎样?
  • 「MySQL」MySQL面试题全解析:常见问题与高级技巧详解
  • 【USRP】产品型号、参数、架构全解析系列 6:N320 / N321
  • Apifox 常用 JS 脚本
  • 防止SQL注入的四种方案
  • java单元测试
  • 【LeetCode】双指针求解和为s的两个数字
  • opencv识别一张图片的多个红框,并截取红框的内容
  • 数据库-事务
  • MySQL 使用开源审计插件
  • Python入门教程 | Python3 集合(Set)
  • 视频汇聚/视频云存储/视频监控管理平台EasyCVR安全检查的相关问题及解决方法2.0
  • 【C++模拟实现】反向迭代器的实现
  • Kubernetes技术--k8s核心技术持久化存储
  • 【80天学习完《深入理解计算机系统》】第十四天 复习第三章
  • 库中是如何实现string类的?
  • 无涯教程-JavaScript - WORKDAY.INTL函数
  • STM32--蓝牙
  • java 实现原型模式
  • maven本地安装jar包install-file,解决没有pom的问题
  • 【C++学习笔记】5、变量作用域