stm32通过adc生成随机数

stm32伪随机的使用

前言

最近使用了一款芯片,内置随机数发生器,封装了一个 8 Byte的指令接口,mcu每次发送指令给芯片,芯片就会返回 8 字节随机数。但如果没有芯片,这个随机数也就不行了,想起来了伪随机数,接下来就是实现过程,很简单

伪随机数的建立:

最常见的使用方法是:srand和rand()配合使用产生伪随机数序列,其中rand()充当所谓的随机数“种子”,其次还有使用定时器、adc。

本文基于srand()函数与adc实现伪随机数,其中
srand()函数:
头文件:#include<stdlib.h>
原型:void srand(unsigned int seed);

1.最简单的伪随机数:
unsigned int cnt;

//------------------------------------------------------------------------------
//  MCU Random Number Generation
//------------------------------------------------------------------------------
void GetSoftRandom(unsigned char *random, unsigned short len)
{
    unsigned short i;

    srand(cnt++); 
    for (i=0; i<len; i++) random[i] = rand() % 256;
} 

这种实现的方法确实是简单到不能再简单。简单说当你 mcu 断了个电,那 cnt 的值就变为 0 ,那接下来就会造成随机数不在随机,会相同,这就是最大的缺点。

2.使用adc:

这里省略初始化过程,adc配置如下

//获得ADC值
//ch:通道值 0~3,我选择的通道 1
u16 Get_Adc(u8 ch)   
{
  	//设置指定ADC的规则组通道,一个序列,采样时间
	ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 );	//ADC1,ADC通道,采样时间为239.5周期	  			    
	ADC_SoftwareStartConvCmd(ADC1, ENABLE);		//使能指定的ADC1的软件转换启动功能	
	while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束
	return ADC_GetConversionValue(ADC1);	//返回最近一次ADC1规则组的转换结果
}
main调用及结果

通过这种使用adc的方式使每次的结果更随机,

int main(void)
{ 
    unsigned char random[30];
 	Adc_Init();		  		//ADC初始化	    

    GetSoftRandom(random,20);
	while(1);										    
}

在这里插入图片描述在这里插入图片描述

  • 1
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
生成随机数,可以利用ADC模块采集芯片内部噪声电压,通过处理获得一组随机数。 以下是基于STM32F103C8T6的ADC生成随机数的示例代码,仅供参考: ```c #include "stm32f10x.h" #include <stdlib.h> #define ADC1_DR_Address ((uint32_t)0x4001244C) // ADC1 数据寄存器地址 void ADC_Configuration(void) { ADC_InitTypeDef ADC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = DISABLE; ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 1; ADC_Init(ADC1, &ADC_InitStructure); ADC_RegularChannelConfig(ADC1, ADC_Channel_16, 1, ADC_SampleTime_239Cycles5); ADC_Cmd(ADC1, ENABLE); } uint16_t Get_Random_Number(void) { ADC_RegularChannelConfig(ADC1, ADC_Channel_16, 1, ADC_SampleTime_239Cycles5); ADC_SoftwareStartConvCmd(ADC1, ENABLE); while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); // 等待转换完成 return ADC_GetConversionValue(ADC1); // 返回采样结果 } int main(void) { uint16_t random_num; ADC_Configuration(); // 初始化 ADC while(1) { random_num = Get_Random_Number(); srand(random_num); // 以随机数为种子初始化随机数生成器 // 进行随机数生成操作 } } ``` 该代码中,首先调用`ADC_Configuration()`函数初始化ADC模块,然后在`Get_Random_Number()`函数中进行一次ADC采样,返回采样结果。在主函数中,将采样结果作为随机数生成器的种子,然后进行随机数生成操作。需要注意的是,由于ADC采样结果的精度只有12位,因此生成随机数也只能是12位。如果需要更高精度的随机数,可以考虑使用外部硬件随机数发生器。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值