找回密码
 立即注册
查看: 171|回复: 13

STC32G电机控制复位问题

[复制链接]

6

主题

13

回帖

64

积分

注册会员

积分
64
发表于 2026-8-29 11:16:20 | 显示全部楼层 |阅读模式
各位大佬请教一下:

        STC32G12K128运行中复位,RSTFLAG=0x14(LVDRSTF+SWRSTF同时置位),怎么排查到底是哪个复位原因呢?
复位现象:
  • 触发条件:串口命令启动电机B(BS600,目标600mm/s)持续运行后复位
  • 复位时间高度随机:2秒 / 227秒 / 340秒 / 957秒都出现过,无周期规律
  • 空载不启动电机时长时间运行不复位

    不管运行哪个电机都会触发复位,请各位大佬帮忙看看,谢谢;
  • 串口打印内容如下:


  • [10:42:08.508]发送→S600
  • [10:44:20.851]接收←====== Start success ======(初始化才打印,电机运行过程中突然出现此信息,说明复位)
  •                     
  • [10:44:25.956]发送→S600
  • [10:56:58.387]接收←====== Start success ======(初始化才打印,电机运行过程中突然出现此信息,说明复位)




第三次打印:我添加了复位寄存器标志:
[11:11:33.061]发送→S600
[11:13:57.882]接收←====== Start success ======
                      [RST] PCON=0x20 WDT=0x07 IAP=0x00 RSTFLAG=0x14
                      [RST] flag: LVD=1 WDT=0 SW=1 ROMOV=0 EX=0
                      [RST] Cause: LVD reset (VCC dropped)
                      [RST] Note : SW=1 is companion flag of LVD, NOT real SW reset
                      [RST] Hint : check PSU load ability / wiring / LVD threshold

主程序源代码:



void main(void)
{
    u8 pcon_save   = PCON;        /* bit4=POF上电, bit5=LVDF低压复位 */
    u8 wdt_save    = WDT_CONTR;   /* bit7=WDT_FLAG看门狗复位标志 (复位后原始值) */
    u8 iap_save    = IAP_CONTR;   /* bit6=SWBS, bit5=SWRST 软件复位 */
                u8 rstflag_save = 0;
    u8 eaxfr_save;
       
                /* ★读取RSTFLAG扩展寄存器 (必须在最开头, 防止初始化覆盖标志) */
    eaxfr_save = P_SW2;
    P_SW2 |= 0x80;               /* EAXFR=1, 使能扩展SFR访问 */
    rstflag_save = RSTFLAG;
    RSTFLAG = rstflag_save;      /* ★写1清除标志 (写0无效, 写1清对应位) */
    P_SW2 = eaxfr_save;          /* 恢复EAXFR */
               
    WDT_CONTR = 0x36;             /* 使能看门狗, PS=2(8分频), IDLE_WDT=1 */        //90ms=2 3=180 4=360 5=720ms
    WDT_CONTR |= 0x10;            /* CLR_WDT=1, 立即喂狗一次 */

    /* 初始化 (system_init + GPIO + UART + Timer + controll + debug) */
    schedule_init();
    EA = 1;
    delay_ms(10);
    printf("====== Start success ======\r\n");
    printf("  [RST] PCON=0x%02X WDT=0x%02X IAP=0x%02X RSTFLAG=0x%02X\r\n",
           pcon_save, wdt_save, iap_save, rstflag_save);
    printf("  [RST] flag: LVD=%d WDT=%d SW=%d ROMOV=%d EX=%d\r\n",
           (rstflag_save >> 4) & 1, (rstflag_save >> 3) & 1,
           (rstflag_save >> 2) & 1, (rstflag_save >> 1) & 1,
           rstflag_save & 1);
    if (rstflag_save & 0x10) {
        printf("  [RST] Cause: LVD reset (VCC dropped)\r\n");
        if (rstflag_save & 0x04)
            printf("  [RST] Note : SW=1 is companion flag of LVD, NOT real SW reset\r\n");
        if (rstflag_save & 0x02)
            printf("  [RST] Note : ROMOV=1, CPU mis-executed during VCC drop\r\n");
        printf("  [RST] Hint : check PSU load ability / wiring / LVD threshold\r\n");
    } else if (rstflag_save & 0x08) {
        printf("  [RST] Cause: Watchdog timeout\r\n");
    } else if (rstflag_save & 0x02) {
        printf("  [RST] Cause: PC runaway (invalid ROM area)\r\n");
        if (pcon_save & 0x20)
            printf("  [RST] Note : PCON.LVDF=1, VCC also dropped - power suspect\r\n");
    } else if (rstflag_save & 0x04) {
        printf("  [RST] Cause: SW reset without LVD/WDT - IAP_CONTR mis-write?\r\n");
    } else if (rstflag_save & 0x01) {
        printf("  [RST] Cause: External RST pin (P5.4)\r\n");
    } else if (pcon_save & 0x10) {
        printf("  [RST] Cause: Power-On reset\r\n");
    } else {
        printf("  [RST] Cause: Unknown (check hardware)\r\n");
    }
    PCON      &= ~(0x30);         /* 清除POF/LVDF标志 */
    WDT_CONTR &= ~0x80;           /* 清除WDT_FLAG标志 */

    //printf("UART1 cmds: HELP\r\n");
    //printf("  MotorA: START STOP S<rpm> + - DIR P I G INFO\r\n");
    //printf("  MotorB: BSTART BSTOP BS<rpm> B+ B- BDIR BINFO\r\n");
    //printf("  Dual:   AB<rpm> ESTOP\r\n");

    while (1) {
        if (B_1ms) {
            B_1ms = 0;
            schedule_loop();
        }
    }
}











