因为项目要通过485传送数据,所以要用到串口,在调试串口的时候接收用的是中断,发送准备用查询模式。发送的中断用的是下面一段程序:
__irq
__
ARM void IRQ_Handler(void)
{
unsigned long IRQSTATUS = 0;
unsigned
char ucCOMIID0 = 0;
IRQSTATUS = IRQSTA; // Read off IRQSTA
register
ucCOMIID0 = COMIID0; // Read the UART IRQ ID register
if
((IRQSTATUS & BIT11) == BIT11) //UART interrupt source
{
if
((ucCOMIID0 & 0x1) == 0x1) // Receive buffer Full
{
ucRxChar
= COMRX; // read COMRX register
RX_falg = 1; // Set flag to return
a string to the
PC
}
}
}
现在有一个不明白的问题,就是在调试程序的时候,程序一直在这段中断里面运行,在ucCOMIID0 =
COMIID0; // Read the UART IRQ ID
register这句设置断点,程序全速运行会一直运行到停在这里,不管PC是否有数据发送过来,我的程序里面只开了串口的中断,但是串口又没有数据发送过来产生中断,所以现在比较迷惑。是否有可能是我的中断用的不对?或者是片子初始化不对?或者是片子在焊接不好的问题导致一直产生错误中断(但是我已经点亮了LED灯,按道理硬件不会有问题啊)?
后来我看了IRQSTA和IRQEN寄存器,发现这两个寄存器
timer1(唤醒寄存器)的这意位都置1了,更奇怪的是我在前面的初始化里面已经把这两位Timer1的中断和中断允许都已经清零了。
后来为了证明是Timer1产生的中断,我又在中断里面加了一段语句,代码如下:
__irq
__arm void IRQ_Handler(void)
{
unsigned long IRQSTATUS =
0;
unsigned char ucCOMIID0 = 0;
IRQSTATUS = IRQSTA;
//read off IRQSTA Register
ucCOMIID0 = COMIID0; // Read
the UART IRQ ID register
if((IRQSTATUS&BIT11)==BIT11)
//UART Interrupt
{
if ((ucCOMIID0 & 0x1) == 0x1) // Receive
buffer Full
{
RX_BUF=COMRX;
//Send_data(RX_BUF);
}
}
if((IRQSTATUS&BIT4)==BIT4)
{
Delay(1);
GP0DAT^=(0x10000<<1);
}
}
这个时候会发生两个情况:首先,编译的时候会报错,在Delay(1)这个函数这里会报:Cannot
call the __thumb function "Delay" from arm
mode。
然后我注释掉这句通过编译后,运行,会出现第二个情况,我在GP0DAT^=(0x10000<<1);这句话设置断点,发现函数会运行到这句话停下来,所以可以证明确实是Timer1产生的中断。但是我前面已经关闭了和Timer1相关的所有中断。
现在我就产生了两个疑问:1、Cannot
call the __thumb function "Delay" from arm
mode。这句话代表了什么?为什么我前面编的函数都处于Thumb模式?而中断却是ARM模式?我应该怎么修改我的程序?
2、为什么我关闭了所有和Timer1相关的中断,这个定时器还是会产生中断?应该怎么样才能关闭这个中断呢?
另外需要明确的一点是:我前面因为要用到外部晶振,所以在初始化的时候有这么一段语句,是从数据手册上摘抄下来的:
void
Init_CLK(void)
{
T1LD=0x80; //count number
T1CON=0xC0;
//32768HZ, Enable Timer1 interrupt,count down
IRQEN|=0x10;
//Enable Timer1 interrupt
source
PLLKEY1=0xAA;
PLLCON=0x2; //switch to external
crystal
PLLKEY2=0x55;
POWKEY1=0x1;
POWCON0=0x73;
//Enter nap
mode
POWKEY2=0xF4;
}
麻烦ADI的工程师了!!!!
谢谢你们!!!
2018-11-21 09:42:55
您好,
关于中断优先级,中断服务程序的入口只能有一个,优先级是可以通过IRQPx来设置,参见table69~71;
关于模式切换的问题,我会向产品线去咨询。
您好,
关于中断优先级,中断服务程序的入口只能有一个,优先级是可以通过IRQPx来设置,参见table69~71;
关于模式切换的问题,我会向产品线去咨询。
举报