历史上的今天

今天是:2024年11月18日(星期一)

2019年11月18日 | STM8单片机复位源判断

发布者:浅唱梦幻 来源: eefocus关键字:STM8  单片机  复位源 手机看文章 扫描二维码
随时随地手机看文章

最近在调试系统的时候,发现单片机老是复位,于是想着用程序来判断一个单片机的复位信号是来自于哪里。查找资料发现STM8单片机的复位源总共有9种


●NRST引脚产生的外部复位

● 上电复位(POR)

● 掉电复位(BOR)

● 独立看门狗复位

● 窗口看门狗复位

● 软件复位

● SWIM复位

● 非法操作码复位

● EMS复位:当一些关键的寄存器被破坏或错误加载时产生的复位


但是这9种复位源通过复位寄存器能看到的只有5种


复位状态寄存器(RST_SR)


位7:5 保留,必须保持为0。

位4 EMCF:EMC复位标志

位3 SWIMF:SWIM复位标志位

位2 ILLOPF:非法操作码复位标志位

位1 IWDGF:独立型看门狗复位标志位

位0 WWDGF:窗口型看门狗复位标志位

 


由于单片机没有用到看门狗,所以这两种看门狗复位用不到,SWIM复位是烧写程序或者仿真时用的。那就只剩下一个EMC复位、非法操作码复位可以判断。但是更希望看到的是单片机是电源不稳引起的掉电复位还是单片机复位引脚被干扰引起的NRST复位。但是寄存器中没有可以判断这两种复位源的标志位。那么能不能自己想办法来判断这两种复位源呢?


  首先分析一下掉电复位和NRST复位的区别,掉电复位也就是单片机完全断电,复位后内存中所有的东西会丢失。NRST复位时内存数据没有丢失,内存中的东西还是复位前存储的数据。那么根据这个特性是不是可以在内存中某个地址存数一个标志。复位后去读取这个标志,如果这个标志和存放的一样,说明单片机没有掉电,属于NRST复位。如果读取到的值不是存储的值那么说明单片机断电了,内存中存储的内容丢失了,属于掉电复位。那么这样就能区分开是掉电复位还是NRST复位了。


写个程序测试了一下,测试结果符合预期。


测试代码如下:


#include "iostm8s103F3.h"

#include "main.h"

#include "uart.h"

#include "stdio.h"

 

void SysClkInit( void )

{

    CLK_SWR = 0xe1;                  //HSI为主时钟源  16MHz CPU时钟频率

    CLK_CKDIVR = 0x00;               //CPU时钟0分频,系统时钟0分频

}

 

void main( void )

{

    __asm( "sim" );                             //禁止中断

    SysClkInit();

    Uart1_Init( 9600 );

    __asm( "rim" );                             //开启中断

    

    //复位源判断

    if( ( * ( u16* )( 0x000102 ) ) == 0x55 )    //判断0x000100这个地址中存储的值是不是0x55

    {

        printf( " key reset!rn" );                     //值等于0x55说明是程序写进去的,属于按键复位

    }

    else                                                        //如果这个地址的值不等于0x55 说明单片机是刚上电

    {

      printf( " power reset!rn" );                  //属于上电复位 然后将指定的值写入指定的地址,若单片机不断电,这个值就会一直保持不变

        * ( u16* )( 0x000102 ) = 0x55;

    }

    if( RST_SR_WWDGF )

    {

        printf( "wwdg reset!rn" );

    }

    if( RST_SR_IWDGF )

    {

        printf( "iwdg reset!rn" );

    }

    if( RST_SR_ILLOPF )

    {

        printf( "illop reset!rn" );

    }

    if( RST_SR_SWIMF )

    {

        printf( "swim reset!rn" );

    }

    if( RST_SR_EMCF )

    {

        printf( "emcf reset!rn" );

    }

    //WWDG_CR = 0x80;                    //启动独立看门狗

    //  IWDG_KR = 0xCC;                   //启动窗口看门狗

    while( 1 )

    {

    }

}


每次上电后先判断 0x000102 这个地址的值是不是0x55,如果不是说明单片机是刚上电,内存中的值是随机的。于是将0x000102这个地址中的值改为0x55,如果下一次单片机复位后读到这个地址的值是0x55的话,说明单片机没有掉电。属于复位引脚引起的复位。0x000102这个地址必须保证不会被程序用到,要不然在程序执行过程中值被改写,下次单片机复位后读到的值就不是0x55了。


其余的复位源直接去读取寄存器就可以了。

关键字:STM8  单片机  复位源 引用地址:STM8单片机复位源判断

上一篇:STM8S——Clock control(CLK)
下一篇:STM8S——Analog/digital converter (ADC)

推荐阅读

