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);
}