SystemObj::SystemObj(void) { __disable_interrupt();//关中断 SystemInit();//系统初始化 }
void SystemObj::SystemInit(void) { CpuInit();// PllInit();//PLL初始化 EintInit(); /*-------------------------------------------------------- 注意以下2个变量的作用域的不同 --------------------------------------------------------*/ if (::SystemRamTest != 0x55aa) {//全局变量SystemRamTest ::SystemRamTest = 0x55aa;//改写全局变量 } if (SystemRamTest != 0x55aa) {//类成员变量SystemRamTest SystemRamTest = 0x55aa;//改写类成员变量 } }
void SystemObj::CpuInit(void) { SREGs.IMR.Regs = 0x0000;//禁止所有可屏蔽中断 SREGs.IFR.Regs = 0xffff;//清除中断标志 //设置0x0080为中断向量表首址,在第2个128页内。 SREGs.PMST.Regs = (0x01 << PMST_IPTR) | (1 << PMST_MP_MC) | (1 << PMST_OVLY); // SREGs.PMST |= (1 << PMST_DROM);//数据可const. /*--------------------------------------------------------------------------- 若:设置0x0100为中断向量表首址,在第3个128页内。 则:*.cmd文件应该改为: PAGE 0: VECS: origin=0x0100, length=0x66 则: SREGs.PMST = (0x02 << PMST_IPTR) | (1 << PMST_MP_MC) | (1 << PMST_OVLY); ----------------------------------------------------------------------------*/ // SREGs.SWWSR = 0x7f09; // SREGs.SWWSR = 0x3009; SREGs.SWWSR = 0x3fff; SREGs.SWCR = 0; // _delay_loop_(10); }
void SystemObj::PllInit(void) { volatile unsigned int start; do { SREGs.CLKMD.Regs = 0; __nop(); } while(SREGs.CLKMD.Bits.PLLSTATUS); SREGs.CLKMD.Regs = (9 << CLKMD_PLLMUL) | (30 << CLKMD_PLLCOUNT) | (1 << CLKMD_PLLONOFF) | (1 << CLKMD_PLLNDIV) | (1 << CLKMD_PLLSTATUS);//100M for (start = 0; start < 10000; start ++);//等待外设上电复位正常结束 }
void SystemObj::EintInit(void) { SREGs.IMR.Bits.INT0 = 1;//允许INT0中断 }
void SystemObj::WatchDog(void) { SREGs.McBSPADDR1.SPSA = PCR; SREGs.McBSPADDR1.SPSD.PCR_Regs ^= (1 << PCR_DX_STAT);//喂狗信号取反 } 相关链接:http://www.google.cn/search?hl=zh-CN&newwindow=1&q=C5402CFG&btnG=Google+%E6%90%9C%E7%B4%A2&meta=&aq=f&oq= |