lss1330 发表于 2022-3-21 16:27:24

求助~PIC32MK芯片手动复位启动异常

芯片:PIC32MK1024MCM064
底板:参照官方底板自己画的Demo板(手焊),产品PCBA(机贴)
异常现象:
      1、底板上电可以正常启动,软件正常运行中,手动按复位键,奇数次复位时芯片复位,但是程序不会重新运行,偶数次复位程序才能正常运行;即需要按两次复位才能重新跑程序。
      2、使用寄存器“SWRST”软复位,进入到现象1中的奇数次复位状态,需要手动再按一次复位键才能正常运行程序。
异常原因猜测:
      1、复位电路设计异常;使用示波器捕捉复位信号,奇数次和偶数次复位信号波形一致没有异常情况,且尝试过更改不同容值的电容,反而影响上电启动。
      2、寄存器配置异常;偶数次复位才能正常运行,感觉像奇数次复位的时候,MCU内部寄存器有问题,需要再次复位才能正常启动。
原本以为是Demo板手焊的原因,但是最近产品样机是SMT机贴的,也还是有同样的问题。望各路大神指点迷津,感觉这问题有点诡异鸭

晶振:无源24MHz
电源:USB电源经过LDO稳压3.3V
使用MCC配置了一个新的工程,并且使用图形配置界面配置了系统时钟。做了几个测试,具体结果如下图所示:

简单的来说,就是测试了SYSCLK在不同时钟源情况下的MCU复位情况。
测试方法:
      1、在主函数系统初始函数后添加打印“AAAAAAAAAAAA”;
      2、在主函数While循环中添加LED闪烁语句。(代码在最下方)
通过上述两个条件判断MCU运行状态。
实验现象:
      1、在使用“FRC(内部8M时钟)”作为SYSCLK时,MCU复位均正常,可以LED正常闪烁;
      2、在使用“POSC(外部24M时钟)”作为SYSCLK时,在有串口输出时,MCU复位出现异常,输出多个A后,MCU卡死(应该是程序跑飞)
      3、在使用“SPLL(系统锁相环120M时钟)”作为SYSCLK时,MCU复位不正常;
      4、在MCU运行时,LED闪烁速度情况:SPLL > POSC > FRC,使用SPLL时闪烁最快。
根据测试数据,得出一下结果:
      1、POSCMOD寄存器是外部竞争的控制寄存器,在选择“HS”时,外部无源晶振可以起振;
      2、根据LED闪烁情况可知,时钟配置已经生效,并且不同时钟情况下,闪烁频率有倍数关系。
根据实验结果再次猜测:
      1、“MCU复位异常”描述不准确;MCU复位是成功且有效的,只是复位后,程序跑飞了造成卡住的情况。
      2、可能总线竞争导致MCU跑飞;此种猜测可能性不大,测试的工程只开了串口,没有其他外设。
      3、在复位后,时钟还没稳定导致MCU跑飞;此猜测也不成立,在系统初始完成之后,我使用while死等“CLKSTAT”寄存器状态,等待状态完成后才退出循环,根据寄存器可知,时钟应该是完成配置的。      
      4、可能是MCU电源电压不稳定导致MCU复位后跑飞;可能性较大,“实验现象2”并不是特别符合“偶数次复位才能正常运行”的情况,有随机性,但是我使用示波器测量MCU电源,未发现在“复位键”按下和弹起时有异常的现象。
      测试代码如下所示:
int main ( void )

{

    int i;

    /* Initialize all modules */

    SYS_Initialize ( NULL );



//    while ((CLKSTAT & 0x5) != 0x5);

    printf("AAAAAAAAAAAAAAAAAAAAAAAAA\n");

    printf("CLKSTAT: 0x%x\n", CLKSTAT);

    GPIO_PinOutputEnable(GPIO_PIN_RB1);

    GPIO_PinOutputEnable(GPIO_PIN_RA11);

    GPIO_PinOutputEnable(GPIO_PIN_RB0);   

    GPIO_PinOutputEnable(GPIO_PIN_RA12);

   



    while ( true )

    {

      

      /* Maintain state machines of all polled MPLAB Harmony modules. */

//      SYS_Tasks ( );

      GPIO_PinWrite(GPIO_PIN_RB0, 0);

      GPIO_PinWrite(GPIO_PIN_RB1, 1);

      GPIO_PinWrite(GPIO_PIN_RA11, 0);

      GPIO_PinWrite(GPIO_PIN_RA12, 1);

      for (i = 0; i < 10000000; i++);

      GPIO_PinWrite(GPIO_PIN_RB0, 1);

      GPIO_PinWrite(GPIO_PIN_RB1, 0);

      GPIO_PinWrite(GPIO_PIN_RA11, 1);

      GPIO_PinWrite(GPIO_PIN_RA12, 0);

      for (i = 0; i < 10000000; i++) ;

//      printf("AAAAAAAAAAAAAAAAAAAAAAAAA\n");

    }



    /* Execution should not come here during normal operation */



    return ( EXIT_FAILURE );

}

lss1330 发表于 2022-3-29 17:40:35

已经破案了,芯片批次问题。
SMT贴了三块板子,其中一块的PIC32是工程样片,另外两块的PIC32是B1版本的。只有工程样片的那颗MCU会出现复位启动异常问题。于是我去确认了我手焊的板子,确实是工程样片版本。
MCU丝印如下图:

lingdianhao 发表于 2022-3-21 23:39:50

直接板子扔FAE调试。

Trylin 发表于 2022-3-22 14:42:53

PIC32比较小众,碰到问题都不好找人

lss1330 发表于 2022-3-29 17:42:12

lingdianhao 发表于 2022-3-21 23:39
直接板子扔FAE调试。
(引用自2楼)

之前打过电话,他们说“他们没遇到过这样的问题”,

lss1330 发表于 2022-3-29 17:42:59

Trylin 发表于 2022-3-22 14:42
PIC32比较小众,碰到问题都不好找人
(引用自3楼)

确实,不过功能简单还好,资料也算详细。
页: [1]
查看完整版本: 求助~PIC32MK芯片手动复位启动异常