打印

c674x 定时器中断只能进入一次,是什么原因

[复制链接]
2265|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
M_Gally|  楼主 | 2016-1-6 11:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

最近在用c6748的定时器模块定时产生中断,定时器配置为32-bit 非关联模式(选的是TMR34,不是TIMR12),连续运行周期重载模式基本配置代码如下:

        TMR0->TGCR = 0x00000000;                                //timer reset
        TMR0->TCR = 0x00000000;                                //internal clock source, timer disabled

           //disable interrupts and set emulation to free run.
           TMR0->INTCTLSTAT = 0;                                //disable timer's various interrupts
    SETBIT(TMR0->EMUMGT, SOFT | FREE);                //free run

        //step:
        SETBIT(TMR0->TGCR, TIMMODE_32BIT_UNCHAINED);
        SETBIT(TMR0->TGCR, PRESCALER(TIMER_DIV - 1));
        TMR0->TIM34 = 0x00000000;                        //clear timer value        
        TMR0->PRD34 = 625;                                        //PRD34 = 0.0003125s/0.5us=625        
               
        SETBIT(TMR0->TGCR, PLUSEN);                                        //enable new features(such as period reload)
        SETBIT(TMR0->TCR, ENAMODE34_CONT_RELOAD);        //enable continuously with period reload        
        TMR0->REL34 = 2* 625;                                                         //period reload register



        SETBIT(TMR0->INTCTLSTAT, PRDINTEN34);             //enable TIM0 interrupt
        SETBIT(TMR0->TGCR, TIM34RS);                             //start TIM0

按如上配置,定时器中断只能进入一次,推断是定时器重载的相关配置哪里不对所致。因为如果换成定时器连续运行非周期重载模式,就可以定时进入中断。请问大家,我的定时器重载配置有哪里配置的不对或者没有配置么?

相关帖子

沙发
Soraka| | 2016-1-6 20:41 | 只看该作者
中断标志位用不用清?

使用特权

评论回复
板凳
Garen2| | 2016-1-6 21:28 | 只看该作者
那就用定时器连续运行非周期重载模式

使用特权

评论回复
地板
zhangmangui| | 2016-1-6 22:50 | 只看该作者
我遇到过得原因:1.相关外设的时钟没有使能;2.相关标志位没有处理

使用特权

评论回复
5
M_Gally|  楼主 | 2016-1-7 13:51 | 只看该作者
Soraka 发表于 2016-1-6 20:41
中断标志位用不用清?

问题解决了。在中断服务函数中不用手动清除中断标志位。而是在中断服务函数最后添加了两行代码:
        TMR0->REL34 = 625;
        SETBIT(TMR0->INTCTLSTAT, PRDINTEN34);        //enable TIM0 interrupt
给周期重载寄存器赋周期重载值和使能定时器。
添加了这两行代码后,就可以周期性产生中断了。可是不明白一点:在定时器初始化配置中就已经使能了定时器中断,为什么在中断服务函数中还需要重新使能定时器中断才能启动定时器的周期重载模式?而在非周期重载模式下,是不需要在中断处理函数中重新使能定时器中断的

使用特权

评论回复
6
M_Gally|  楼主 | 2016-1-7 13:53 | 只看该作者
zhangmangui 发表于 2016-1-6 22:50
我遇到过得原因:1.相关外设的时钟没有使能;2.相关标志位没有处理

问题解决了。在中断服务函数中不用手动清除中断标志位(不过为保险起见,一般都会在进入中断服务函数后清除中断标志位,以响应下一次中断,对么??)。而是在中断服务函数最后添加了两行代码:
        TMR0->REL34 = 625;
        SETBIT(TMR0->INTCTLSTAT, PRDINTEN34);        //enable TIM0 interrupt
给周期重载寄存器赋周期重载值和使能定时器。
添加了这两行代码后,就可以周期性产生中断了。可是不明白一点:在定时器初始化配置中就已经使能了定时器中断,为什么在中断服务函数中还需要重新使能定时器中断才能启动定时器的周期重载模式?而在非周期重载模式下,是不需要在中断处理函数中重新使能定时器中断的

使用特权

评论回复
7
zhangmangui| | 2016-1-7 22:34 | 只看该作者
M_Gally 发表于 2016-1-7 13:53
问题解决了。在中断服务函数中不用手动清除中断标志位(不过为保险起见,一般都会在进入中断服务函数后清 ...

关于是否必须请中断标志  这个需要看相关手册   有些中断标志会硬件自动清除
有些中断标志需要软件清除  
给周期寄存器重新赋值是必须的

使用特权

评论回复
8
M_Gally|  楼主 | 2016-1-8 13:32 | 只看该作者
zhangmangui 发表于 2016-1-7 22:34
关于是否必须请中断标志  这个需要看相关手册   有些中断标志会硬件自动清除
有些中断标志需要软件清除  ...

恩,谢谢你的解答!
还想请教你一下,在定时器初始化配置中就已经使能了定时器中断,为什么在中断服务函数中还需要重新使能定时器中断才能启动定时器的周期重载模式?

使用特权

评论回复
评论
大漠无声 2019-1-21 14:09 回复TA
是需要软件清除中断标志位,而不是需要重新使能定时器。 
9
zhangmangui| | 2016-1-8 23:41 | 只看该作者
M_Gally 发表于 2016-1-8 13:32
恩,谢谢你的解答!
还想请教你一下,在定时器初始化配置中就已经使能了定时器中断,为什么在中断服务函 ...

如果确保进入中断后没有关闭定时器     那使能不是必须的   

使用特权

评论回复
10
米尔豪斯| | 2016-1-10 15:28 | 只看该作者
在定时器初始化配置中就已经使能了定时器中断,为什么在中断服务函数中还需要重新使能定时器中断才能启动定时器的周期重载模式

可能是定时器中断响应后就自动关闭了,需要再次打开才行,看看手册上是怎么说的

使用特权

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

本版积分规则

1

主题

7

帖子

1

粉丝