您好、香榭丽舍
我的客户正在使用 F28035设计数字电源产品。 现在、他们发现 MCU 会因外部 干扰而复位。 他们发现 PLL 会因干扰而损坏、看起来发生了 CLOCKFAIL。
XTAL 时钟为20MHz、CPU 时钟设置为60MHz、而 XCLKOUT 用于监控 SYSCLKOUT。
时钟初始化代码如下所示。
空 InitSysCtrl (空)
{
DisableDog ();
EALLOW;
SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1; // 启用 ADC 外设 时钟
(*Device_cal)();
SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 0; // 将 ADC 时钟返回 到原始 状态
EDIS;
XTALOscSel();
InitPll (6.2);//(OSCCLK * 6)/2=20M*6/2=60M
InitPeripheralClocks();
}
空 XTALOscSel (空) {
EALLOW;
SysCtrlRegs.CLKCTL.bit.XTALOSCOFF = 0; // 打开 XTALOSC
SysCtrlRegs.CLKCTL.bit.XCLKINOFF = 1; // 关闭 XCLKIN
SysCtrlRegs.CLKCTL.bit.OSCCLKSRC2SEL = 0; // 切换到 外部 时钟
SysCtrlRegs.CLKCTL.bit.OSCCLKSRCSEL = 1; // 从 INTOSC1切换到 INTOSC2/ext clk
SysCtrlRegs.CLKCTL.bit.WDCLKSRCSEL = 1; // 将 看门狗 时钟 源切换 为 外部 时钟
SysCtrlRegs.CLKCTL.bit.INTOSC2OFF = 1; // 关闭 INTOSC2
SysCtrlRegs.CLKCTL.bit.INTOSC1OFF = 1; // 关闭 INTOSC1
EDIS;
}
空 InitPll (uint16 val、uint16 divsel)
{
易失性 uint16 iVol;
//确保 PLL 没有在跛形模式下运行
if (SysCtrlRegs.PLLSTS.bit.MCLKSTS!= 0)
{
EALLOW;
//检测到 OSCCLKSRC1故障。 PLL 以跛形模式运行。
//重新启用缺少的时钟逻辑。
SysCtrlRegs.PLLSTS.bit.MCLKCLR = 1;
EDIS;
//将此行替换为对相应行的调用
// SystemShutdown();函数。
_asm (" ESTOP0"); //出于调试目的取消注释 卡死在这个位置了!!!!!
}
…
}
看门狗代码:
SysCtrlRegs.WDCR = 0x002A;
WDCLK = OSCCLK/512/2=20M/512/2=19.531kHz=51.2us;
看门狗溢出时间=51.2us*256=13.1ms
如果发生 CLOCKFAIL、NMIWD 将复位器件。 在该代码中、它们设置 NMICFG[CLOCKFAIL]和 NMIWDPRD、NMIRESETSEL = 1。 您可以按如下所示找到示波器捕获。 蓝色波形为 PWM 输出、黄色波形为 XCLKOUT。
1。NMIRESETSEL = 1,NMIWDPRD=3000。 发生 CLOCKFAIL 时、PWM 频率从100KHz 更改为33KHz、XCLKOUT 从60MHz 更改为20MHz、时间约为150us。
复位后、SYSCLKOUT 为60MHz、持续50us。
之后、 NMIRESETSEL = 1,NMIWDPRD=6000、
您是否愿意帮助分析发生此故障的原因? 复位后、为什么 SYSCLKOUT 从60MHz 变为20MHz? 谢谢。
BR、
年轻。