打印

关于定时器的使用

[复制链接]
楼主: 511
手机看帖
扫描二维码
随时随地手机跟帖
楼主
lut1lut| | 2009-7-9 15:20 | 显示全部楼层 回帖奖励 |倒序浏览

我这里没有重现这个现象啊

按照lz所说,用HSI驱动。即使使用HSI,还有两条路供应时钟:
1. HSI direct:就是HSI(8M)直接作为sysclk
2. HSI indirect:使用HSI/2(4M),通过PLL,产生sysclk

以上两种方法,TIM4都工作正常,跑了一段时间,才点灯。没有说一启动TIM4就进入更新中断。

整个项目在附件中,lz可以参考一下。

Fwlib2.0.3的库,IAR4.42,跑在万利199板子上。

P.S,打开以下相应宏定义,来选择以上两种时钟方案
//#define HSI_DIRECT    
#define HSI_INDIRECT

打开项目时,请自己指定第三方驱动的路径。
相关链接:https://bbs.21ic.com/upfiles/img/20097/200979151635997.zip

使用特权

评论回复
沙发
lut1lut| | 2009-7-14 16:46 | 显示全部楼层

瓦噻,终于真相大白了!

看来STM32的Timer真是灵活得很哪!

不过要把各个环节、细节都捋一遍,弄清楚,还真要费一番工夫。

经过这个帖子的学习,四点心得:

1)PSC的赋值是缓冲"buffered"的;必须有更新事件到来,才会真正赋上值;

2) ARR的赋值可以是直接见效的;也可以是缓冲的,取决于APRE

3) TIM_TimeBaseInit() 初始化事件基这个函数里面,通过设置UG,人为产生了一个更新事件,来确保PSC和ARR能够赋上值。

4)因此,为了后面不必要的中断,需要在3)时间基初始化后清除标志,TIM_ClearFlag(TIMx, TIM_FLAG_Update) 再打开相应中断TIM_ITConfig(TIMx, TIM_IT_Update , ENABLE)。否则即使没有开始运行timer,一样要进中断。

好贴!学习了,收藏了~~~

使用特权

评论回复
板凳
lut1lut| | 2009-7-15 11:08 | 显示全部楼层

仍然使用香主变量++的办法

那你可不可以在按键产生的时候,比如导致的中断里,设置一个flag。主循环中,检查到这个flag再开始对两个变量++呢。

使用特权

评论回复
地板
lut1lut| | 2009-7-15 13:55 | 显示全部楼层

请更新固件库到至少2.0.3。你还在用1.0

从你的第三个项目中的代码中看到,LZ还是在用最最老的固件库。
V1.0中TIM_TimeBaseInit()没有对UG的设置;因此用户对ARR和PSC赋的新值,不能马上起作用。

PSC 还是初始值,估计0的样子,即TIM的时钟没有经过分频。

请更新到新的固件库。
需要注意的是:在调用了TIM_TimeBaseInit()后,为了避免不必要的中断,在开TIM的各个中断源前,先清标志。即24楼的最后一句话。

使用特权

评论回复
5
lut1lut| | 2009-7-15 14:59 | 显示全部楼层

如果问题解决了

也希望LZ可以修改帖子的题目,便于后来人搜索。

使用特权

评论回复
6
lut1lut| | 2009-7-15 18:04 | 显示全部楼层

多说一句

这件事情呢,

最开始,LZ使用错误的代码造成错误的现象,于是请求解释。

接着,有人给出了正确的代码,就不会有LZ所说的错误现象。

然后,LZ禀着“做学问嘛,总想刨根究底,不愿草草了事”的态度,一直纠结自己错误的代码,为什么就造成了错误的现象,并要求香主给个说法。

最后,香主百忙之中抽空,逐句代码帮LZ分析,并且作了实验,同时教给LZ此类问题的调试思路。

这个问题虽然涉及到了不同版本的固件库,可是这并不是造成LZ所说错误现象的根本原因。因为即使使用旧的库,只要使用正确,仍然不会出问题。所以,根本上,还是LZ自己思维上的bug,没有仔细研究STM32灵活的timer。

使用特权

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

本版积分规则