工具/软件:
您好、
我的系统最初使用 25MHz 外部时钟、并且 PLL 配置为生成 200MHz PLLSYSCLK。
现在、当我切断外部时钟时、DCC 检测到时钟故障、然后系统会将时钟源切换到 INTOSC1 并重新配置 PLL、以使 PLLSYSCLK 保持在 200MHz。
但是,当我调用SysCtl_setClock()更新时钟设置时,函数返回false。 检查 sysctl_setclock() 后、我发现它在等待 PLL 锁定时超时、并且在SysCtl_isPLLValid()检查过程中出现故障。
检测到时钟故障后更新时钟设置的过程如下:
- 将振荡器源配置为 INTOSC1
- 周期的单个 OSCCLK 周期
- 关闭 PLL
- PLL 断电后需要至少 66 个 OSCCLK 周期的延迟
- 重置 MCD
- 调用 SysCtl_setClock (DEVICE_setclock_INTOSC)
DEVICE_setclock_INTOSC 的定义:
#define DEVICE_SETCLOCK_INTOSC (SYSCTL_OSCSRC_OSC1 | SYSCTL_IMULT(80) | \ SYSCTL_REFDIV(2) | SYSCTL_ODIV(2) | \ SYSCTL_SYSDIV(1) | SYSCTL_PLL_ENABLE | SYSCTL_DCC_BASE_1 )
是否缺少任何会导致 PLL 锁定超时和 PLL 有效失败的程序?
以下是检测到时钟故障后的代码:
//
// Wait till the ISR is hit on clock failure
//
while(isr_enter != 0x1U);
//
// Configure oscillator source to INTOSC1
//
SysCtl_selectOscSource(SYSCTL_OSCSRC_OSC1);
//
// Delay of at least 60 OSCCLK cycles
//
SysCtl_delay(11U);
//
// Turn off PLL
//
EALLOW;
HWREGH(CLKCFG_BASE + SYSCTL_O_SYSPLLCTL1) &=
~SYSCTL_SYSPLLCTL1_PLLEN;
EDIS;
//
// Delay of at least 66 OSCCLK cycles required post
// powerdown of PLL
//
SysCtl_delay(12U);
//
// Set up PLL control and clock dividers
//
SysCtl_resetMCD();
SysCtl_setClockTest(DEVICE_SETCLOCK_INTOSC);