你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F072使用ADC产生伪随机数

[复制链接]
lkl0305 发布时间:2015-1-25 23:08
本帖最后由 lkl0305 于 2015-1-25 23:17 编辑

srand和rand()配合使用产生伪随机数序列。
rand函数在产生随机数前,需要系统提供的生成伪随机数序列的种子,rand根据这个种子的值产生一系列随机数。
如果系统提供的种子没有变化,每次调用rand函数生成的伪随机数序列都是一样的。
srand(unsigned seed)通过参数seed改变系统提供的种子值,从而可以使得每次调用rand函数生成的伪随机数序列不同,从而实现真正意义上的“随机”。
通常可以利用系统时间来改变系统的种子值,即srand(time(NULL)),可以为rand函数提供不同的种子值,进而产生不同的随机数序列。
当然,STM32 F2和F4系列中有硬件实现的真随机数发生器。
我这里使用STM32F072的ADC产生随机数。读取某个悬空引脚的ADC值作为种子来获得随机数。也算是一种方法,我看其他人也用过,拿来共同学习下。
上个程序:ADC_Random.c
  1. <p>#include "adc_random.h"

  2. uint16_t Get_ADC_RandomSeek(void);</p><p>
  3. /*初始化ADC*/
  4. void ADC_RandomConfig(void)
  5. {
  6. ADC_InitTypeDef ADC_InitStructure;
  7. GPIO_InitTypeDef GPIO_InitStructure;

  8. RCC_AHBPeriphClockCmd(ADC_RANDOM_GPIO_CLK, ENABLE);
  9. RCC_APB2PeriphClockCmd(ADC_RANDOM_CLK, ENABLE);

  10. GPIO_InitStructure.GPIO_Pin = ADC_RANDOM_PIN;
  11. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
  12. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
  13. GPIO_Init(ADC_RANDOM_GPIO_PORT, &GPIO_InitStructure);

  14. ADC_DeInit(ADC_RANDOM);
  15. ADC_StructInit(&ADC_InitStructure);

  16. ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
  17. ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
  18. ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
  19. ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  20. ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Upward;
  21. ADC_Init(ADC_RANDOM, &ADC_InitStructure);
  22. ADC_ChannelConfig(ADC_RANDOM, ADC_RANDOM_CHANNEL , ADC_SampleTime_1_5Cycles);
  23. ADC_GetCalibrationFactor(ADC_RANDOM);
  24. ADC_Cmd(ADC_RANDOM, ENABLE);
  25. while(!ADC_GetFlagStatus(ADC_RANDOM, ADC_FLAG_ADRDY));
  26. }

  27. /采集4次ADC的值,每次取采集的第四位,拼成16位作为种子*/
  28. uint16_t Get_ADC_RandomSeek(void)
  29. {
  30. uint8_t Count;
  31. uint16_t ADC_RandomSeek = 0;
  32. ADC_StartOfConversion(ADC_RANDOM);
  33. for(Count = 0; Count < 4; Count++){
  34. while(ADC_GetFlagStatus(ADC_RANDOM, ADC_FLAG_EOC) == RESET){
  35. ;
  36. }
  37. ADC_RandomSeek <<= 4;
  38. ADC_RandomSeek += ADC_GetConversionValue(ADC_RANDOM) & 0x000f;
  39. }
  40. ADC_StopOfConversion(ADC_RANDOM);
  41. return ADC_RandomSeek;
  42. }

  43. /*拿种子产生随机数*/
  44. uint16_t Get_ADC_Random(void)
  45. {
  46. srand(Get_ADC_RandomSeek());
  47. return rand();
  48. }
  49. </p>
复制代码

接下来再主函数中需要的地方调用就可以了:
  1. int main(void)
  2. {
  3.   uint16_t RandomNumber, RandomSeek;

  4.   USART2_GPIO_Init();
  5.         
  6.   ADC_RandomConfig();
  7.   
  8.   while (1)
  9.   {
  10.     RandomSeek = Get_ADC_Random();
  11.     srand(RandomSeek);
  12.     RandomNumber = rand();
  13.     printf("RandomSeek = %d\t\tRandomNumber = %d\n", RandomSeek, RandomNumber);
  14.     delay_ms(500);
  15.   }
  16. }
复制代码
完整的程序:

ADC_Random.rar (4.6 MB, 下载次数: 475)

评分

参与人数 1 ST金币 +2 收起 理由
一叶清风 + 2

查看全部评分

1 收藏 2 评论15 发布时间:2015-1-25 23:08

举报

15个回答
MouseCat 回答时间:2015-1-26 00:30:42
AD的输入怎么接?
或者说故意把AD的输入做的不稳定?不然每次相差一到两个字,那产生的随机器是不是也相对固定?
feel-376797 回答时间:2015-1-26 05:08:06
悬空引脚的ADC值
拼命三郎 回答时间:2015-1-26 08:06:24
stm32.jpg
星辰一方 回答时间:2015-1-26 08:38:24
这个随机数还没用到过,不过ADC的波动也是在一定范围内的吧,恐怕不够随机呀,不知道最终效果怎么样?
埃斯提爱慕 回答时间:2015-1-26 08:55:59
提示: 作者被禁止或删除 内容自动屏蔽
党国特派员 回答时间:2015-1-26 09:58:59
这东西不错,学习了。
lkl0305 回答时间:2015-1-26 23:14:40
星辰一方 发表于 2015-1-26 08:38
这个随机数还没用到过,不过ADC的波动也是在一定范围内的吧,恐怕不够随机呀,不知道最终效果怎么样? ...

表面上看没有什么问题,随机范围很大,我大致看了些数据,最小几十,最大快到FFFF(65535)。有时间统计一下看看。
星辰一方 回答时间:2015-1-27 08:28:15
lkl0305 发表于 2015-1-26 23:14
表面上看没有什么问题,随机范围很大,我大致看了些数据,最小几十,最大快到FFFF(65535)。有时间统计 ...

嗯那还可以,可以尝试从多个通道采集,随机选择
stary666 回答时间:2015-1-27 11:23:26
1066950103 回答时间:2015-12-24 17:27:11
借用了 借用了
lkl0305 回答时间:2015-12-24 22:15:49

尽管拿去
zhangdaijin 回答时间:2015-12-25 07:05:39
淇少爷 回答时间:2016-7-22 09:54:28
感谢分享
绚丽多彩 回答时间:2017-11-9 18:34:53
谢谢分享,我想用这个产生个序列号,作为ID来用,不知道唯一性怎么样?

12下一页

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版