[技术问答] 新手上路,求教关于定时器操作

[复制链接]
 楼主| pankration 发表于 2015-11-21 09:54 | 显示全部楼层 |阅读模式
本帖最后由 pankration 于 2015-11-21 09:55 编辑

前一段时间做了使一个LED闪烁的实验,不过用的是自己写的粗略延时函数,想着用定时器来实现精确延时,顺便学习定时器的使用。

看到了这个函数,觉得使用起来应该会很方便,就做了个小实验,
timer_func_declar.JPG

使一个LED闪烁,间隔1秒,
timer_delay_use.JPG

但是下载之后LED一直在亮,就单步调试一下,发现其实是在闪烁,只不过频率很快,
logic_cap.JPG

这是用逻辑分析仪采的信号。

所以想请教各位,这种问题如何解决,谢谢。

NUC220
KEIL MDK511

 楼主| pankration 发表于 2015-11-21 10:44 | 显示全部楼层
这个问题已经搞定,原因是没有对Timer进行初始化
稳稳の幸福 发表于 2015-11-21 15:47 | 显示全部楼层
跟你写的时间,应该是设置单片机的主频在1MHz,才可以的,这样就是刚好一秒 了。
 楼主| pankration 发表于 2015-11-21 16:38 | 显示全部楼层
稳稳の幸福 发表于 2015-11-21 15:47
跟你写的时间,应该是设置单片机的主频在1MHz,才可以的,这样就是刚好一秒 了。 ...

很感谢你的回复,这个问题是由于忘记设置Timer的时钟源引起的
timer_clk_src.JPG
C洛达尔多 发表于 2015-11-21 17:11 | 显示全部楼层
pankration 发表于 2015-11-21 10:44
这个问题已经搞定,原因是没有对Timer进行初始化

楼主把系统加上吧,定时比较准确
 楼主| pankration 发表于 2015-11-23 07:43 | 显示全部楼层
C洛达尔多 发表于 2015-11-21 17:11
楼主把系统加上吧,定时比较准确

是操作系统吗?
稳稳の幸福 发表于 2015-11-23 21:22 | 显示全部楼层
延时函数没有跟上,延时太短暂了,或许是主频太高了。
 楼主| pankration 发表于 2015-11-24 07:59 | 显示全部楼层
稳稳の幸福 发表于 2015-11-23 21:22
延时函数没有跟上,延时太短暂了,或许是主频太高了。

主频用了12M外晶振。如果是延时问题的话,那我只是在系统初始化的时候初始化了定时器的时钟,就可以正常工作了,这样是不是应该说明由于没有初始化定时器的时钟源,所以导致定时器工作异常,而与延时无关呢?
玛尼玛尼哄 发表于 2015-11-24 10:52 | 显示全部楼层
看出来你的问题 了,你那个参数是一百万?你要知道你那个参数的类似是什么,就是传递过去后给的变量类型,是整形吗?整形只能是
int数据的范围分两种:
一是有符号整数,即 int 范围是-32768~32767
二是无符号整数,即 unsigned int 范围是0~65535
玛尼玛尼哄 发表于 2015-11-24 10:53 | 显示全部楼层
一般延时函数都是用的无符号 ,也就是二是无符号整数,即 unsigned int 范围是0~65535
因此你的超过了这个界限,所以不对,请下次注意。
 楼主| pankration 发表于 2015-11-24 11:07 | 显示全部楼层
玛尼玛尼哄 发表于 2015-11-24 10:53
一般延时函数都是用的无符号 ,也就是二是无符号整数,即 unsigned int 范围是0~65535
因此你的超过了这个 ...

该函数的第二个参数应该是一个32位的无符号整数,应该不会超过的,一楼那个是官方提供的库函数。

这是在加完4楼代码之后执行的效果,TIMER_Delay(TIMER0, 1000000);用的这个函数。
timer_delay.JPG


玛尼玛尼哄 发表于 2015-11-24 11:36 | 显示全部楼层
默认的时钟源是什么呢?4楼你说忘记了设置时钟源,那么既然工作了,肯定是在运行。
 楼主| pankration 发表于 2015-11-24 13:26 | 显示全部楼层
玛尼玛尼哄 发表于 2015-11-24 11:36
默认的时钟源是什么呢?4楼你说忘记了设置时钟源,那么既然工作了,肯定是在运行。 ...

嗯。。。这个我再仔细看下资料,谢谢您的回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

29

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部