我怀疑是我程序上电初始化顺序的问题
主函数如下:
void main (void)
{
InitSysCtrl(); //初始化系统函数
DINT;
IER = 0x0000; //禁止CPU中断
IFR = 0x0000; //清除CPU中断标志
InitPieCtrl(); //初始化PIE控制寄存器
InitPieVectTable(); //初始化PIE中断向量表
InitCpuTimers();
InitGpio(); //初始化Gpio口
InitSpi(); //初始化Spi
InitSci(); //初始化Sci
Init_EEPROM();
Init_Data(); //需要手动复位
EALLOW;
PieVectTable.TINT0 = &ISRTimer0;
XIntruptRegs.XNMICR.bit.SELECT=0; //Timer1连接到XINT13
XIntruptRegs.XNMICR.bit.ENABLE=0; //禁止非屏蔽中断NMI
PieVectTable.XINT13 = &ISRTimer1;//用Timer1中断函数入口更新PIE向量表
PieVectTable.TINT2 = &ISRTimer2;
XIntruptRegs.XINT1CR.bit.POLARITY=0;//下降沿产生中断
XIntruptRegs.XINT1CR.bit.ENABLE=1; //使能XINT1中断
PieVectTable.XINT1= &XINT1; //中断服务程序入口地址放入中断向量表
EDIS;
ConfigCpuTimer(&CpuTimer0, 150, 1); //设置PWM周期
StartCpuTimer0();
IER |= M_INT1;
PieCtrl.PIEIER1.bit.INTx7=1;
ConfigCpuTimer(&CpuTimer1, 150, 500000); //设置CPU定时器定时
StartCpuTimer1();
IER |= M_INT13;
ConfigCpuTimer(&CpuTimer2, 150, 500000); //设置CPU定时器定时(闪烁间隔0.5s)
StartCpuTimer2();
IER |= M_INT14; //开中断
PieCtrl.PIEIER1.bit.INTx4=1;//XINT1使能位于PIE第1组第4个
EINT; // 允许INTM
ERTM; // 允许DBGM
KEY_SET=1; //按键输入端口电平置高
KEY_ADD=1;
KEY_SUB=1;
// Init_Data(); //数据跳动
while (1)
{
KeyScan();
Display();
}
}
如果初始化数据的函数放在前面(红色部分),那么程序就需要手动复位后才能正常工作;如果初始化数据的函数放在后面(绿色部分),那么上电可以运行,不需要手动复位,但是执行结果有时候会不正确。 |