最近在调试系统的时候,发现单片机老是复位,于是想着用程序来判断一个单片机的复位信号是来自于哪里。查找资料发现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!\r\n" );                     //值等于0x55说明是程序写进去的,属于按键复位}else                                                        //如果这个地址的值不等于0x55 说明单片机是刚上电{printf( " power reset!\r\n" );                  //属于上电复位 然后将指定的值写入指定的地址,若单片机不断电,这个值就会一直保持不变* ( u16* )( 0x000102 ) = 0x55;}if( RST_SR_WWDGF ){printf( "wwdg reset!\r\n" );}if( RST_SR_IWDGF ){printf( "iwdg reset!\r\n" );}if( RST_SR_ILLOPF ){printf( "illop reset!\r\n" );}if( RST_SR_SWIMF ){printf( "swim reset!\r\n" );}if( RST_SR_EMCF ){printf( "emcf reset!\r\n" );}//WWDG_CR = 0x80;                    //启动独立看门狗//  IWDG_KR = 0xCC;                   //启动窗口看门狗while( 1 ){}
}

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

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

STM8单片机复位源判断相关推荐

  1. STM32复位源判断

    在项目中有时候会遇到单片机莫名奇妙复位的情况,为了判断是那种原因引起复位,就需要对单片机的复位源进行判断.现用STM32F103C8T6单片机进行测试. 先看看单片机复位源都有哪些? 在STM32中文 ...

  2. STM32怎么样判断单片机复位是什么原因造成的

    怎么样判断单片机复位是什么原因造成的(断电复位.看门狗复位等) 看门狗.电源复位等,这些源均作用于 NRST 引脚,该引脚在复位过程中始终保持低电平. 就是说这些复位源造成的复位均使得CRS寄存器位2 ...

  3. stm8单片机例程下载链接

    在这篇文章中将自己上传的资源做一个下载链接的目录方便查找下载 STM8单片机编码器使用示例 STM8单片机ADC连续扫描模式并开启模拟看门狗功能 STM8单片机ADC单次扫描模式并开启模拟看门狗功能 ...

  4. STM8单片机低功耗---活跃停机(Active Halt)模式实现-1

      前两篇文章介绍了低功耗模式中的 等待(Wait)模式和停机(Halt)模式的实现.这篇文章开始介绍 活跃停机(Active Halt)模式. STM8单片机低功耗-等待(Wait)模式实现 STM ...

  5. STM8单片机低功耗---停机(Halt)模式实现

      在上一篇文章 STM8单片机低功耗-等待(Wait)模式实现 中介绍了低功耗模式中的等待(Wait)模式代码实现方法,这篇文章就来演示一下 停机(Halt)模式的代码实现.    停机(Halt) ...

  6. STM8单片机低功耗---等待(Wait)模式实现

      在平时使用单片机的时候,一般不太关心功耗的问题.但是当产品需要使用电池供电的话,那么功耗问题就要必须重视起来.那么如何降低单片机的功耗呢?STM8官方资料上给我们提供了以下几点建议:   如果项目 ...

  7. STM8单片机驱动TM1628的示例程序

    STM8单片机驱动LED驱动芯片TM1628的示例程序,四位共阴数码管,显示"1234",开发环境为IAR FOR STM8,程序代码如下: #include "iost ...

  8. STM8单片机定时器驱动的深度解析

    上一节给大家介绍了基于标准库STM8单片机GPIO的驱动,本节课主要给大家介绍一下STM8定时器的驱动. 我们先打开STM8L10x单片机的规格书,简单的了解一下STM8L10X单片机的定时器功能. ...

  9. STM8单片机低功耗---活跃停机(Active Halt)模式实现-3

      在上一篇文章中使用活跃停机模式实现单片机的定时自动唤醒功能.STM8单片机低功耗-活跃停机(Active Halt)模式实现-2 通过这个实验可以看出,自动唤醒功能和定时器定时功能很类似,那么能不 ...

最新文章

  1. 黑帽SEO:Google为什么会屏蔽你的网站
  2. 多处理与线程Python
  3. python数字图像处理(四) 频率域滤波
  4. 如何进行服务器备份操作系统,如何在Linux服务器上做备份和恢复
  5. P5631-最小mex生成树【线段树,并查集】
  6. python训练聊天机器人_一个可以进行训练的聊天机器人,一次chat的源码
  7. 如何学习一个新的PHP框架
  8. 值得学习的100个网站推广方法。新站推广必备
  9. 教你一招,自己就能检测mac
  10. Java学习资料-Java容器
  11. java 分布式 重复提交_Java接口防重复提交
  12. JRTPLIB使用中碰到的问题
  13. 宝塔linux怎么运行war,宝塔Linux面板在线解压WAR压缩文件
  14. 计算机毕业设计ssm基于SSM框架的人力资源管理系统89kq5系统+程序+源码+lw+远程部署
  15. 八爪鱼抓取html,网页图片采集和抓取方法详解 - 八爪鱼采集器
  16. JavaScript格式化字符串为指定长度
  17. 珊瑚虫工作室_2007-12-24
  18. 【趣味案例】用Python来做一个屏幕录制工具
  19. 监控摄像头RTSP低延时无插件直播解决方案
  20. 数字证书X509格式标准简介

热门文章

  1. Oracle终于安装完成了,开始DBA学习之路
  2. Cisco交换机上的链路聚合
  3. rename批量修改文件名
  4. 查询两个表合并成一个表
  5. 【转载】关系型数据库设计范式
  6. fragment中嵌套viewpager,vierpager中有多个fragment,不显示 .
  7. Java中常用的加密算法MD5,SHA,RSA
  8. 软件加license的一种实现方法
  9. [zz]va_start() 和 va_end()函数应用
  10. 功能测试-测试定义与原则