1
完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
因为项目要通过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的工程师了!!!! 谢谢你们!!! |
|
相关推荐
1个回答
|
|
|
|
|
|
只有小组成员才能发言,加入小组>>
992 浏览 2 评论
给ADUM4223 增加信号驱动15V电压就不正常, 波动很大会被烧是什么情况?
1387 浏览 2 评论
ADP5092 SYS端口为2.09V,但是REG_OUT为0是什么原因?
1940 浏览 1 评论
ad7193差分输入ain1与ain2差是正值时,读到电压与实际值误差小,但为负值值,误差就变的很大
4271 浏览 2 评论
9063 浏览 1 评论
ADC3442采集,分析数据出现有规则毛刺,请问是哪方面的问题啊?
1523浏览 3评论
AD7190状态寄存器一直是0x80,连续转换模式下RDY不拉低
1694浏览 2评论
992浏览 2评论
1669浏览 2评论
给ADUM4223 增加信号驱动15V电压就不正常, 波动很大会被烧是什么情况?
1387浏览 2评论
小黑屋| 手机版| Archiver| 德赢Vwin官网 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 10:55 , Processed in 0.626879 second(s), Total 47, Slave 41 queries .
Powered by 德赢Vwin官网 网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
德赢Vwin官网 观察
版权所有 © 湖南华秋数字科技有限公司
德赢Vwin官网 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号