|
芯片: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 );
- }
复制代码 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|