打印

请教“香水城老大”定时器定时不准确的问题,谢谢

[复制链接]
1888|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hyuan|  楼主 | 2010-11-2 16:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
void TIM2_INIT()
{
  RCC->APB1ENR |= (1<<0);                         //TIM2EN 定时器2时钟使能
  TIM2->PSC |= 63999;                              
  TIM2->ARR |=1000;                                //1S产生一次中断
  TIM2->DIER |= TIM_DIER_UIE;                         //允许timer2更新中断
  NVIC->ISER[0] |= (1 << (TIM2_IRQChannel & 0x1F));   //enable interrupt
TIM2->CR1 |= TIM_CR1_CEN;                           //使能计数器,启动TIM2;
 TIM2->EGR |= TIM_EGR_UG;
}
上面是我的TIM2初始化,我现在的TIMXCLK 是64M,我现在设定分频后后的值为1000HZ,即TIM2->PSC |= 63999;;这样当ARR=1000,就是1s进入一次中断,可实际进入是断时间要远远超1s,当TIM2->PSC |= 1000;左右时,感觉才能1s进入中断一次,不知哪地方出问题,望香主不吝赐教,感觉就是时钟变慢几千倍。谢谢
沙发
hyuan|  楼主 | 2010-11-2 17:45 | 只看该作者
补充下,发现改变ARR的值,在中断函数里灯的闪动不会变化,也就是说好像没有用到ARR里面的值

使用特权

评论回复
板凳
ST_ARM| | 2010-11-3 10:56 | 只看该作者
改变TIM2->PSC 的值,看看有没有变化

使用特权

评论回复
地板
香水城| | 2010-11-3 11:27 | 只看该作者
为什么使用“|=”?

使用特权

评论回复
5
jgphu| | 2010-11-3 11:30 | 只看该作者
TIM2->ARR |=1000;                                //1S产生一次中断
这句有问题。你要定时1000次, TIM2->ARR =1000;    才对。

使用特权

评论回复
6
hyuan|  楼主 | 2010-11-3 11:38 | 只看该作者
香主一指点,我这发热的头脑从迷雾中走出来, 原来这里TIM2->ARR |=1000; 不能用|=,这是以前形成的不好的习惯造成的,本意是让控制寄存器相应的位置1,这里对这样的赋值寄存器ARR来说只要直接赋值就行了,用“|=”就会出现错误,香主一句话,胜我两天的折腾,多谢多谢,同时感谢3楼的ST_ARM兄弟!!

使用特权

评论回复
7
hyuan|  楼主 | 2010-11-3 11:38 | 只看该作者
:victory:

使用特权

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

本版积分规则

0

主题

11

帖子

1

粉丝