找回密码
 立即注册
查看: 1388|回复: 10

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

[复制链接]

该用户从未签到

14

主题

70

回帖

341

积分

中级会员

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

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

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



回复 送花

使用道具 举报

  • TA的每日心情
    奋斗
    昨天 15:00
  • 签到天数: 124 天

    [LV.7]常住居民III

    已绑定手机

    73

    主题

    791

    回帖

    2380

    积分

    超级版主

    积分
    2380
    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 ;
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 08:54
  • 签到天数: 277 天

    [LV.8]以坛为家I

    30

    主题

    1754

    回帖

    5738

    积分

    论坛元老

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

    用附件例程试试

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

    7.21 KB, 下载次数: 85

    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    14

    主题

    70

    回帖

    341

    积分

    中级会员

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

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

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 08:54
  • 签到天数: 277 天

    [LV.8]以坛为家I

    30

    主题

    1754

    回帖

    5738

    积分

    论坛元老

    积分
    5738
    发表于 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, 下载次数: 96

    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    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

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 08:54
  • 签到天数: 277 天

    [LV.8]以坛为家I

    30

    主题

    1754

    回帖

    5738

    积分

    论坛元老

    积分
    5738
    发表于 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区进入用户程序区是通过软件复位的方式,所以软件复位标志也会 ...

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

    使用道具 举报

  • TA的每日心情
    无聊
    昨天 09:21
  • 签到天数: 285 天

    [LV.8]以坛为家I

    26

    主题

    1766

    回帖

    4549

    积分

    论坛元老

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

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

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-11-1 06:55 , Processed in 0.085253 second(s), 81 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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