打印

STM32产生随机数问题

[复制链接]
21057|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zzifeng|  楼主 | 2011-10-21 14:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM32产生随机数问题:
在STM32中用C语言产生一个随机数,该怎么写?下面的两种处理有什么问题呢?(注:想产生一个1228~2868之间的随机数)
处理一:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
main()
{
    u32 temp;
   
    srand((unsigned int)(time(NULL)));
    temp = rand()%(2868 - 1228 + 1) + 1228;
}
编译的时候,出现Undefined symbol time (referred from main.o)

把上面的NULL替换程&t,也是不行
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
main()
{
    u32 temp;
    time_t t;
    srand((unsigned int)(time(&t)));
    temp = rand()%(2868 - 1228 + 1) + 1228;
}
编译的时候,同样出现Undefined symbol time (referred from main.o)
沙发
香水城| | 2011-10-21 17:05 | 只看该作者
time是什么?

使用特权

评论回复
板凳
zzifeng|  楼主 | 2011-10-25 15:02 | 只看该作者
2# 香水城
你好~
time应该是系统自带的、类似于时钟的东西吧...?

srand((unsigned int)(time(NULL)))的写法是网上的说法(用于C语言)
就是不清楚STM32中能不能用?

或者有什么别的方法可用来生成随机数?

使用特权

评论回复
地板
香水城| | 2011-10-25 16:07 | 只看该作者
2# 香水城  
你好~
time应该是系统自带的、类似于时钟的东西吧...?

srand((unsigned int)(time(NULL)))的写法是网上的说法(用于C语言)
就是不清楚STM32中能不能用?

或者有什么别的方法可用来生成随机数? ...
zzifeng 发表于 2011-10-25 15:02


STM32的应用环境是裸奔,没有系统,更没有什么系统自带的东西,任何东西都要自己写或显式地调用合适的函数包。

使用特权

评论回复
5
airwill| | 2011-10-25 16:41 | 只看该作者
有道理, 不知道LZ 哪里搬来的程序.
不过 STM32 倒是很好找这个 time, 可以开启一个定时器, 或者 Systick. 然后读他们的 count 寄存器.

使用特权

评论回复
6
zzifeng|  楼主 | 2011-10-26 09:11 | 只看该作者
4# 香水城
嗯,这个后来才知道的...
不过,不知道有没合适的函数包可以调用呢?
自己写的话,没什么头绪,麻烦指点下

使用特权

评论回复
7
zzifeng|  楼主 | 2011-10-26 09:11 | 只看该作者
6# zzifeng
定时器可能用在其他地方,可能在其他使用过程中会被清除或者进行其他操作...
而且,用这样的方法,产生的随机数应该有一定的局限吧?

使用特权

评论回复
8
airwill| | 2011-10-27 15:33 | 只看该作者
是的, 用定时器还不是真正的随机. 除非你调用的时候是随机的. 如果调用时间是定时器溢出周期的很多很多倍, 那也可以当随机了.

使用特权

评论回复
9
heuyck| | 2011-10-27 16:24 | 只看该作者
找一个悬空的ADC输入,读ad采样值,取其最低1字节,重复取4次组成一个双字,拿来当rand种子包你够随机。。

使用特权

评论回复
10
husb2000| | 2011-10-27 18:38 | 只看该作者
9楼的方法还真有点新意!

使用特权

评论回复
11
LDTEST| | 2011-10-27 20:07 | 只看该作者
……9楼 真有才!

使用特权

评论回复
12
zzifeng|  楼主 | 2011-10-27 20:29 | 只看该作者
9# heuyck
悬空的ADC输入?
悬空的时候,引脚的状态不能确定
引脚的状态应该会受到外围环境的影响吧?
而且,悬空的引脚状态应该也在一定的范围之内吧?这样产生的随机数也是有一定的限制了...

使用特权

评论回复
13
李富贵| | 2011-10-27 22:18 | 只看该作者
一般用定时器读数做随机种子。
关键问题还是你什么时候读取种子,比方说操作人员按键时刻读种子,由于人的操作和定时器运行完全不相关,所以此时产生的随机数就是真随机数。

使用特权

评论回复
14
airwill| | 2011-10-28 10:19 | 只看该作者
9楼 真忽悠人, 人家新人是认真的呢! 楼主别听他瞎摆.

使用特权

评论回复
15
zzifeng|  楼主 | 2011-11-1 18:04 | 只看该作者
本帖最后由 zzifeng 于 2011-11-1 18:07 编辑

13# 李富贵

使用特权

评论回复
16
zzifeng|  楼主 | 2011-11-1 18:25 | 只看该作者
问题是操作是根据上层来执行的
有可能出现“同一”时候读取时间种子的情况...

而且,用定时器读取会有前面说的问题
——定时器可能用在其他地方,在使用过程中有可能被清除

看来没有什么好的方法了...?

使用特权

评论回复
17
香水城| | 2011-11-1 20:13 | 只看该作者
STM32 F2和F4系列中有硬件实现的真随机数发生器,是用模拟的方法实现的,直接读取即可。

使用特权

评论回复
18
zzifeng|  楼主 | 2011-11-2 18:55 | 只看该作者
17# 香水城

请问:有这方面的资料可以参考下吗?
谢谢了~

使用特权

评论回复
19
香水城| | 2011-11-2 21:07 | 只看该作者
17# 香水城

请问:有这方面的资料可以参考下吗?
谢谢了~
zzifeng 发表于 2011-11-2 18:55


STM32F2的资料网页:http://www.st.com/internet/mcu/subclass/1520.jsp

STM32F4的资料网页:http://www.st.com/internet/mcu/subclass/1521.jsp

所有STM32的资料网页:http://www.st.com/stm32

使用特权

评论回复
20
zzifeng|  楼主 | 2011-11-3 08:39 | 只看该作者
20# 香水城
好的,非常感谢~

STM32F103*看来是没带这个功能了...

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

22

帖子

1

粉丝