PGIE 位 意义是什么?使用中断时需要程序员对它进行什么操作?对GIE位,可以用API函数 IRQ_globalEnable 进行置1;
那么PGIE位有没有API函数呢,没有找到。需要对 PGIE位进行设置吗?看了几个例子,使用中断时,好像没PGIE 位什么事,
期待您的解释,谢谢
Shine:
PGIE是自动保存GIE位的值, 不需要手动设置. PGIE的作用的具体描述, 请参考下面文档第405页5.2 Globally Enabling and Disabling Interrupts.http://www.ti.com/lit/ug/spru733a/spru733a.pdf
ha zhang:
回复 Shine:
谢谢您的回复,但是 这个文档 41页,这样描述PGIE位
0 Disables saving GIE bit when an interrupt is taken.1 Enables saving GIE bit when an interrupt is taken.
如果是 0 的话,在中断产生时,就不会保存GIE的值,按这个说明,应该把它首先置1的吧,这是一个R/W类型的寄存器?
还有就是对于Core 寄存器,CSR,用C语言怎么读写它?
谢谢
Shine:
回复 ha zhang:
这个是可读写寄存器, 如果你要实现自动保存GIE到PGIE, 就要在CSR中使能PGIE这一位.
CSR不是memory map寄存器, 所以没有寄存器地址, 需要用MVC指令来访问, 如下面文档第635页上的例子.http://www.ti.com/lit/ug/sprufe8b/sprufe8b.pdf如果您用C语言的话, 可以调用rts库中的内嵌函数, 见下面文档第225页.http://www.ti.com/lit/ug/spru187u/spru187u.pdfunsigned int _disable_interrupts ( );unsigned int _enable_interrupts ( );void _restore_interrupts (unsigned int);
ha zhang:
回复 Shine:
非常非常感谢您的回复
(1)可是我觉得,unsigned int _disable_interrupts ( ); unsigned int _enable_interrupts ( ); void _restore_interrupts (unsigned int);
并不能实现对PGIE的读写,按道理,应该首先 置GIE=1,而且PGIE=1,能否举个例子,应该怎么写使之置1,用C;
(2)下面是一个C6713B的例程 ,用了两个中断,没有看到任何对PGIE位的操作,按照datasheet上的解释,PGIE默认是0,那么下面的一个中断执行时,GIE就会置0,由于PGIE=0,所以不会保存之前的GIE,中断退出后,GIE会一直为0,就不会再响应后边的中断;但是实际情况并不是这样,还会响应后边的中断,所以对PGIE位比较困惑。
main()
{
IRQ_setVecs(vectors); /* point to the IRQ vector table */ IRQ_globalEnable(); /* enable global interrupt request */ IRQ_nmiEnable(); /* Enable NMI interrupt */
IRQ_map(IRQ_EVT_EXTINT4,ExternalInt4Number); IRQ_map(IRQ_EVT_EXTINT5,ExternalInt5Number);
IRQ_reset(IRQ_EVT_EXTINT4); IRQ_reset(IRQ_EVT_EXTINT5);
IRQ_enable(IRQ_EVT_EXTINT4); IRQ_enable(IRQ_EVT_EXTINT5);
while(1);
}
/* ————-external interrupt service routine———*/interrupt voidExtInt4(void){ IRQ_clear(IRQ_EVT_EXTINT4); //清中断 * PCE2=3; //测试代码 return;}interrupt voidExtInt5(void){ IRQ_clear(IRQ_EVT_EXTINT5); //清中断 * PCE2=4; //测试代码 return;}
(3)datasheet(SPRU733A 405页)这样说,PGIE=1时,当中断产生时会保存GIE的值,然后,中断结束后,返回GIE的值,然后PGIE再清0,
那么问题来了,PGIE清0了,当中断再次产生时,还怎么保存下一次的GIE值??