28035的定时器0中断标志位

[复制链接]
5504|7
手机看帖
扫描二维码
随时随地手机跟帖
lijinpeng90|  楼主 | 2013-6-23 10:40 | 显示全部楼层 |阅读模式
28035的定时器0中断标志位不需要手动清除吗?例程的子程序是这么写的

interrupt void cpu_timer0_isr(void)
{
   CpuTimer0.InterruptCount++;
   GpioDataRegs.GPBTOGGLE.bit.GPIO34 = 1; // Toggle GPIO34 once per 500 milliseconds
   // Acknowledge this interrupt to receive more interrupts from group 1
   PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}

相关帖子

zhangmangui| | 2013-6-23 23:15 | 显示全部楼层
看看下面说明   来自读书频道


定时器0 中断设置

定时器0 中断设置由以下几个步骤组成。

1)定时器0 中断的基本条件

除了对周期寄存器(PRDH:PRD)及定时器分频器(TPRH:TPR)进行必要的设置之外,使能定时器0 中断有两条必须的指令:

CpuTimer0Regs.TCR.bit.TSS = 0; //启动定时器  
Timer->RegsAddr->TCR.bit.TIE = 1; //使能定时器中断
如果缺少上面两条指令中的一条,将不会产生中断。

2)确定中断向量的入口地址

主程序通过“DSP281x_PieVect.c”文件中的InitPieVectTable()函数,已经为PIE 向量表中的所有中断向量配置了对应向量的入口地址。如果针对某一个外设中断专门有一个中断服务程序,则这个中断服务程序的入口地址必须取代前面配置的入口地址,它由下面的指令完成:

EALLOW; //允许访问受保护的寄存器  
PieVectTable.TINT0 = &cpu_timer0_isr; //取cpu_timer0_isr 地址赋值给  
//TINT0中断向量  
EDIS; //禁止访问受保护的寄存器
上面指令中,cpu_timer0_isr()函数是针对TINT0 中断向量的一个中断服务程序,&cpu_timer0_isr 是该程序的入口地址。

3)使能PIE 级及CPU 级中断向量


这个步骤由下面4 类指令完成:

先找出中断向量在PIE 向量表中所在的组及在这组中所处的优先级。经查TINT0是第1 组第7 个中断,因此先通过PIE 级指令“PieCtrlRegs.PIEIER1.bit.INTx7 =1;”,使能PIE 第1 组第7 个TINT0 中断(INTx7 由头文件定义为PIE 中断使能寄存器(PIEIER)的第7 位)。

通过CPU 级的赋值指令“IER |= M_INT1;”,使能第1 组(M_INT1 由头文件定义为0x0001,指向第1 组),即把TINT0 中断汇集到CPU 级的INT1 中断线上。

通过“EINT;”指令使能全局中断,实际指令为:

PieCtrlRegs.PIEIER1.bit.INTx7 = 1; //使能PIE 中的TINT0,1 组第7 个中断  
IER |= M_INT1; //使能第1 组中断  
EINT; //使能INTM 全局中断
这里用了按位或复合运算符“|=”,其用意是不破坏IER 原有结构。如果程序仅此一个中断,可以用 “IER = 0x0001;”指令,否则,会破坏IER 原有结构。

使能PIE 向量表,由下面一条指令完成。

PieCtrlRegs.PIECRTL.bit.ENPIE = 1;
实际上这条指令包含在初始化PIE 向量表InitPieVectTable()函数中,主程序对这个函数已经调用。因此可省略。

4)中断服务程序

中断服务程序是以关键字interrupt 开头的一个程序。通常在中断服务程序中有两条必须的指令:一条是中断应答,另一条是将中断标志位清0。

定时器0 中断应答指令为:

PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; //PIEACK_GROUP1=0x0001
PIE 应答寄存器PIEACK 是中断从PIE 级进入CPU 级的门禁。一个中断在进入CPU级之前,其对应的PIEACK[x.1]必须通过软件清0,打开后续INTx 的PIE 级到CPU 的通道。而当这个中断进入CPU 级INTx 中断线时,硬件将PIEACK[x.1]位置1,关闭后续INTx 的PIE 级到CPU 的通道。这条指令通过向PIEACK[0]写1,将PIEACK[0]位清0,从而打开后续INT1 的PIE 级到CPU 级的中断。注意:PIEACK[x.1]对INTx 中断线(1 x 12)。

源码的中断服务程序中没有将中断标志位清0 的指令。当程序开始运行并执行到指令“CpuTimer0Regs.TCR.bit.TSS = 0;”时,定时器中断标志位TIF(TCR[15])即从0 变成1。这意味着一旦启动定时器即触发定时器中断之后,即使通过软件将该位置1,也不能将其清0。

5)中断服务程序及中断初始化函数声明

如果中断服务程序及中断初始化函数放在主函数的下面,则在主函数头部要对中断服务程序及中断初始化函数进行声明:

interrupt void cpu_timer0_isr();
如果中断服务函数放在主函数的上面,则不必进行声明。

使用特权

评论回复
lijinpeng90|  楼主 | 2013-7-1 09:19 | 显示全部楼层
zhangmangui 发表于 2013-6-23 23:15
看看下面说明   来自读书频道

使用特权

评论回复
dadizi1018232| | 2016-9-5 08:31 | 显示全部楼层
zhangmangui 发表于 2013-6-23 23:15
看看下面说明   来自读书频道

版主,我在试验中发现,CPU定时器进入中断后,不需要手动清零该外设级中断标志位,下次也能再次进入CPU定时器中断。理论上这不应该的,外设级中断标志位和PIE应答位都需要手动清零,不然CPU无法再次响应中断请求。版主,你碰到过这个问题吗?

使用特权

评论回复
zhangmangui| | 2016-9-5 23:19 | 显示全部楼层
dadizi1018232 发表于 2016-9-5 08:31
版主,我在试验中发现,CPU定时器进入中断后,不需要手动清零该外设级中断标志位,下次也能再次进入CPU定 ...

你再确认一下   看看手册  是不是自动清除啊

使用特权

评论回复
dadizi1018232| | 2016-9-6 08:40 | 显示全部楼层
zhangmangui 发表于 2016-9-5 23:19
你再确认一下   看看手册  是不是自动清除啊

已经再次查过手册,的确没提到是否自动清零。又看了两本中文书,倒是提到2812的SCI、SPI的中断标志位不需要手动清零,但还是没提到CPU定时器

使用特权

评论回复
zhangmangui| | 2016-9-6 23:07 | 显示全部楼层
dadizi1018232 发表于 2016-9-6 08:40
已经再次查过手册,的确没提到是否自动清零。又看了两本中文书,倒是提到2812的SCI、SPI的中断标志位不需 ...

http://www.ti.com.cn/cn/lit/ug/sprugl8c/sprugl8c.pdf
第118页  看看吧

使用特权

评论回复
月离朱户| | 2018-5-23 21:23 | 显示全部楼层
dadizi1018232 发表于 2016-9-6 08:40
已经再次查过手册,的确没提到是否自动清零。又看了两本中文书,倒是提到2812的SCI、SPI的中断标志位不需 ...

不知道楼主找到原因了没,我用DSP28335也碰到了类似的问题,把定时器0中断标志清除行注释之后它还是能自动变0后来发现是cpu定时器重新装载位TRB写1后就把中断标志位清0了。但之后我把重新装载位也注释之后,定时器还是能进入中断,而此时的定时器中断位一直是1。

使用特权

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

本版积分规则

25

主题

65

帖子

1

粉丝