原创 freescale s08 MCU的软件复位方法

2011-7-21 18:26 2680 11 12 分类: MCU/ 嵌入式

这也是转的张明峰的文章。

 

FSL的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
}
PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户1064776 2012-1-16 12:47

方法不错,有空试一下,谢谢分享
相关推荐阅读
用户1361860 2012-06-28 23:44
Nicrosystem Freescale Kinetis教程---SDHC
这是研究生翻译的SDHC的中文文档,里面很多句子不通,但我现在没时间去修改了。先放出来,应该还是会有一点作用  ...
用户1361860 2012-06-26 12:39
Nicrosystem Freescale Kinetis教程--低功耗定时器
Freescale Kinetis内部集成了一个独特的低功耗定时器,它可以在系统处于低功耗模式下,仍然以极低功耗运行,可以用于在适当时候唤醒系统进入正常工作模式  ...
用户1361860 2012-06-24 22:11
Nicrosystem Freescale Kinetis教程----RTC实时时钟
Nicrosystem的飞思卡尔kinetis教程之片上RTC  ...
用户1361860 2012-06-22 10:21
TI C2000微控制器指南
这是官方的C2000的介绍,C2000做电机控制那是业界最好的。  ...
用户1361860 2012-06-20 23:52
Nicrosystem Freescale Kinetis教程--PIT定时器教程
这是PIT定时器的教程,PIT是 Kinetis支持的另一种定时器,相对于上一讲的flextimer要简单。 今晚赶到北京,到宾馆发一篇博客  ...
用户1361860 2012-06-19 13:15
Nicrosystem Freescale Kinetis教程--Flextimer教程
Kinetis的Flextimer定时器教程 kinetis集成了众多功能各异的定时器,flextimer是其中最为复杂的一个  ...
我要评论
1
11
关闭 站长推荐上一条 /3 下一条