历史上的今天
返回首页

历史上的今天

今天是: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

    }


推荐阅读

史海拾趣

Future Designs, Inc. (FDI)公司的发展小趣事

Future Designs, Inc.(FDI)成立于几十年前,最初由一群在电子设计领域拥有丰富经验的工程师创立。他们看到市场上对于高质量、快速响应的触摸屏LCD图形用户界面(GUI)解决方案的需求日益增长,于是决定成立一家公司,专注于提供此类产品和服务。初创时期,FDI面临诸多挑战,包括资金短缺、市场认可度低以及技术难关等。然而,凭借团队成员的坚持不懈和专业技术,他们逐步攻克难关,开发出了ELI™和罗德里格斯™GUI家族产品,为公司赢得了初步的市场地位。

东晨(DC)公司的发展小趣事

在电子行业的激烈竞争中,东晨(DC)公司凭借一项革命性的技术突破——高效能低功耗的芯片设计,迅速崛起。该公司投入大量研发资源,成功开发出了一款性能卓越、能耗极低的芯片,这一创新成果为智能手机、平板电脑等移动设备提供了更长的续航时间和更快的运行速度。凭借这一技术优势,东晨(DC)公司迅速获得了市场的认可,产品销量节节攀升。

DILABS公司的发展小趣事

随着全球环保意识的提高,DILABS开始注重绿色生产。他们引入了先进的环保技术和设备,确保在生产过程中最大限度地减少废弃物和污染物的排放。同时,DILABS还积极推动电子产品的环保设计,帮助客户实现绿色采购和可持续发展。

Efficient Power Conversion公司的发展小趣事

随着EPC公司氮化镓技术的不断完善和成熟,其产品开始受到市场的广泛认可。无线电源传送、全自动汽车、高速移动通信等领域的企业纷纷采用EPC公司的氮化镓功率半导体器件,以提高其产品的性能和效率。EPC公司的市场份额逐渐扩大,成为氮化镓功率管理技术领域的领军企业。

Cicoil公司的发展小趣事

随着计算机技术的飞速发展,处理器成为了电子设备的核心部件。Cicoil公司看到了这一趋势,开始与处理器制造商展开合作。他们为处理器提供高质量的连接电缆,确保处理器能够稳定、高效地运行。这一合作使得Cicoil公司的电缆产品进一步深入到计算机领域,也为其带来了更多的商业机会。

骏晔科技(DreamLNK)公司的发展小趣事

随着公司业务的不断发展和市场规模的扩大,骏晔科技开始积极布局全球市场。公司通过与全球数十家半导体企业建立战略合作关系,拓展海外市场。同时,公司还积极参加国际电子展会和论坛,与全球同行交流合作,共同推动电子行业的发展。通过这些努力,骏晔科技在国际市场上逐渐崭露头角,成为了备受关注的行业新星。

问答坊 | AI 解惑

硬件工程师面试试题

硬件工程师面试试题 看看你能回答几个 …

查看全部问答>

如何用51单片机(可扩展)设计一个计算器

想跟各位讨教一下如何用51单片机设计一个计算器,有高手请帮帮忙,附上程序,主要有+,-,*,/,还有删除,一些条件判别………

查看全部问答>

WRITE_PORT_UCHAR()函数会造成蓝屏重启动?

我在驱动程序中加入下面蓝色代码会造成系统蓝屏重启,请问是什么原因呢?是不能直接调用WRITE_PORT_UCHAR这个函数吗?? NTSTATUS WinIoDispatch(IN PDEVICE_OBJECT DeviceObject,               & ...…

查看全部问答>

为什么我的模拟器不能够连接到网络上?

我用的是windows mobile professional模拟器,现在不能连接到网络上(也就是在模拟器上打不开网页),总是提示:无法连接,请确拨号或代理服务器设置是否正确,然后重试),之前还可以,今天公司给我换了个ip就不行了,我把能试的方法都试遍了,还 ...…

查看全部问答>

C#在wince下的双缓冲如何实现?

用GDI绘图,非常闪砾,想用双缓冲实现,可发现网上搜到的双缓冲例子中用到的类,在wince下都没有,请问有人做过双缓冲绘图吗?如何实现,希望可以给出关键代码,谢谢…

查看全部问答>

求教win32工程如何在界面初始化时就调用一个界面。

小弟正学习mobile手机开发, 现在建立一个win32工程, 默认情况下运行程序模拟器上是一个白屏, 现在想一运行就调用自己的一个ID为dialog_main的对话框, 假设他的窗口过程叫MainPro(),请高手指教改在那里修改代码, 望各位能详细指点,很 ...…

查看全部问答>

51中间接寻址的寻址存储器空间范围包括内部数据存储器和外部数据存储器。而有些单片机的间接寻址的寻址范围也可能包括ROM。这2句话对嘛?

51中间接寻址的寻址存储器空间范围包括内部数据存储器和外部数据存储器。而有些单片机的间接寻址的寻址范围也可能包括ROM。这2句话对嘛? …

查看全部问答>

关于单片机程序问题

各位大虾:     你们好,本人最近在单片机学习中遇到了一些棘手的问题,望得到前辈们的指点:1 首先是数码管静态显示的问题,有如下一段程序   #include<reg52.h>           ...…

查看全部问答>

瑞萨单片机摇摇棒

通过16个高亮度的LED灯并快速的摇动来显示ASCII码以及汉字甚至是团!…

查看全部问答>

arduino mega256 1602 扩展库

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; ...…

查看全部问答>