找回密码
 立即注册
查看: 2064|回复: 11

复位标志,如何查找单片机的复位标志

[复制链接]

14

主题

70

回帖

341

积分

中级会员

积分
341
发表于 2023-8-1 16:03:46 | 显示全部楼层 |阅读模式

复位标志,如何查找单片机的复位标志

各位老师好,单片机复位了,想查找一下是什么方式的复位该怎么处理呢?
看手册上有 RSTFLAG,该如何使用该寄存器来查找复位原因呢?
复位了之后这个寄存器会保存以前的值么?
如何查找单片机的复位标志-1.png 如何查找单片机的复位标志-2.png



回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:172
  • 最近打卡:2025-04-28 08:49:07
已绑定手机

90

主题

961

回帖

2318

积分

超级版主

积分
2318
QQ
发表于 2023-8-3 09:05:56 | 显示全部楼层
1.png

STC8H系列 数据手册  https://www.stcai.com/filedownload/721074
热线19952583534
www.STCAI.com
回复 支持 反对

使用道具 举报 送花

14

主题

70

回帖

341

积分

中级会员

积分
341
发表于 2023-8-3 11:09:27 | 显示全部楼层
国学*** 发表于 2023-8-3 09:05
STC8H系列 数据手册  https://www.stcai.com/filedownload/721074

我的单片机莫名其妙的复位了,我想看一下是什么情况导致的复位,可以查询这个 RSTFLAG 这个寄存器里的标志进行判断原因么?如果能如何来做这段程序?麻烦高手给个思路或者方法,给出程序更好,我搞的下面一段貌似不行啊,看门狗重启后并没有打印数据出来到电脑上

                                        if( RSTFLAG & 0x10 )       
                                                {
                                                        Show_Str(20,20,RED,BLACK,        "LVDRST",16,1);        //低压复位,上电置 1:ok                                       
                                                        printf("RSTFLAG = LVDRST \n ");                                       
                                                }
                                  else if( RSTFLAG & 0x08 )       
                                                {
                                                        //Show_Str(20,20,RED,BLACK,        "WDTRST",16,1);        //看门狗复位
                                                        printf("RSTFLAG = WDTRST \n ");
                                                }
                                        else if( RSTFLAG & 0x04 )       
                                                {
                                                        Show_Str(20,20,RED,BLACK,        "SWRST",16,1);               
                                                        printf("RSTFLAG = SWRST \n ");
                                                }
                                        else if( RSTFLAG & 0x02 )       
                                                {
                                                        Show_Str(20,20,RED,BLACK,        "ROMOVRST",16,1);       
                                                        printf("RSTFLAG = ROMOVRST \n ");
                                                }
                                        else if( RSTFLAG & 0x01 )       
                                                {
                                                        Show_Str(20,20,RED,BLACK,        "EXRST",16,1);               
                                                        printf("RSTFLAG = EXRST \n ");
                                                }
                                        else ;
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6841

积分

论坛元老

积分
6841
发表于 2023-8-3 11:18:56 | 显示全部楼层
13668840876 发表于 2023-8-3 11:09
我的单片机莫名其妙的复位了,我想看一下是什么情况导致的复位,可以查询这个 RSTFLAG 这个寄存器里的标 ...

用附件例程试试

串口验证看门狗-保留数据.zip

7.21 KB, 下载次数: 142

回复 支持 反对

使用道具 举报 送花

14

主题

70

回帖

341

积分

中级会员

积分
341
发表于 2023-8-3 11:48:21 | 显示全部楼层

我是想直接读取 RSTFLAG 内部的标志位来区分何种原因导致了复位,复件的例程好像不太配呢。
我就试验上电复位成功了,当上电初始化里不去清零 LVDRSTF 时,串口可以打印出相关信息。
当上电初始化里清零 LVDRSTF ,主程序里不清看门狗时也导致复位,但是 串口打印不出来相关信息,不知道是怎么回事呢?
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6841

积分

论坛元老

