简单C程序进不了中断,请教高手
#include \"lf2407.h\"
void inline disable()
{
asm(\" setc INTM \"
;
}
void inline enable()
{
asm(\" clrc INTM \"
;
}
void sysinit()
{
asm(\" clrc SXM \"
;
asm(\" clrc OVM \");
asm(\" clrc CNF \");
*IMR=0x0002;
*IFR=0x0ffff;
*SCSR1=0x83fe;
*WDCR=0x0e8;
WSGR=0x00;
}
void evbinit()
{
*EVAIFRA=0x0ffff;
*EVAIFRB=0x0ffff;
*EVAIFRC=0x0ffff;
*EVAIMRA=0x0080;
*EVAIMRB=*EVAIMRB & 0x0;
*EVAIFRC=*EVAIFRC & 0x0;
*MCRC=*MCRC & 0x0fffd;
*PEDATDIR=*PEDATDIR | 0x0202;
*T1CNT=0x00;
*T1PER=0x0177;
*T1CON=0x160C;
}
void interrupt T1INT()
{
int flag;
flag=*EVAIFRA & 0x0080;
if(flag!=0x0080)
{
enable();
return;
}
*PEDATDIR=*PEDATDIR & 0x0fffd;
T1CNT=0x00;
*EVAIFRA=*EVAIFRA & 0x0080;
enable();
return;
}
void interrupt nothing()
{
enable();
return;
}
main()
{
disable();
sysinit();
evbinit();
enable();
*T1CON = *T1CON | 0x0040;
while(1)
{
;
}
}
你的中断向量表是如何初始化的?
.ref _nothing,_T1INT
.ref _c_int0
.sect \".vectors\"
reset: B _c_int0
int1: B _nothing
int2: B _T1INT
int3: B _nothing
int4: B _nothing
int5: B _nothing
int6: B _nothing
你看有什么问题吗?调试的时候程序总是跑飞了。
你的堆栈空间给了多大?会不会是堆栈空间太小了?
刚开始堆栈设置40,看你回帖后改成256,试过了也不行。在反汇编里面看到程序和原来一样,进入_abort:
你程序里有几个错误的地方:
*EVAIFRC=*EVAIFRC & 0x0;
应为*EVAIMRC=*EVAIMRC & 0x0;
*EVAIFRA=*EVAIFRA & 0x0080;
应为*EVAIFRA=*EVAIFRA | 0x0080;
还有,你的CMD文件是怎么分配的?
试过了,也还不行。下面是CMD文件:
MEMORY
{
PAGE 0 : VECS : origin = 0h , length = 040h /* VECTORS */
PROG : origin = 08000h , length = 08000h /* PROGRAM */
PAGE 1 : MMRS : origin = 0h , length = 060h /* MMRS */
B2 : origin = 0060h , length = 020h /* DARAM */
B0 : origin = 0200h , length = 0100h /* DARAM */
B1 : origin = 0300h , length = 0100h /* DARAM */
DATA : origin = 8000h , length = 8000h /* XDM */
}
/*--------------------------------------------------------------------*/
/* SECTIONS ALLOCATION */
/*--------------------------------------------------------------------*/
SECTIONS
{
.vectors : { } > VECS PAGE 0 /* Interrupt vector table */
.text : { } > PROG PAGE 0 /* Code */
.data : { } > PROG PAGE 0 /* Initialization data tables */
.bss : { } > DATA PAGE 1 /* Block B2 */
.cinit : { } > PROG PAGE 0 /*Block B0 */
.stack : { } > B1 PAGE 1 /* Block B1 */
.const : { } > B2 PAGE 1 /* Block B2 */
}
我也快没辙了,是不是你硬件有问题?
*PEDATDIR=*PEDATDIR & 0x0fffd;
是不是让一个指示灯亮?
是啊,我是用示波器看IOPE1的波形啊!不管怎么样都得谢谢你这么热心的帮我查找问题!
我看资料好像与中断向量起始地址有关,不知道是不是,我不是很懂?
你可以把.bss分配到200H或者800H,我很少
看到分配到8000H以后的。
好,我试试。前面我用这个CMD文件调试成功了SVPWM程序。应当没有什么问题,最多就是影响程序的运行速度吧?
我也在调试这个程序,<LF2407x C语言应用开发>这本书太差了,我这个中断也进不了,前面都正常,跑到while就死循环了,好象定时器1根本就没开一样。
哈哈,终于调好了,可以进中断了!!
把CMD中断配置地址改下就好了,把地址8000改到0000就好了。