STM8单片机复位源判断

2019-11-18来源: 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  单片机  复位源 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic480314.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

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

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

ST推出经济好用的STM8 Nucleo-32开发板
意法半导体新推出的STM8开发板采用方便好用的Nucleo-32 开发板外形尺寸,让使用8位STM8微控制器(MCU)开发原型速度更快,更经济实惠,更容易上手,适合所有类型的创客。 这款紧凑型板子配备USB接口,板子控制和供电都很简便。板载ST-LINK调试器/编程器,省去了外部调试探针,支持简单的拖放式闪存烧写。板上Arduino™Nano引脚可连接现成的shield板子,简化主板功能扩展,并让用户能够与开源硬件社区互动。这些板子得到主要开发工具链的支持,包括IAR Embedded Workbench for STM8 和Cosmic CXSTM8。 STM8 MCU基于一颗高性能8位
发表于 2019-12-05
ST推出经济好用的STM8 Nucleo-32开发板
STM8S开发环境搭建IAR For STM8
/************************************************************************************************************************************ Name    : STM8S开发环境搭建IAR For STM8* Author  : MingMing* Release : 2013/12/29* Update  : 2013/12/29* E-mail  : clint.wang@foxmail.com
发表于 2019-12-05
STM8S开发环境搭建IAR For STM8
STM8S内部时钟切换问题解决
/************************************************************************************************************************************ Name    : STM8S内部时钟切换问题解决* Author  : MingMing* Release : 2013/12/28* Update  : 2013/12/29* E-mail  : clint.wang@foxmail.com
发表于 2019-12-05
STM8S内部时钟切换问题解决
STM8S存储器的读写操作
/************************************************************************************************************************************ Name    : STM8S存储器的读写操作* Author  : MingMing* Release : 2014/1/2* Update  : 2014/1/2* E-mail  : clint.wang@foxmail.com
发表于 2019-12-05
stm8l051 halt之后外部中断唤醒问题
最近用到stm8l051 halt,在halt之后开启了外部中断,有时灵,有时不灵,设置下降沿触发,但是按键(低有效)放开了才会从HALT退出,最后发现在进去外部中断的时候一直在外部中断里面不退出。在外部中断程序里面把端口的外部中断和端口使能的外部中断功能关闭,问题解决,可以在下降沿从halt退出。1、开启halt,其他代码省略,只贴halt部分:    /* 禁止TIM3 */    TIM3->SR1 = (uint8_t)(~(uint8_t)TIM3_IT_Update);    CLK_PeripheralClockConfig
发表于 2019-12-05
STM8L052低功耗模式
Stm8L系列单片机的低功耗有五种模式:§ wait模式§ Lowpower run模式§ Lowpower wait模式§ Active-haltwith full RTC模式§ Halt模式最低功耗的就是就是halt模式。这里也主要总结一下如何进入halt模式,进入以后可以通过什么方式唤醒,以及有很多客户会关心的如何自动唤醒。Halt模式进入很简单,执行一条halt指令,调用库函数也就是halt()就行了。但是进入前要注意把所有的中断挂起标志给清除掉。要是不清零又恰巧有中断标志的时候进入该模式也会被立马唤醒。进入这种模式,所有的外设全都关闭了,所有时钟关闭。这时候它自己是醒不过来的,只能靠掐人中(给个外部中断)或者重新复活
发表于 2019-12-05
小广播
何立民专栏 单片机及嵌入式宝典

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

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