完善资料让更多小伙伴认识你,还能领取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; } |
|
相关推荐
1个回答
|
|
判断接收中断
{ // 接收中断处理逻辑 } if ((IRQSTATUS & BIT12) == BIT12) // UART interrupt source { if ((ucCOMIID0 & 0x2) == 0x2) // 判断是否是发送中断 { // 发送中断处理逻辑 } } IRQSTA = IRQSTATUS; // 清除中断标志位 } 根据代码来看,ADuC7060处于中断函数__irq __arm void IRQ_Handler(void)里面是因为串口相关的中断发生时会进入该中断处理函数进行相应的处理逻辑。 在运行过程中,如果接收到UART的数据,则会执行接收中断处理逻辑。如果在发送数据时,发送缓冲区为空,则会产生发送中断,执行相应的发送中断处理逻辑。 中断处理函数的设计是为了在接收和发送数据时能够即时地处理相应的中断事件,确保数据的可靠传输。 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
求助一下关于51系列单片机的Timer0的计时问题,TH0、TL0+1的时间是怎么算的?
852 浏览 1 评论
【RA-Eco-RA4E2-64PIN-V1.0开发板试用】开箱+Keil环境搭建+点灯+点亮OLED
592 浏览 0 评论
【敏矽微ME32G070开发板免费体验】使用coremark测试敏矽微ME32G070 跑分
705 浏览 0 评论
【敏矽微ME32G070开发板免费体验】开箱+点灯+点亮OLED
926 浏览 2 评论
657 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12009 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 09:46 , Processed in 0.653572 second(s), Total 70, Slave 54 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号