首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

[求助]请问中断的写法有没有用到中断向量而不用中断号的啊

[求助]请问中断的写法有没有用到中断向量而不用中断号的啊

中断向量一般写法

#pragma CODE_SEG NON_BANKED
void interrupt中断号 ADO_Interrupt(void)
{
DisableInterrupt;
/*code*/
EnableInterrupt;
}
#pragma CODE_SEG DEFAULT_ROM

请问有没有不用中断号的方式啊,直接向量方式,头文件里面定义了中断向量,谢谢那位解答一下
可以。比如可以在程序中定义一个中断函数:
#pragma CODE_SEG NON_BANKED
void interrupt ADO_Interrupt(void)
{
//DisableInterrupt;
/*code*/
//EnableInterrupt;
}
#pragma CODE_SEG DEFAULT_ROM
其中不定义中断号(另外,DisableInterrupt和EnableInterrupt也是不必要的,硬件会自动完成);
然后在PRM文件的最后加上这样的说明就可以了:
VECTOR ADDRESS 0xFFXX ADO_Interrupt
海纳百川  有容乃大
DG128的头文件里面有这样的定义,我该如何利用呢?
/**************** interrupt vector table ****************/
#define VReserved63 0x0000FF80
#define VReserved62 0x0000FF82
#define VReserved61 0x0000FF84
#define VReserved60 0x0000FF86
#define VReserved59 0x0000FF88
#define VReserved58 0x0000FF8A
#define Vpwmesdn 0x0000FF8C
#define Vportp 0x0000FF8E
#define Vcan4tx 0x0000FF90
#define Vcan4rx 0x0000FF92
#define Vcan4err 0x0000FF94
#define Vcan4wkup 0x0000FF96
#define VReserved51 0x0000FF98
#define VReserved50 0x0000FF9A
#define VReserved49 0x0000FF9C
#define VReserved48 0x0000FF9E
#define VReserved47 0x0000FFA0
#define VReserved46 0x0000FFA2
#define VReserved45 0x0000FFA4
#define VReserved44 0x0000FFA6
#define VReserved43 0x0000FFA8
#define VReserved42 0x0000FFAA
#define VReserved41 0x0000FFAC
#define VReserved40 0x0000FFAE
#define Vcan0tx 0x0000FFB0
#define Vcan0rx 0x0000FFB2
#define Vcan0err 0x0000FFB4
#define Vcan0wkup 0x0000FFB6
#define Vflash 0x0000FFB8
#define Veeprom 0x0000FFBA
#define VReserved33 0x0000FFBC
#define Vspi1 0x0000FFBE
#define Viic 0x0000FFC0
#define VReserved30 0x0000FFC2
#define Vcrgscm 0x0000FFC4
#define Vcrgplllck 0x0000FFC6
#define Vtimpabovf 0x0000FFC8
#define Vtimmdcu 0x0000FFCA
#define Vporth 0x0000FFCC
#define Vportj 0x0000FFCE
#define Vatd1 0x0000FFD0
#define Vatd0 0x0000FFD2
#define Vsci1 0x0000FFD4
#define Vsci0 0x0000FFD6
#define Vspi0 0x0000FFD8
#define Vtimpaie 0x0000FFDA
#define Vtimpaaovf 0x0000FFDC
#define Vtimovf 0x0000FFDE
#define Vtimch7 0x0000FFE0
#define Vtimch6 0x0000FFE2
#define Vtimch5 0x0000FFE4
#define Vtimch4 0x0000FFE6
#define Vtimch3 0x0000FFE8
#define Vtimch2 0x0000FFEA
#define Vtimch1 0x0000FFEC
#define Vtimch0 0x0000FFEE
#define Vrti 0x0000FFF0
#define Virq 0x0000FFF2
#define Vxirq 0x0000FFF4
#define Vswi 0x0000FFF6
#define Vtrap 0x0000FFF8
#define Vcop 0x0000FFFA
#define Vclkmon 0x0000FFFC
#define Vreset 0x0000FFFE
把这里的函数名改成你的函数名就可以了。
海纳百川  有容乃大
#pragma CODE_SEG NON_BANKED
void interrupt Vatd0(void)
{

/*code*/

}
#pragma CODE_SEG DEFAULT_ROM
是这样吗
编译不通过
什么错误提示?
海纳百川  有容乃大
难到头文件里面这个就没有作用吗?
expected: ~(IDENT)
main.c Line36
???
把你的PROJECT打包贴出来看看?
海纳百川  有容乃大
版主的意思是把
DG128的头文件里面的
/**************** interrupt vector table ****************/
后面的名字直接放到
#pragma CODE_SEG NON_BANKED
void interrupt ?(void)
{}
这个问号处就能用吗?不用在到.prm文件中去声明吗?
#include
#include
#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"


