请选择 进入手机版 | 继续访问电脑版

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

开机后定时器一旦使能即进入中断,不经定时。何解?

[复制链接]
必胜鸟 提问时间:2021-5-25 12:22 / 未解决
定时器初始化:

void Init_Timer1(void)
{
    TIM1_CR1=0x00;       //不使能计数器
    TIM1_ARRH=0x2F;     //自动重装的值
    TIM1_PSCRL=0xFF;    //分频值,根据初值和分频值,定时在2秒多;
    TIM1_IER=0x01;        //更新中断使能
    TIM1_CR1=0x01;       //使能计数器
}
------------------------
中断服务程序:

#pragma vector=TIM1_OVR_UIF_vector
__interrupt void TIM1_OVR_UIF_IRQHandler(void)
{
      asm("sim");               //关中断;   
      PB_ODR^=0x20;       //改变LED状态;
      TIM1_SR1=0x00;       //清除状态寄存器;
      TIM1_CR1=0x00;       //不使能计数器;
       asm("rim");              //开中断,然后中断返回;
}

-------------------------
B5端口初始化:

void Init_GPIO(void)
{
    PB_DDR|=0x20;
    PB_CR1|=0x20;
    PB_CR2&=0xDF;
}

------------------------------------
利用B5端口的推挽输出LED,通过LED亮灭判断状态。

现在问题是,一开机就会进中断,可以观察到LED迅速闪一下。按照预想的情况,开机应该是亮定时的时间后灭,实际不然。

在下开发环境是IAR,Debugger设备是ST-Link。在编译调试环境里单步运行的时候是正常的,能正常进入计数的进程,计数溢出后才进中断。

以上问题困扰在下2天了,望各位前辈不吝赐教,感激不尽。



收藏 评论10 发布时间:2021-5-25 12:22

举报

10个回答
奇迹 回答时间:2021-5-25 13:19:17
建议给 TIM1_PSCRH、TIM1_ARRL也赋一下值,可能是正常触发,但是定时时间太短了。

xmshao 回答时间:2021-5-25 13:54:43
如果一使能定时器就进入更新中断的话,你将断点放在使能定时器更新中断语句前,按理可以发现更新中断标志被置位的情况。你不妨在使能定时器更新中断代码前 对更新事件标志做下清零动作,即对那个UIF@TIMx_SR进行清零.
必胜鸟 回答时间:2021-5-25 17:34:45
奇迹 发表于 2021-5-25 13:19
建议给 TIM1_PSCRH、TIM1_ARRL也赋一下值,可能是正常触发,但是定时时间太短了。

...

感谢回复,定时不短,可以算得出,就是2秒左右。可以确定是一启动就进中断,没计时的过程。那两个寄存器赋值不赋值我都试过,没有差异。
必胜鸟 回答时间:2021-5-25 17:38:19
xmshao 发表于 2021-5-25 13:54
如果一使能定时器就进入更新中断的话,你将断点放在使能定时器更新中断语句前,按理可以发现更新中断标志被 ...

感谢回复!!单步执行的过程完全正常,跟预想的没有差别,状态寄存器在第一次溢出时才会置位,而且由0x00变成0x1F,具体为啥这样我也不清楚。
胤幻1988 回答时间:2021-5-25 21:47:31
直接加断点,然后调试,看到底有无进入进入中断。在在中断中,串口打印一串数据看看。
必胜鸟 回答时间:2021-5-26 14:02:15
胤幻1988 发表于 2021-5-25 21:47
直接加断点,然后调试,看到底有无进入进入中断。在在中断中,串口打印一串数据看看。 ...

主贴里已经提到了:


在编译调试环境里单步运行的时候是正常的,能正常进入计数的进程,计数溢出后才进中断。

--------------------------------------
您说的加断点调试意思是不是看有没有开机直接进中断?调试时我在调试器里按F11单步运行的,显示的结果是正常的。开机做完初始化,使能计数器后下一步能看到主程序指针停留在死循环上,计数器在每运行一步时增加2-3个值,直到溢出才进中断。而如果把断点设在中断服务程序里,那么运行的时候,根本不会有停留,没有相应的计数步骤,直接就进中断了。


按程序里的初值和分频值,向上计数的情况下,每次溢出需要1.5秒左右。用LED显示应该能观察到有没有计时操作。
wenyangzeng 回答时间:2021-5-26 19:54:50
定时器中断函数里不允许关闭总中断。
必胜鸟 回答时间:2021-5-26 20:03:42
wenyangzeng 发表于 2021-5-26 19:54
定时器中断函数里不允许关闭总中断。

十分感谢您的回复和指点。马上先改一下。

我看到很多帖子说是清Timx_SR1的UIF位,我试过,没效果。也试过在Timx_PSCR赋值前置位Timx_CR1的ugs位置,也没有效果。。。
必胜鸟 回答时间:2021-5-26 20:12:28
wenyangzeng 发表于 2021-5-26 19:54
定时器中断函数里不允许关闭总中断。

改过了,似乎对主帖提到的问题来说没什么改变
butterflyspring 回答时间:2021-6-21 14:20:07
试试在 “TIM1_CR1=0x01;       //使能计数器” 前增加一句   "TIM1_EGR   |=0x01;"    看看
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版