共2条
1/1 1 跳转至页
LPC2134,UART1,Startup LPC2134求助!UART1中断后,程序会执行Startup.S(程序复位)
问
(求助): UART1中断后,程序会执行Startup.S(程序复位)
芯片是 LPC2134
请看如下程序:
中断初始化如下:
/* RTC VIC初始化 */
IRQEnable(); // IRQ中断使能
CIIR = 0x01; // 设置秒值的增量产生一次中断
ILR = 0x03; // 清除RTC增量和报警中断标志
VICIntSelect = 0x00; // 设置所有中断连接IRQ中断
VICVectCntl1 = 0x20 | 13; // 分配通道1
VICVectAddr1 = (int)RTC_Int; // 设置中断服务程序地址
VICIntEnable = (1 << 13); // 使能RTC中断
CCR=0x11; // RTC开始计算 (硬件时钟)
/* UART1 VIC初始化 */
Uart1_Init(4800);
U1FCR=0x81; //8字符中断
U1IER = 0x01; // 允许uart1 中断
VICVectCntl0=0x20 | 0x07;
VICVectAddr0=(unsigned int)IRQ_UART1;
VICIntEnable=1<<7;
/* TIME0 VIC初始化 */
VICVectCntl2=0x20 | 0x04;
VICVectAddr2=(unsigned int)IRQ_Time0;
VICIntEnable=1<<4;
/* UART1中断接收程序 568 BYTE 为一帧数据 BUF[568]是外部变量*/
void __irq IRQ_UART1(void)
{
unsigned char i;
if((U1IIR & 0x0f)==0x04)
{
if(Rec_Flag==0)
{
for(i=0;i<8;i++)
{
Buf[Count]=U1RBR;
Count++;
}
if(Count==568)
{
Count=0;
Rec_Flag=0xff; //接收完一帧数据标志
VICIntEnClr=1<<7; //关UART1中断
}
}
}
VICVectAddr = 0;
}
/* RTC 时间*/
void __irq RTC_Int(void)
{
Dis_Time(); //显示RTC时间
ILR = 0x01; // 清除RTC增量中断标志
VICVectAddr = 0; // 向量中断结束
}
//主程序:
main()
{
while(1)
{
if(Rec_Flag!=0)
{
DISPLAY(); //显示接收数据
Rec_Flag=0; //得设旗号
VICIntEnable=1<<7; //开UART1 中断,继续接收 568 BYTE 数据
}
}
}
在执行程序的过程中发现:
程序执行一段时间后(时间不定,有时3分钟,有时10分钟,有时超过一小时),
程序会执行Startup.S,也就是说程序跑飞,造成复位了。
请问是什么原因? 答 1: 请教!另:DOG已关闭 答 2: UART1中断后,程序会执行Startup.S(程序复位)UART1中断后,程序会停在Startup.S的那个地方? 答 3: 我的程序也出现过类似情况
我的程序也出现过类似情况,还有就是step in 按钮和step 一样跳不进子函数里面去,复位后跳到
Reset
......
--> LDR PC,{PC,#-0xFF0} ;
......
答 4: 不要用 VICIntEnable = (1 << 13); 使能单个中断不要用等于,要用或等于,你用等于就把前面初始化时使能的中断又禁止了。 要用 VICIntEnable |= (1 << 13); 之类的语句
没有完整的程序,别人怎么帮你查呢?
http://www.shawyoo.com 下载中心 有完整的UART 使用FIFO的中断方式的程序
答 5: 搞破坏确实很容易 答 6: 跳到 LDR PC, ResetAddr以下是Startup.S的部分程序
Reset
LDR PC, ResetAddr
LDR PC, UndefinedAddr
LDR PC, SWI_Addr
LDR PC, PrefetchAddr
LDR PC, DataAbortAddr
DCD 0xb9205f80
LDR PC, [PC, #-0xff0]
LDR PC, FIQ_Addr
我在 LDR PC, ResetAddr 这一行设了个断点,每次都会跑到这里来。
本想也在 LDR PC, [PC, #-0xff0] 设个断点的,但程序运行过程中很频繁跳到这里!
不知那里出错了?烦告知,谢了。!
答 7: 截图如下 答 8: 截图如下。如下。
http://file.21ic.com.cn/upload/img/200511/2005112513161819394.jpg
答 9: 我的程序也总在飞我的串口中断也是经常非,恼火的很 答 10: 如果采用查询的话就不会有问题不知是怎么回事!
现在烦死了。 答 11: 别急嘛,慢慢来心急吃不了热豆腐,再说了,大家都在努力,问题肯定会解决的 答 12: 好象是返回地址错了. 答 13: 顶!感觉很烦! 答 14: 顶上去!顶上去! 答 15: 大家帮忙顶上去! 答 16: 好象看的人很多,但没有人肯回答。 答 17: 我也遇到这种问题有得程序经常复位,有的程序跑几天也没问题。
还有就是经常跳到预取指错误得地址处,现在还没有搞清楚到底是什么造成得。 答 18: 这样看来,应该是模板有问题了。 答 19: 小弟遇到的现象和你的一样。小弟我觉得是你操作了VICIntEnable和VICIntEnable两个寄存器导致的。
小弟昨天调试程序的时候对程序执行了VICIntEnable=0xffffffff;//开中断
VICIntEnable=0xffffffff;//关中断,程序就飞了,不执行就没有问题。也在郁闷中,不知道是怎么回事,没有能够理解。这事还得请周工来给我解决,给我们一个说法。
芯片是 LPC2134
请看如下程序:
中断初始化如下:
/* RTC VIC初始化 */
IRQEnable(); // IRQ中断使能
CIIR = 0x01; // 设置秒值的增量产生一次中断
ILR = 0x03; // 清除RTC增量和报警中断标志
VICIntSelect = 0x00; // 设置所有中断连接IRQ中断
VICVectCntl1 = 0x20 | 13; // 分配通道1
VICVectAddr1 = (int)RTC_Int; // 设置中断服务程序地址
VICIntEnable = (1 << 13); // 使能RTC中断
CCR=0x11; // RTC开始计算 (硬件时钟)
/* UART1 VIC初始化 */
Uart1_Init(4800);
U1FCR=0x81; //8字符中断
U1IER = 0x01; // 允许uart1 中断
VICVectCntl0=0x20 | 0x07;
VICVectAddr0=(unsigned int)IRQ_UART1;
VICIntEnable=1<<7;
/* TIME0 VIC初始化 */
VICVectCntl2=0x20 | 0x04;
VICVectAddr2=(unsigned int)IRQ_Time0;
VICIntEnable=1<<4;
/* UART1中断接收程序 568 BYTE 为一帧数据 BUF[568]是外部变量*/
void __irq IRQ_UART1(void)
{
unsigned char i;
if((U1IIR & 0x0f)==0x04)
{
if(Rec_Flag==0)
{
for(i=0;i<8;i++)
{
Buf[Count]=U1RBR;
Count++;
}
if(Count==568)
{
Count=0;
Rec_Flag=0xff; //接收完一帧数据标志
VICIntEnClr=1<<7; //关UART1中断
}
}
}
VICVectAddr = 0;
}
/* RTC 时间*/
void __irq RTC_Int(void)
{
Dis_Time(); //显示RTC时间
ILR = 0x01; // 清除RTC增量中断标志
VICVectAddr = 0; // 向量中断结束
}
//主程序:
main()
{
while(1)
{
if(Rec_Flag!=0)
{
DISPLAY(); //显示接收数据
Rec_Flag=0; //得设旗号
VICIntEnable=1<<7; //开UART1 中断,继续接收 568 BYTE 数据
}
}
}
在执行程序的过程中发现:
程序执行一段时间后(时间不定,有时3分钟,有时10分钟,有时超过一小时),
程序会执行Startup.S,也就是说程序跑飞,造成复位了。
请问是什么原因? 答 1: 请教!另:DOG已关闭 答 2: UART1中断后,程序会执行Startup.S(程序复位)UART1中断后,程序会停在Startup.S的那个地方? 答 3: 我的程序也出现过类似情况
我的程序也出现过类似情况,还有就是step in 按钮和step 一样跳不进子函数里面去,复位后跳到
Reset
......
--> LDR PC,{PC,#-0xFF0} ;
......
答 4: 不要用 VICIntEnable = (1 << 13); 使能单个中断不要用等于,要用或等于,你用等于就把前面初始化时使能的中断又禁止了。 要用 VICIntEnable |= (1 << 13); 之类的语句
没有完整的程序,别人怎么帮你查呢?
http://www.shawyoo.com 下载中心 有完整的UART 使用FIFO的中断方式的程序
答 5: 搞破坏确实很容易 答 6: 跳到 LDR PC, ResetAddr以下是Startup.S的部分程序
Reset
LDR PC, ResetAddr
LDR PC, UndefinedAddr
LDR PC, SWI_Addr
LDR PC, PrefetchAddr
LDR PC, DataAbortAddr
DCD 0xb9205f80
LDR PC, [PC, #-0xff0]
LDR PC, FIQ_Addr
我在 LDR PC, ResetAddr 这一行设了个断点,每次都会跑到这里来。
本想也在 LDR PC, [PC, #-0xff0] 设个断点的,但程序运行过程中很频繁跳到这里!
不知那里出错了?烦告知,谢了。!
答 7: 截图如下 答 8: 截图如下。如下。
http://file.21ic.com.cn/upload/img/200511/2005112513161819394.jpg
答 9: 我的程序也总在飞我的串口中断也是经常非,恼火的很 答 10: 如果采用查询的话就不会有问题不知是怎么回事!
现在烦死了。 答 11: 别急嘛,慢慢来心急吃不了热豆腐,再说了,大家都在努力,问题肯定会解决的 答 12: 好象是返回地址错了. 答 13: 顶!感觉很烦! 答 14: 顶上去!顶上去! 答 15: 大家帮忙顶上去! 答 16: 好象看的人很多,但没有人肯回答。 答 17: 我也遇到这种问题有得程序经常复位,有的程序跑几天也没问题。
还有就是经常跳到预取指错误得地址处,现在还没有搞清楚到底是什么造成得。 答 18: 这样看来,应该是模板有问题了。 答 19: 小弟遇到的现象和你的一样。小弟我觉得是你操作了VICIntEnable和VICIntEnable两个寄存器导致的。
小弟昨天调试程序的时候对程序执行了VICIntEnable=0xffffffff;//开中断
VICIntEnable=0xffffffff;//关中断,程序就飞了,不执行就没有问题。也在郁闷中,不知道是怎么回事,没有能够理解。这事还得请周工来给我解决,给我们一个说法。
共2条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
vscode+cmake搭建雅特力AT32L021开发环境被打赏30分 | |
【换取逻辑分析仪】自制底板并驱动ArduinoNanoRP2040ConnectLCD扩展板被打赏47分 | |
【分享评测,赢取加热台】RISC-V GCC 内嵌汇编使用被打赏38分 | |
【换取逻辑分析仪】-基于ADI单片机MAX78000的简易MP3音乐播放器被打赏48分 | |
我想要一部加热台+树莓派PICO驱动AHT10被打赏38分 | |
【换取逻辑分析仪】-硬件SPI驱动OLED屏幕被打赏36分 | |
换逻辑分析仪+上下拉与多路选择器被打赏29分 | |
Let'sdo第3期任务合集被打赏50分 | |
换逻辑分析仪+Verilog三态门被打赏27分 | |
换逻辑分析仪+Verilog多输出门被打赏24分 |