打印
[PIC®/AVR®/dsPIC®产品]

求助~PIC32MK复位异常

[复制链接]
1280|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lss1330|  楼主 | 2021-11-3 11:15 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 lss1330 于 2021-11-4 22:01 编辑

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

2021-11-4补充编辑
背景补充
晶振:无源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 );
}






使用特权

评论回复
沙发
chenjun89| | 2021-11-3 19:19 | 只看该作者
把图纸贴上来看看

使用特权

评论回复
板凳
lss1330|  楼主 | 2021-11-4 09:55 | 只看该作者

这个是MCU复位部分的原理图。
目前发现应该是和SPLL有关系,如果不启动SPLL是可以正常复位。

使用特权

评论回复
地板
lss1330|  楼主 | 2021-11-4 09:56 | 只看该作者
chenjun89 发表于 2021-11-3 19:19
把图纸贴上来看看

贴在楼下了,麻烦帮忙看看

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

11

帖子

0

粉丝