积分
6841
发表于 2023-8-3 13:13:34 | 显示全部楼层
13668840876 发表于 2023-8-3 11:48
我是想直接读取 RSTFLAG 内部的标志位来区分何种原因导致了复位,复件的例程好像不太配呢。
我就试验上电 ...

通过读取RSTFLAG标志来判断也是可以的。
不过需要注意RSTFLAG是扩展寄存器,访问前需要开启扩展寄存器访问使能。

  1.     if(RSTFLAG & 0x10)  //LVDRSTF
  2.     {
  3.         RSTFLAG |= 0x10;    //写1清除标志位
  4.         printf("LVD reset.temp=%u\r\n",temp);
  5.     }
  6.     if(RSTFLAG & 0x08)  //WDTRSTF
  7.     {
  8.         RSTFLAG |= 0x08;    //写1清除标志位
  9.         printf("Watchdog reset.temp=%u\r\n",temp);
  10.     }
  11.     if(RSTFLAG & 0x04)  //SWRSTF
  12.     {
  13.         RSTFLAG |= 0x04;    //写1清除标志位
  14.         printf("Software reset.temp=%u\r\n",temp);
  15.     }
  16.     if(RSTFLAG & 0x02)  //ROMOVF
  17.     {
  18.         RSTFLAG |= 0x02;    //写1清除标志位
  19.         printf("ROM Overflow reset.temp=%u\r\n",temp);
  20.     }
  21.     if(RSTFLAG & 0x01)  //EXRSTF
  22.     {
  23.         RSTFLAG |= 0x01;    //写1清除标志位
  24.         printf("External reset.temp=%u\r\n",temp);
  25.     }
复制代码


串口验证复位来源.zip

7.46 KB, 下载次数: 154

回复 支持 反对

使用道具 举报 送花

14

主题

70

回帖

341

积分

中级会员

积分
341
发表于 2023-8-7 14:15:40 | 显示全部楼层
乘风*** 发表于 2023-8-3 13:13
通过读取RSTFLAG标志来判断也是可以的。
不过需要注意RSTFLAG是扩展寄存器,访问前需要开启扩展寄存器访 ...

您好,我按照您的程序做了少许更改,目前测试 上电复位和看门狗复位可以正常显示相关信息,但是在做外部复位脚复位实验时输出的信息为“SWRST”,与手册上的信息不符,麻烦您那边可以确认一下么?谢谢

我的程序及相关信息如下的图片所示:
微信图片_20230807140303.jpg 微信图片_20230807140904.png 微信图片_20230807141204.png 微信图片_20230807141353.png 微信图片_20230807141403.png

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6841

积分

论坛元老

积分
6841
发表于 2023-8-7 17:52:50 | 显示全部楼层
13668840876 发表于 2023-8-7 14:15
您好,我按照您的程序做了少许更改,目前测试 上电复位和看门狗复位可以正常显示相关信息,但是在做外部 ...

硬件复位,或者软件复位进入ISP区时,从ISP区进入用户程序区是通过软件复位的方式,所以软件复位标志也会被置位。
你现在用的是if...else if...方式进行判断,前面的条件符合了就不会再判断后面的条件。
建议把软件复位条件判断放到最后的else里面。
回复 支持 反对

使用道具 举报 送花

14

主题

70

回帖

341

积分

中级会员

积分
341
发表于 2023-8-8 08:41:06 | 显示全部楼层
乘风*** 发表于 2023-8-7 17:52
硬件复位,或者软件复位进入ISP区时,从ISP区进入用户程序区是通过软件复位的方式,所以软件复位标志也会 ...

非常感谢,已完成测试
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:435
  • 最近打卡:2025-04-30 08:43:23

33

主题

2351

回帖

4860

积分

论坛元老

积分
4860
发表于 2023-12-23 11:07:53 | 显示全部楼层
乘风*** 发表于 2023-8-7 17:52
硬件复位,或者软件复位进入ISP区时,从ISP区进入用户程序区是通过软件复位的方式,所以软件复位标志也会 ...

有一个疑问,,,如果是触发了看门狗复位,那么看门狗控制寄存器中的看门狗溢出标志也会置一么
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-1 19:38 , Processed in 0.533478 second(s), 108 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表