标题: 关于STC8H8K64U单片机复位标志寄存器RSTFLAG [打印本页]

作者: nachoneko    时间: 2024-4-18 19:51
标题: 关于STC8H8K64U单片机复位标志寄存器RSTFLAG
关于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);
}

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

作者: Graves    时间: 2024-4-19 09:47
STC_SoftReset()这是复位吧?程序一到STC_SoftReset()就复位了都跑不到while(1);然后一直重启、软件复位。可能就检测不到上电复位了
作者: STC庄伟    时间: 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, 下载次数: 1)
作者: 188610329    时间: 2024-4-19 18:26
你是不是应该 重起前  让串口再发一次 标志位,来确定是否清除成功呢?




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1