回复

使用道具 举报 送花

已绑定手机

14

主题

268

回帖

3306

积分

论坛元老

积分
3306
发表于 2026-8-29 12:07:30 | 显示全部楼层
个人感觉:

会不会是硬件问题,单片机电源不稳产生了低压复位,用示波器观察一下波形。LVDRSTF

你是不是使用了不停电下载功能,先屏蔽掉这个功能试试。SWRSTF

回复

使用道具 举报 送花

已绑定手机

63

主题

2165

回帖

3431

积分

论坛元老

积分
3431
发表于 2026-8-29 12:44:36 | 显示全部楼层
电源的可能比较大一些,受干扰后电源纹波变大
回复

使用道具 举报 送花

83

主题

8219

回帖

1万

积分

超级版主

积分
17644
发表于 2026-8-29 13:41:10 | 显示全部楼层
首先用数字示波器仔细观察单片的电源VCC与GND之间的电压,使用下降沿触发,触发电平2.5V,普通触发(有触发信号才显示波形)。
电机驱动导致MCU复位的,基本都是因为电源有跌落导致低压复位,造成原因通常是电源功率(电流)不够、PCB排版不合理(特别是地线排版不合理)。
回复

使用道具 举报 送花

已绑定手机

7

主题

411

回帖

6598

积分

论坛元老

积分
6598
发表于 2026-8-29 14:21:12 | 显示全部楼层
1.用示波器监测一下呗,如梁工所说,监测VCC电压是否有下降,或利用IO口在运行时与复位时的不同状态来作触发,先确认硬件没问题再说。
2.另外找个电源单独给单片机供电试试。
3.如果确认硬件没问题,再来排查软件问题,比如某些BUG(如除数为0、数组越界、堆栈溢出等)可能让单片机复位,不过从你打印的标志位来看,这个可能性较小。
建议上传电路原理图、PCB、实物图、代码工程(去掉不相关代码、且能复现故障的)。
回复

使用道具 举报 送花

已绑定手机

74

主题

1003

回帖

3653

积分

论坛元老

初出茅庐&无甚本事

积分
3653
发表于 2026-8-29 15:09:08 | 显示全部楼层
lcws*** 发表于 2026-8-29 14:21
1.用示波器监测一下呗,如梁工所说,监测VCC电压是否有下降,或利用IO口在运行时与复位时的不同状态来作触 ...

某款产品通过dcdc给电机供电
再通过ldo给单片机供电
供电效果稳定
偶尔看看玩玩
回复

使用道具 举报 送花

6

主题

13

回帖

64

积分

注册会员

积分
64
 楼主| 发表于 2026-8-29 15:42:15 | 显示全部楼层
C_w*** 发表于 2026-8-29 12:07
个人感觉:

会不会是硬件问题,单片机电源不稳产生了低压复位,用示波器观察一下波形。LVDRSTF

C:\Users\Fdata\DesktopSnipaste_2026-08-29_15-40-32.png这个关不了吧
回复

使用道具 举报 送花

6

主题

13

回帖

64

积分

注册会员

积分
64
 楼主| 发表于 2026-8-29 15:44:01 | 显示全部楼层
不停电下载功能关不了吧;
截图202608291542524310.jpg
截图202608291543199682.jpg

点评

看如果是用 usb 的不停电复位,基本不会有干扰,因为 usb 数据本身有校验 如果是串口不停电下载,要警惕 0x00/0xff 这类数据,还是挺容易触发复位的 关复位通常是指在单片机端关掉或者改成其他更有抗干扰的字符  详情 回复 发表于 2026-8-29 16:03
回复

使用道具 举报 送花

已绑定手机
已实名认证

147

主题

4045

回帖

1万

积分

超级版主

积分
10681
发表于 2026-8-29 16:03:08 | 显示全部楼层
随*** 发表于 2026-8-29 15:44
不停电下载功能关不了吧;

看如果是用 usb 的不停电复位,基本不会有干扰,因为 usb 数据本身有校验
如果是串口不停电下载,要警惕 0x00/0xff 这类数据,还是挺容易触发复位的
关复位通常是指在单片机端关掉或者改成其他更有抗干扰的字符
回复

使用道具 举报 送花

6

主题

13

回帖

64

积分

注册会员

积分
64
 楼主| 发表于 2026-8-29 16:10:47 | 显示全部楼层
王*** 发表于 2026-8-29 16:03
看如果是用 usb 的不停电复位,基本不会有干扰,因为 usb 数据本身有校验
如果是串口不停电下载,要警惕  ...

目前是串口下载;下载都完毕了的话,根这个通信其实没啥关系了吧;

点评

你如果没设置串口指令软复位是没啥事的 设置了就需要检查一下,最简单的就是给单片机挂个大电容看看是否有所改善  详情 回复 发表于 2026-8-29 16:26
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-9-23 16:09 , Processed in 0.082358 second(s), 94 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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