您的位置: OpenADSP社区论坛 -> Blackfin专区 -> 新手上路 -> BF518 定时器和中断问题
本帖共有1077个阅读者
发表帖子 发表投票 回复主题
BF518 定时器和中断问题
gaozl531(论坛新手)
gaozl531
头衔:社区公民
帮派:无帮无派
帖数:11
金钱:204
积分:16
注册时间:2013/4/17
楼主信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
BF518 定时器和中断问题

请教问题:用您们  BF51x_TIMER_INTERRUPT 的例程,在程序里添加了一个 TEMR4定时器应用,并让TEMR4定时器也能产生中断,但程序运行后发现原程序的TEMR0的定时器中断会进不去了,只能进TEMR4定时器中断了,我把*pSIC_IMASK1 = 1<<4; 屏蔽掉,就是不开TEMP4定时器,但它同样能进TEMR4的中断函数,不知道是什么原因。我修改程序如下:

void Init_Interrupts(void)
{
// *pSIC_IAR1 = 0xffffffff;
// *pSIC_IAR2 = 0xfffffff4;

*pSIC_IAR4 = 0x55555555;                        //我自己添加的
    
register_handler(ik_ivg12, TIMER0_ISR);  
*pSIC_IMASK1 |= 0x00000001;


    register_handler(ik_ivg12, TIMER4_ISR);  //我自己添加的

*pSIC_IMASK1 = 1<<4;                            //我自己添加的

  
}

EX_INTERRUPT_HANDLER(TIMER0_ISR)
{
*pTIMER_STATUS |= 0x0001;
printf("timer0 interrupt !\n");

}

EX_INTERRUPT_HANDLER(TIMER4_ISR)
{
*pTIMER_STATUS = 1<<16;
printf("timer4 interrupt !\n");

}

问题1:TEMR0 与TEMR4和 ik_ivg12 的关系,看手册是应该同属于 ik_ivg12 ?

问题2:TEMR0 与TEMR4的中断优先级是在 *pSIC_IARx 里设定吗?是怎么设定的?设定的数值和优先级是什么关系?

问题3:所有的中断优先级可以任意调节吗?





「该帖子被 gaozl531 在 2013-05-03 21:33:31 编辑过」

这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2013/5/3 20:42:47
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
1信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
1.优先等级默认同属于
ik_ivg12。
2. 在*pSIC_IAR4 中设置。帮助文件中搜索SIC_IAR4,找到BF51x处理器,可以看到一个中断配置表。根据表的描述配置。SIC_IAR4中对应的值,加上7就是使用的中断优先级。如你配置的为5,所以,优先级是12.
3. 可以调节,通过改变SIC_IAR4的值。

通常两个相同优先级的中断,如果中断频率过于频繁,会出现你描述的现象。解决方法,就是关闭最先进入中断的定时器中断,等待第二个中断进入之后再打开。
你屏蔽掉*pSIC_IMASK1 = 1<<4 后继续进入中断,可在寄存器菜单中找到该寄存器,查看是否上一次配置值没有清除,建议用   *pSIC_IMASK1 &= ~(1<<4)关闭。

这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2013/5/4 14:52:20
gaozl531(论坛新手)
gaozl531
头衔:社区公民
帮派:无帮无派
帖数:11
金钱:204
积分:16
注册时间:2013/4/17
2信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

问题2:还是有不懂的地方,再请教下版主;

1:TIMR0和TIMR4的中断优先级是在 *pSIC_IAR4里设置,在手册里看,对应的等级是ik_ivg12 ,这个等级是固定的吗?可不可以设置成 ik_ivg11 呢,或其它的?(ik_ivgx 是中断时一个大类的中断等级吗?然后在大类的中断里再通过4bit的数值大小来区分优先级吗?是这样理解吗?)

2:pSIC_IARx手册里好像就没有讲它们的初始值是多少?

3:它们的优先级是通过4bit(0~~15)的数值大小来设定的吗?(这个4bit的数值大小允许设置到多大)?还有你讲为什么要加上 7 后 = ik_ivg12呢?

4:麻烦你讲解下 il_ivg12、  SIC_IAR4[3:0]、   SIC_IAR4[19:16] 之间,在设置优先级时之间的关系?



General-Purpose Interrupt Value in SIC_IAR
IVG7                                        0
IVG8                                        1
IVG9                                        2
IVG10                                      3
IVG11                                      4
IVG12                                      5

IVG13                                      6

IVG14                                      7

IVG18                                     8



「该帖子被 gaozl531 在 2013-05-04 19:54:45 编辑过」

这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2013/5/4 19:19:47
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
3信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
1. SIC_IAR4中配置的值就是中断等级。你之前配置的值为5,所以按照你上面复制的等级对应关系,5对应的是12.
IVG12                                      5
如果改变timer0中断等级,把SIC_IAR4[3:0] 的值配置为其他的就可以,如配置为4,IVG就是 11,配置为3,IVG 就是10.如你复制的表对应:
IVG7                                        0
IVG8                                        1
IVG9                                        2
IVG10                                      3
IVG11                                      4
IVG12                                      5
IVG13                                      6
IVG14                                      7

2. 你复制的表格中,定时器中断都标注为
IVG12 ,所以在不配置的情况下,
SIC_IAR4 中的值都为5.


3. SIC_IAR4 中的值为0时,中断等级为7,依次类推。通常只用到IVG15.没尝试过更低的等级。所以配置值加上7就是当前的中断等级。0-6中断等级属于内核调用,用户不能使用。

4. 如 1 所述。





这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2013/5/5 13:46:35
gaozl531(论坛新手)
gaozl531
头衔:社区公民
帮派:无帮无派
帖数:11
金钱:204
积分:16
注册时间:2013/4/17
4信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

谢谢版主的解答,懂了很多了,还有一些疑惑。

1:如果SIC_IAR4中配置的值为0x55555555,那定时器temr0 ~~temr7 对应的等级都是 IVG12,那这时temr0 ~~temr7的中断优先级又是怎么区分的呢?(SIC_IAR4中配置的值可以设置成0x55555555?)  

2:如果改变timer0~·timer7中断等级,是通过SIC_IAR4[3:0] 的值配置的,如配置为4,IVG就是 11,配置为3,IVG 就是10.如下表的对应关系: timer0~·timer7通过配置可以占用 IVG7~~IVG14                                      

IVG7                                        0
IVG8                                        1
IVG9                                        2
IVG10                                      3
IVG11                                      4
IVG12                                      5
IVG13                                      6
IVG14                                      7
那其它模块的中断产生时(比如RTC产生的中断,看门狗产生的中断等等),它和timer0~·timer7的中断优先级怎么区分调节

这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2013/5/5 21:12:08
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
5信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
1. 中断属于同一优先级,可以配置为同一优先级。
2. 可以配置为7-14任意等级。
其他模块根据你的使用来分配。可以看一下RTC和看门狗是否有优先级分配,如果没有优先级分配,就是固定了优先级,通常固定的优先级都高于IVG7,不需要你分配。

这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2013/5/5 23:55:29
Powered by OpenADSP Copyright © 2010 www.Openadsp.com. All rights reserved.159290 Call, 1 Queries, Processed in 0.046875 second(s),