Proteus中LPC2138雨感仿真报错:Invalid opcode 0x002E at PC=0x0006
问题描述
我在Proteus中基于LPC2138开展雨水传感器仿真,使用如下代码生成hex文件并加载至微处理器后,运行时弹出错误提示:Invalid opcode 0x002E at PC=0x0006。
仿真电路图:
代码如下:
#include<lpc214x.h> #define bit(x) (1<<x) #define delay for(i=0;i<7000;i++); #define RAIN (IO1PIN & (1<<24)) unsigned int i; void lcd_int(); void dat(unsigned char); void cmd(unsigned char); void string(unsigned char *); void main() { IO0DIR =0XFFF; IO1DIR = 0x0; lcd_int(); cmd(0x80); string("RAIN "); while(1) { if(RAIN == 0) { string("Rain Detected"); //You can also add alarm here } delay;delay; cmd(0x01); } } void lcd_int() { cmd(0x38); cmd(0x0c); cmd(0x06); cmd(0x01); cmd(0x80); } void cmd(unsigned char a) { IO0PIN&=0x00; IO0PIN|=(a<<0); IO0CLR|=bit(8); //rs=0 IO0CLR|=bit(9); //rw=0 IO0SET|=bit(10); //en=1 delay; IO0CLR|=bit(10); //en=0 } void dat(unsigned char b) { IO0PIN&=0x00; IO0PIN|=(b<<0); IO0SET|=bit(8); //rs=1 IO0CLR|=bit(9); //rw=0 IO0SET|=bit(10); //en=1 delay; IO0CLR|=bit(10); //en=0 } void string(unsigned char *p) { while(*p!='\0') { dat(*p++); } }
解决方案
这个错误是ARM内核执行无效指令的典型问题,核心原因是向量表未正确初始化或启动代码缺失/不匹配,结合Proteus仿真场景,按以下步骤排查:
1. 补充LPC2138专用启动代码
LPC2138是ARM7TDMI内核,必须通过启动代码初始化堆栈、向量表,否则CPU复位后会执行错误地址的无效指令:
- 若使用Keil MDK开发,直接添加官方提供的
startup_lpc21xx.s启动文件; - 其他编译器需确保启动文件包含复位向量、异常向量表定义,以及堆栈初始化代码。
2. 修正编译器配置
- 目标设备必须选择LPC2138,避免架构不匹配;
- 禁用Thumb模式(LPC2138虽支持Thumb,但未配置时会导致指令解码错误);
- 生成Intel HEX格式文件,确保编译输出包含完整的代码段和向量表。
3. 检查Proteus仿真配置
- 确认LPC2138的hex文件路径正确,未加载损坏或不完整的文件;
- 检查晶振电路:LPC2138需要外部晶振(推荐11.0592MHz),仿真中需确保晶振与芯片时钟引脚正确连接,且芯片时钟配置匹配(代码未初始化PLL时,默认使用外部晶振分频后的时钟)。
4. 代码优化(辅助排查)
- 将
delay宏改为函数形式,避免全局变量依赖问题:void delay_ms(unsigned int ms) { unsigned int j; while(ms--) { for(j=0;j<7000;j++); } } - 验证
RAIN宏对应的引脚(P1.24)与仿真电路图中的硬件连接一致。
完成以上步骤后,重新编译生成hex文件加载到Proteus中,即可解决无效指令错误。
内容的提问来源于stack exchange,提问作者G Krishnan
相关产品推荐
相关产品推荐