下一代机器学习技术为BlackBerry技术组合提供全面补充集成后BlackBerry解决方案将成为业界首款可实现智能保护固定和移动终端的产品嵌入式人工智能技术将加速BlackBerry Spark 企业物联网平台的发展 BlackBerry今日宣布已签订最终协议,将斥资14亿美元现金以及承担未兑现的员工激励,全面收购人工智能和网络安全领军企业Cylance。该交易还需获得监管部门批...
无线数字通讯系统,卫星数字通讯系统,数字通讯电台等都存在调制器和解调器,在研发和测试这些系统时,调制器和解调器的绝对延时也是我们应该关注和应该测试的一个项目。但是,使用什么手段和如何测试调制器和解调器的绝对延时,却一直困扰着我们。下面是对调制器和解调器测试手段和测试方法的探索和分析,希望对研发和测试工作者有参考价值。1.调制器...
QuickLogic宣布加入三星先进代工生态系统(SAFE),成为其IP合作伙伴计划的最新成员。由于新的合作关系,来自QuickLogic的ArcticPro 3嵌入式FPGA(eFPGA)现在可用于三星的28nm FD–SOI工艺。ArcticPro 3 eFPGA IP采用28nm工艺设计,提高了性能,并提供了超低的电流泄漏。此外,包括嵌入式存储器和可分解乘法累加器(MAC)的固定功能块实现用于神经网...
安卓阵营很快就要升级新一代处理器了,其中高通即将推出骁龙898(暂定名),大家都对它的性能充满期待,现在Geekbench跑分泄露了,单核分数在1200左右,相比骁龙888/888+提升不大。  Geekbech数据库中出现了三星某些机型的跑分,GK5的单核成绩为1213,多核3308,应该是SD8450也就是骁龙898的成绩了。  骁龙888及骁龙888+的GK5单核性能一般在110...

史海拾趣

问答坊 | AI 解惑

技术论坛规矩,请大家遵守

1、在自己得到了别人的帮助以后,一定在最后总结一下,请不要一声不吭的走人。 总结的内容包括:1、问题到底出在哪里。2、通过第几楼的方法解决的。 这种总结,对其他人很有用,通过看总结他们可以知道第几楼的方法是对的。 在自己的求助帖最后 ...…

查看全部问答∨

wince 5.0 sdk 支持vs2005

pb 5.0 中自带的.net compact framework是1.0的。vs2005用的是2.0的。 因此我想生成印象时将2.0的.net framework包含进去。 于是安装了WinCEPB50-071231-Product-Update-Rollup-Armv4I.msi这个补丁。 在**catalog items中的Applications and Ser ...…

查看全部问答∨

我想在日历控件上(MFC的DateTimePicker控件)上弹出TAH(上下文菜单,类似pc上的右键弹出菜单),请问该如何实现,能给个例子吗?

网上的例子都千篇一律的出自codeproject上一位葡萄牙工程师的论文,看了几遍都没看懂,里面很多函数参数不知从何而来.不知大哥能否给小弟指导一下?感激不尽…

查看全部问答∨

请教VXWORKS browser调试问题!急!

用browser调试程序!查看任务状态,室时间空中,用户任务的名字会时常变成红字,怎么回事?敬请各位英雄指教!…

查看全部问答∨

cosmic对Heap的处理效率怎么样啊?(malloc/free)

最近项目中打算使用malloc这个函数(IC:STM8A)有点担心编译器对Heap操作的效率问题 有哪位朋友知道cosmic对Heap处理效率怎么样啊? PS:本人分数很少,望谅解!…

查看全部问答∨

请问ADS62P48前变压器设计

本帖最后由 dontium 于 2015-1-23 13:26 编辑 请问有一线性调频信号要用ADS62P48进行采集,ADS62P48前变压器要怎么设计??? …

查看全部问答∨

PCB和电磁兼容设计

PCB和电磁兼容设计 比较基础的一本书,对PCB的EMC理解有帮助,希望大家仔细看。…

查看全部问答∨

【每周讨论】说说你写C语言程序出现的最愚蠢的BUG

说说你写C语言程序出现的最愚蠢的BUG?  …

查看全部问答∨

SPI read data via DMA fail?

各位高手大家好~有個SPI DMA的問題請大家。小弟使用開發平台為STM32F103ZE。目前若不用DMA的SPI是正常可以使用的。但目前SPI傳的速度不夠快,若照SPI 6Mbps傳送4kB data應該約花5.3 ms,但是目前我從波形上量到的時間約是12~13ms, 因為我的應用上需 ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • ARM裸机篇--按键中断
    先看看GPOI的输入实验:按键电路图:GPF1管教的功能:EINT1要使用GPF1作为EINT1的功能时,只要将GPFCON的3:2位配置成10就可以了!GPF1先配 ...
  • 网上下的--ARM入门笔记
    简单的介绍打今天起菜鸟的ARM笔记算是开张了,也算给我的这些笔记找个存的地方。为什么要发布出来?也许是大家感兴趣的,其实这些笔记之所 ...
  • 学习ARM开发(23)
    三个任务准备与运行结果下来看看创建任务和任运的栈空间怎么样的,以及运行输出。Made in china by UCSDN(caijunsheng)Lichee 1 0 0 ...
  • 学习ARM开发(22)
    关闭中断与打开中断中断是一种高效的对话机制,但有时并不想程序运行的过程中中断运行,比如正在打印东西,但程序突然中断了,又让另外一个 ...
  • 学习ARM开发(21)
    先要声明任务指针,因为后面需要使用。 任务指针 volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • 学习ARM开发(20)
  • 学习ARM开发(19)
  • 学习ARM开发(14)
  • 学习ARM开发(15)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved