微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 硬件电路设计 > TI模拟硬件电路设计 > 简单C程序进不了中断,请教高手

简单C程序进不了中断,请教高手

时间:10-02 整理:3721RD 点击:
在学习中断过程中,使用最简单的程序如下,我使用的是开发板,直接load进去的。请教高手,程序为什么进不了中断?先谢谢了!
#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就好了。

上一篇:Go Main
下一篇:求助 一个奇怪的现象

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top