8位嵌入式单片机的软件复位技巧实现

控制/MCU

1820人已加入

描述

飞思系列的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

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分