找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 116|回复: 4
打印 上一主题 下一主题
收起左侧

关于STC8H8K64U单片机复位标志寄存器RSTFLAG

[复制链接]
跳转到指定楼层
楼主
ID:1094298 发表于 2024-4-18 19:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
关于STC8H8K64U复位标志寄存器RSTFLAG,我想区分上电复位和软件写SWRST复位,但不管是上电复位还是软件写复位,得到的RSTFLAG寄存器值一直都是0x14,只有在我使用引脚RST复位的时候会去读到0x15,然后我再软件写复位,就会一直读取到0x15.
请问这是什么原因呢?以下是我测试的单片机代码:void main()
{
        Uart1_Init();        //系统日志打印        波特率:9600
        delay_s(5);
        Uart1_Send(RSTFLAG);  //STC_ResetReason()
        RSTFLAG = 0xFF;
        delay_s(5);
        STC_SoftReset();


        while(1);
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:226055 发表于 2024-4-19 09:33 | 只看该作者
    1、你的主循环里面没有添加任何语句啊,你的程序是初始化是读了一下,之后软件复位,之后进主循环,主循环应该继续读寄存器值。
    2、当然要确保你的硬件和供电都没问题哦,,硬件是自己做的板子吗?
回复

使用道具 举报

板凳
ID:192020 发表于 2024-4-19 09:47 | 只看该作者
STC_SoftReset()这是复位吧?程序一到STC_SoftReset()就复位了都跑不到while(1);然后一直重启、软件复位。可能就检测不到上电复位了
回复

使用道具 举报

地板
ID:961114 发表于 2024-4-19 11:13 | 只看该作者
通过读取RSTFLAG标志来判断也是可以的。
不过需要注意RSTFLAG是扩展寄存器,访问前需要开启扩展寄存器访问使能。
    if(RSTFLAG & 0x10)  //LVDRSTF
    {
        RSTFLAG |= 0x10;    //写1清除标志位
        printf("LVD reset.temp=%u\r\n",temp);
    }
    if(RSTFLAG & 0x08)  //WDTRSTF
    {
        RSTFLAG |= 0x08;    //写1清除标志位
        printf("Watchdog reset.temp=%u\r\n",temp);
    }
    if(RSTFLAG & 0x04)  //SWRSTF
    {
        RSTFLAG |= 0x04;    //写1清除标志位
        printf("Software reset.temp=%u\r\n",temp);
    }
    if(RSTFLAG & 0x02)  //ROMOVF
    {
        RSTFLAG |= 0x02;    //写1清除标志位
        printf("ROM Overflow reset.temp=%u\r\n",temp);
    }
    if(RSTFLAG & 0x01)  //EXRSTF
    {
        RSTFLAG |= 0x01;    //写1清除标志位
        printf("External reset.temp=%u\r\n",temp);
    }
串口验证复位来源.zip (7.46 KB, 下载次数: 0)
回复

使用道具 举报

5#
ID:624769 发表于 2024-4-19 18:26 | 只看该作者
你是不是应该 重起前  让串口再发一次 标志位,来确定是否清除成功呢?
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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