当前位置:网站首页>单片机没有随机数发生器如何生成随机数——2022.07.26
单片机没有随机数发生器如何生成随机数——2022.07.26
2022-07-30 02:21:00 【ZZZ_XXJ】
有时项目中需要用到随机数,但并不是每种单片机都有真随机数发生器,如何在没有随机数发生器的单片机中生成随机数呢?
这里分享两种单片机产生随机数的方法,这些也是我在项目中经常会用到的。
方法一:C库函数 rand()
最方便快捷也是最经典的方法就是直接使用C库函数 rand() 来生成随机数。
extern _ARMABI int rand(void);
/* * Computes a sequence of pseudo-random integers in the range 0 to RAND_MAX. * Uses an additive generator (Mitchell & Moore) of the form: * Xn = (X[n-24] + X[n-55]) MOD 2^31 * This is described in section 3.2.2 of Knuth, vol 2. It's period is * in excess of 2^55 and its randomness properties, though unproven, are * conjectured to be good. Empirical testing since 1958 has shown no flaws. * Returns: a pseudo-random integer. */
使用方法:
rand()函数的使用方法就不贴上来了,这个是C语言的基础函数之一,大家肯定都会的。
方法二:利用ADC噪声
由于热噪声和生产误差等因素,ADC原始数据的最低1位总会有波动,我们可以利用这些波动生成随机数。
拿stm32来举例,可以利用stm32测内核温度的ADC通道来生成随机数。
生成代码如下,ADC初始化部分的就不放上来了,就是普通的DMA模式采集数据的ADC初始化,打开ADC1的通道16。利用DMA连续转换32个ADC原始数据,取每个数据的最低位依次拼接成一个32bit随机数。
uint32_t adc_randnum;
uint16_t adc_data[32];
void DMA1_Channel1_IRQHandler(void)
{
static __IO uint8_t count = 0;
if(DMA_GetITStatus(DMA1_INT_TC1) == SET)
{
DMA_ClearFlag(DMA1_INT_TC1);
ADC_DMACtrl(ADC1, DISABLE);
ADC_Ctrl(ADC1, DISABLE);
for(uint32_t i = 0; i < 32; i += 4)
{
adc_randnum += (adc_data[i] & 0x0001) << i;
adc_randnum += (adc_data[i+1] & 0x0001) << i;
adc_randnum += (adc_data[i+2] & 0x0001) << i;
adc_randnum += (adc_data[i+3] & 0x0001) << i;
}
ADC_DMACtrl(ADC1, ENABLE);
ADC_Ctrl(ADC1, ENABLE);
ADC_SoftwareStartConvCtrl(ADC1, ENABLE);
}
}
边栏推荐
猜你喜欢

一文读懂Elephant Swap,为何为ePLATO带来如此高的溢价?

Type-C边充电边OTG芯片——LDR6028A

STM32L4R9ZIY6PTR STM32L4高性能嵌入式—MCU

一个塑料瓶的海洋“奇幻漂流”

SwiftUI SQLite Database Storage Tutorial Collection (2022 Edition)

超详细的MySQL基本操作

Tibetan Mapping

DAP数据加工流程梳理

Push the image to the Alibaba Cloud private warehouse

JS Bom window innerWidth clientWidth onresize 窗口滚动偏移量 返回顶部
随机推荐
零代码工具推荐---HiFlow
戴尔首款纯软产品,再定义下一代对象存储
【C语言刷LeetCode】451. 根据字符出现频率排序(M)
Kotlin接口
houdini 使用HDA Processor 实现处理HDA输入输出
解决:Error while adding the mapper ‘interface to configuration. Error parsing Mapper XML
LeetCode 2348. Number of all-zero subarrays
flutter学习之widget的显示和隐藏
LeetCode 2352. Equal Row Column Pairs
MPLS VPN跨域-optionC2
Typora transparent background image
有一个设计时钟的题目,进行详细分析(三)
机器学习(十五)异常检测
LeetCode每日一题(874. Walking Robot Simulation)
成功解决pydotplus.graphviz.InvocationException: GraphViz‘s executables not found
解决:npm ERR code ELIFECYCLE npm ERR errno 1(安装脚手架过程中,在npm run dev 时发生错误)
ESP8266 +0.96“ I2C OLED 表盘时钟
JS history.back() go(-1) Location 跳转 重新加载页面 get请求 返回顶部 bom
fluttter学习之ButtonStyle 、MaterialStateProperty
RAII Technology Learning