因为项目要通过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;
}
共2条
1/1 1 跳转至页
为什么ADuC7060运行的时候始终处于中断函数irqarmvoidIRQHandler(void)里面?
关键词: ADuC7060 Handler
2楼
判断接收中断
{
// 接收中断处理逻辑
}
if ((IRQSTATUS & BIT12) == BIT12) // UART interrupt source
{
if ((ucCOMIID0 & 0x2) == 0x2) // 判断是否是发送中断
{
// 发送中断处理逻辑
}
}
IRQSTA = IRQSTATUS; // 清除中断标志位
}
根据代码来看,ADuC7060处于中断函数__irq __arm void IRQ_Handler(void)里面是因为串口相关的中断发生时会进入该中断处理函数进行相应的处理逻辑。
在运行过程中,如果接收到UART的数据,则会执行接收中断处理逻辑。如果在发送数据时,发送缓冲区为空,则会产生发送中断,执行相应的发送中断处理逻辑。
中断处理函数的设计是为了在接收和发送数据时能够即时地处理相应的中断事件,确保数据的可靠传输。
共2条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
【换取逻辑分析仪】-基于ADI单片机MAX78000的简易MP3音乐播放器被打赏48分 | |
我想要一部加热台+树莓派PICO驱动AHT10被打赏38分 | |
【换取逻辑分析仪】-硬件SPI驱动OLED屏幕被打赏36分 | |
换逻辑分析仪+上下拉与多路选择器被打赏29分 | |
Let'sdo第3期任务合集被打赏50分 | |
换逻辑分析仪+Verilog三态门被打赏27分 | |
换逻辑分析仪+Verilog多输出门被打赏24分 | |
【分享评测,赢取加热台】使用8051单片机驱动WS2812被打赏40分 | |
【换取逻辑分析仪】rtthread添加RRH62000传感器驱动-基于野火启明6M5被打赏48分 | |
换逻辑分析仪+Verilog多输入门被打赏27分 |