本帖最后由 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 );
}
|