#define BaudRate 115200
#define OSC_CLK 16000000
#define PLLClock (2*OSC_CLK*(SYNR+1)/(REFDV+1))


unsigned char n[]="hello,world";


void wait()
{
int i,j;
for(i=0;i<1000;i++)
for(j=0;j<1000;j++) ;


}

void ADCInit(void)
{
ATD0CTL2=0xC2; //AD模块上电, 快速清零, 无等待模式, 禁止外部触发, 中断开放
ATD0CTL3=0x20; // 每个序列4次转换, No FIFO, Freeze模式下继续转换
ATD0CTL4=0x89; // 10位精度, 2个时钟, ; PRS=9, divider=8
ATD0CTL5=0xA0; //右对齐无符号,单通道采样,通道0
ATD0DIEN=0x00; // 禁止数字输入
}

word AD_wData = 0;


/*-------AD0中断--------------------------*/


//void interrupt 22 Int_AD0(void)
//{
// DisableInterrupts;
// AD_wData = ATD0DR0; //Read out the Result Register
// PORTB = (byte)AD_wData;
// wait();
// EnableInterrupts;
//}
//#pragma CODE_SEG NON_BANKED

void interrupt Vatd0(void)
{

/*code*/

}
//#pragma CODE_SEG DEFAULT_ROM

/*-------系统时钟初始化------------------*/
void SysClockSet(void)
{
SYNR=4;
REFDV=1;
while(!CRGFLG_LOCK);
CLKSEL_PLLSEL=1;
}

/*-------串口初始化----------------------*/
void SCIInit()
{
SCI0BDL = (unsigned char)((PLLClock/ 2) / BaudRate / 16);
SCI0CR1=0; /*normal,no parity*/
SCI0CR2=0X2C; /*RIE=1,TE=1,RE=1*/
}

/*-------发射端程序----------------------*/
void SCITx(unsigned char text)
{
while (!(SCI0SR1&0x80)); /* wait for output buffer empty */
SCI0DRH=0;
SCI0DRL=text;
}

/*-------接收程序------------------------*/
unsigned char SCIRx(void)
{
unsigned char RxData;
while (!(SCI0SR1&0x20));
RxData=SCI0DRL;
return RxData;
}

void main()
{
int i,j;
DisableInterrupts;
//ADCInit();
//EnableInterrupts;


PORTB=0x00;
DDRB=0xFF;
SysClockSet();
SCIInit();
ADCInit();
while(1)
{
if(PORTB==0) PORTB=0x7f;
for(i=0;i<1000;i++)
for(j=0;j<1000;j++);
PORTB>>=1;
while(!ATD0STAT1_CCF0);
SCITx((byte)ATD0DR0);





//for(i=0;i<11;i++)
//{
//SCITx(n); //向串口发送HELLO WORLD
// }





}


}
其实我的意思就是能不能把头文件里面定义的中断向量表利用起来,就TI公司的MSP430用的IAR编译器,他的中断写法
#pragma vector = Vatd
__interrupt void ATD0_Interrupt(void)
{
/*code*/
}

他的头文件里面也是有类似的定义
我只是比较习惯直接用中断表写中断服务程序,所以 就想问问~~
写程序我有看头文件的习惯,想把里面的东西利用起来,不然岂不白定义
返回列表