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

STM32F072使用ADC产生伪随机数

[复制链接]
lkl0305 发布时间:2015-1-25 23:08
本帖最后由 lkl0305 于 2015-1-25 23:17 编辑 ! c# ?0 ~7 d4 J0 N0 E
5 D+ R+ S8 c8 |7 x
srand和rand()配合使用产生伪随机数序列。
: q" w$ W* G% crand函数在产生随机数前,需要系统提供的生成伪随机数序列的种子,rand根据这个种子的值产生一系列随机数。
9 Z" Z! N0 J2 i8 h  ?% o( d如果系统提供的种子没有变化,每次调用rand函数生成的伪随机数序列都是一样的。3 B) L9 I9 v7 f4 [
srand(unsigned seed)通过参数seed改变系统提供的种子值,从而可以使得每次调用rand函数生成的伪随机数序列不同,从而实现真正意义上的“随机”。
; E9 b5 N4 g# N5 b7 B通常可以利用系统时间来改变系统的种子值,即srand(time(NULL)),可以为rand函数提供不同的种子值,进而产生不同的随机数序列。/ ]6 Q8 Y8 s% u) z: {: l: m3 H
当然,STM32 F2和F4系列中有硬件实现的真随机数发生器。
9 v1 C( F6 u+ \( X% [& ?我这里使用STM32F072的ADC产生随机数。读取某个悬空引脚的ADC值作为种子来获得随机数。也算是一种方法,我看其他人也用过,拿来共同学习下。
' l( t' q$ Q, Y) ?: k- b3 n上个程序:ADC_Random.c5 [3 F( s+ J0 `6 R: g9 {; W) b, @
  1. <p>#include "adc_random.h") z7 \, y. Q2 Q; O& u* D) T7 o
  2. ; G* C# T" T2 a" E
  3. uint16_t Get_ADC_RandomSeek(void);</p><p>1 X3 E3 S3 \4 p. d! ~" P1 U* R7 ]
  4. /*初始化ADC*/; a1 x* j  q. Q. H, z2 p& F
  5. void ADC_RandomConfig(void)  G5 U3 n7 d: y9 G, i. n
  6. {
    9 t9 @7 [! D% Q/ N0 T
  7. ADC_InitTypeDef ADC_InitStructure;
    + ~6 r5 H) u+ i+ z
  8. GPIO_InitTypeDef GPIO_InitStructure;  D2 Q4 Y7 C0 e+ ~( F, p8 s

  9. 1 V8 O$ r8 T  l& H- @
  10. RCC_AHBPeriphClockCmd(ADC_RANDOM_GPIO_CLK, ENABLE);; A' |0 B% k, T- L& M
  11. RCC_APB2PeriphClockCmd(ADC_RANDOM_CLK, ENABLE);
    ) U7 B7 y' B, N  R3 D) Y' m& i
  12. . Y; c# R) |5 i8 w, n+ h3 l
  13. GPIO_InitStructure.GPIO_Pin = ADC_RANDOM_PIN;$ X  y/ Y8 n% u8 Y% {
  14. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
    0 y" B4 S( _( y" a; f
  15. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;; }1 J- g8 f" [( D2 }; O+ v
  16. GPIO_Init(ADC_RANDOM_GPIO_PORT, &GPIO_InitStructure);: s! Y; C- K: A6 S) d' h4 Z
  17. # H: D3 r9 A9 ]
  18. ADC_DeInit(ADC_RANDOM);
    . q: U4 o4 ?! b
  19. ADC_StructInit(&ADC_InitStructure);
      T7 X& H& |, t- i- _# f4 n
  20. : A9 B5 R( H" F, I- ?8 [
  21. ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;* m" r# V( s* v) B( N( h+ k; @
  22. ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; / ~' F5 {' R+ \$ P7 g* |: I( }
  23. ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
    + c8 {* D2 o2 _, C
  24. ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
    . p9 N" C5 X% U' M( O
  25. ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Upward;
    ) H; m2 J) i$ V0 {4 b# ?
  26. ADC_Init(ADC_RANDOM, &ADC_InitStructure);
    & _8 c! b" A% ?1 {9 C" v
  27. ADC_ChannelConfig(ADC_RANDOM, ADC_RANDOM_CHANNEL , ADC_SampleTime_1_5Cycles);
    0 x  K) `; o7 a9 K
  28. ADC_GetCalibrationFactor(ADC_RANDOM);
    - n/ n0 {3 {% p% N7 j. S1 m
  29. ADC_Cmd(ADC_RANDOM, ENABLE); 5 I) E% ^8 K& U1 k: Z8 e
  30. while(!ADC_GetFlagStatus(ADC_RANDOM, ADC_FLAG_ADRDY));
    9 v& w2 u( T1 X- g+ i" ^' h" U
  31. }- g% T6 ~# f4 ]
  32. 1 F; L% ?1 t( U% x2 V
  33. /采集4次ADC的值,每次取采集的第四位,拼成16位作为种子*/
    " K. R' {. W$ W4 E. Q3 @: |
  34. uint16_t Get_ADC_RandomSeek(void)
    ' `( K2 k. _4 R5 j
  35. {
    7 Z! u- x- o  U- F1 E# b0 e) H
  36. uint8_t Count;( H3 g; k+ h& u5 F9 g, C
  37. uint16_t ADC_RandomSeek = 0;$ {! S1 g% f4 P/ R
  38. ADC_StartOfConversion(ADC_RANDOM);
    " v9 s! T6 @) R* M$ G
  39. for(Count = 0; Count < 4; Count++){3 ]" D+ A: n. g; p
  40. while(ADC_GetFlagStatus(ADC_RANDOM, ADC_FLAG_EOC) == RESET){5 q/ `. V2 Y( E! E- D3 x( U
  41. ;
    : e$ k$ J  Z: P" P: v
  42. }0 ~) k. E- S6 Z3 t" j/ e2 ]9 F' T
  43. ADC_RandomSeek <<= 4;0 x  t& n3 [% `) n8 J2 Z: t
  44. ADC_RandomSeek += ADC_GetConversionValue(ADC_RANDOM) & 0x000f;
    ) u" B1 u- n% F0 q9 ~  K/ ?3 [
  45. }
    ' q$ P6 r3 R, O3 J& G
  46. ADC_StopOfConversion(ADC_RANDOM);: N3 {5 V5 R3 R
  47. return ADC_RandomSeek;2 i/ F6 _% `0 Y* q0 X
  48. }
    ' @) e5 e# W; C+ d( ^4 h) |8 R

  49. * M' M! m/ ~! w/ R
  50. /*拿种子产生随机数*/( t4 w4 Y  Y7 Z! z+ N% m
  51. uint16_t Get_ADC_Random(void)
    ! |7 c6 l; H/ T- \- T% R5 D
  52. {
    / v" d7 S, Z$ B: U6 q, x. q
  53. srand(Get_ADC_RandomSeek());
    7 k/ M. @. b0 q8 v
  54. return rand();6 b& t( f3 u# ~, X
  55. }
    " _# t" t# M, u+ c+ _% |; j
  56. </p>
复制代码

, G4 R+ Z# [2 u/ s7 O7 |$ c+ {
接下来再主函数中需要的地方调用就可以了:4 Z$ W: Z" m! }, n1 }# Q
  1. int main(void)
    1 I1 l& ], Z+ A! d/ p3 v' H
  2. {
    + J/ q( a; v6 o/ S
  3.   uint16_t RandomNumber, RandomSeek;, c& v5 O* K: m5 w
  4. 3 Z. s) B. P0 H, p
  5.   USART2_GPIO_Init();$ N8 w: q% o1 m: I5 G: Z( p
  6.         
    9 V% r$ k6 x, R5 k
  7.   ADC_RandomConfig();
    2 O7 t1 Y! ?7 \$ Y0 N- X9 U
  8.   . z% z7 f- Y: ?) i: v* K0 E: m
  9.   while (1)% q7 M; H- W1 R+ \" y1 B7 o( G
  10.   {6 G- w$ ]9 A# b3 y  k3 k( h3 s
  11.     RandomSeek = Get_ADC_Random();* [! |! s" ~- P: K7 S2 [
  12.     srand(RandomSeek);
    8 i$ i) s# H4 \
  13.     RandomNumber = rand();& l; Y  `+ A6 d% y; u
  14.     printf("RandomSeek = %d\t\tRandomNumber = %d\n", RandomSeek, RandomNumber);! _/ x6 N  Y& B8 R
  15.     delay_ms(500);
    7 ?: E* C. I& l$ S" J; d4 e" a
  16.   }
    1 D9 X) t, d2 J  p
  17. }
    + B( s" J' S( q" n9 u
复制代码
完整的程序:" o: U  D2 |6 x# [! n
" v2 X, J( h/ L
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的输入怎么接?, e0 V+ i7 s1 w
或者说故意把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& m. H  g, W2 t: O% u' {9 L: d7 R; p
这个随机数还没用到过,不过ADC的波动也是在一定范围内的吧,恐怕不够随机呀,不知道最终效果怎么样? ...

) u7 g% n. _, l- t表面上看没有什么问题,随机范围很大,我大致看了些数据,最小几十,最大快到FFFF(65535)。有时间统计一下看看。
星辰一方 回答时间:2015-1-27 08:28:15
lkl0305 发表于 2015-1-26 23:14+ {. o" `% Z: i2 J# k* N. q
表面上看没有什么问题,随机范围很大,我大致看了些数据,最小几十,最大快到FFFF(65535)。有时间统计 ...

) E! M( {( y$ K" k7 D' x嗯那还可以,可以尝试从多个通道采集,随机选择
stary666 回答时间:2015-1-27 11:23:26
1066950103 回答时间:2015-12-24 17:27:11
借用了 借用了
lkl0305 回答时间:2015-12-24 22:15:49
aADu 发表于 2015-12-24 17:275 Y: Q4 c9 z& N2 B6 S' e+ W/ a
借用了 借用了

+ d- B. w. E' _3 ~尽管拿去
zhangdaijin 回答时间:2015-12-25 07:05:39
淇少爷 回答时间:2016-7-22 09:54:28
感谢分享
绚丽多彩 回答时间:2017-11-9 18:34:53
谢谢分享,我想用这个产生个序列号,作为ID来用,不知道唯一性怎么样?
) ^! |$ a" Y# e  P
- N& o: n8 H: y. K( T, k8 y0 E
12下一页

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版