历史上的今天
今天是:2025年02月14日(星期五)
2018年02月14日 | 单片机嵌入式系统软件的几种复位方式
2018-02-14 来源:eefocus
飞思系列的8位单片机没有特定的控制寄存器可以实现软件复位,当程序运行过程中代码需要强行产生一个复位时必须通过一些软件技巧实现:
软复位,程序从头运行,硬件不复位。复位脚无复位脉冲输出
这可以通过直接获取复位向量的方式来实现:
void ForceReset(void)
{
uniON {
void (*vector)(void);
byte c[2];
} SOFtReset;
softReset.c[0] = *(byte*)0xFFFE; //get the reset vector
softReset.c[1] = *(byte*)0xFFFF;
softReset.vector(); //re-STart the code flow
}
硬复位,程序从头运行,内部所有硬件模块和寄存器同时复位,复位脚有复位脉冲输出
这必须结合FSL 8位单片机内部的架构特点来实现:
1)COP(看门狗)复位
这是最简单的一种方式。程序死循环然后等看门狗作用产生复位。你必须事先启动看门狗功能,复位过程将有少许延时。
void ForceReset(void)
{
DISAbleInterrupts; //disable all interrupt
for(;;); //wait for watch-dog reset
}
2)非法寻址复位
当指令对某一个不存在的内存空间进行寻址操作时单片机会产生硬件复位。
void ForceReset(void)
{
asm JMP 0xD000; //jump to illegal address will result a RESET
}
注意不同芯片其有效内存空间配置不同,具体地址需参考芯片数据手册做适当调整。
3)非法指令复位
当执行一条不存在的指令编码时单片机会产生硬件复位。这里又可以分两种手段:
a) 利用“合法”指令在特定配置模式下的“非法性”,例如STOP指令。
如果在芯片的配置寄存器SOPT中设定STOPE位为0禁止STOP指令,你若再执行STOP就会认为是非法指令从而立即产生复位。
void ForceReset(void)
{
asm STOP; //illegal STOP will result a RESET, note SOPT_STOPE must be 0
}
如果你的应用中正常情况下不会用到STOP,就可以用这种方式。如果你本来就要用STOP指令就不能用这种方式产生复位,因为SOPT寄存器在复位后只能被写一次。
b) 人为制造非法指令然后强行运行。
这是比较通用的一种方法,这个S08内核系列均可适用。在单片机的指令表中确认一条不可能出现的指令编码,例如0x9E10,将其填入RAM中然后强制运行,即可立即产生复位。
void ForceReset(void)
{
byte illegalCode[2];
illegalCode[0] = 0x9e;
illegalCode[1] = 0x10; //illegal instruction
((void (*)(void))illegalCode)(); //execute illegal instruction will result a RESET
}
史海拾趣
|
我在驱动程序中加入下面蓝色代码会造成系统蓝屏重启,请问是什么原因呢?是不能直接调用WRITE_PORT_UCHAR这个函数吗?? NTSTATUS WinIoDispatch(IN PDEVICE_OBJECT DeviceObject, & ...… 查看全部问答> |
|
我用的是windows mobile professional模拟器,现在不能连接到网络上(也就是在模拟器上打不开网页),总是提示:无法连接,请确拨号或代理服务器设置是否正确,然后重试),之前还可以,今天公司给我换了个ip就不行了,我把能试的方法都试遍了,还 ...… 查看全部问答> |
|
用GDI绘图,非常闪砾,想用双缓冲实现,可发现网上搜到的双缓冲例子中用到的类,在wince下都没有,请问有人做过双缓冲绘图吗?如何实现,希望可以给出关键代码,谢谢… 查看全部问答> |
|
小弟正学习mobile手机开发, 现在建立一个win32工程, 默认情况下运行程序模拟器上是一个白屏, 现在想一运行就调用自己的一个ID为dialog_main的对话框, 假设他的窗口过程叫MainPro(),请高手指教改在那里修改代码, 望各位能详细指点,很 ...… 查看全部问答> |
|
51中间接寻址的寻址存储器空间范围包括内部数据存储器和外部数据存储器。而有些单片机的间接寻址的寻址范围也可能包括ROM。这2句话对嘛? 51中间接寻址的寻址存储器空间范围包括内部数据存储器和外部数据存储器。而有些单片机的间接寻址的寻址范围也可能包括ROM。这2句话对嘛? … 查看全部问答> |
|
1.myLCD1602.cpp //#include \"WProgram.h\" #include \"Arduino.h\" #include #define uchar unsigned char uchar RS = 22; uchar RW = 23; uchar E =24; uchar D0 = 25; uchar D1 = 26; uchar D2 = 27; uchar D3 = 28; ...… 查看全部问答> |




