Other Parts Discussed in Thread: SYSCONFIG,
根据技术资料了解到MSPM0系列的MCU外部晶体失效后无自动切换功能,如果低功耗模式下,RTC及WDT时钟源都是LFCLK,当LFCLK失效后,程序如同死机一般,无法进入RTC周期中断,也无法看门狗超时复位。请问如何写代码实现以下功能:1)、开启LFCLK失效中断、并在外部LFXT失效后切换到LFOSC;2)、开启LFXT恢复GOOD中断,并在中断中及时切换为LFXT。
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
根据技术资料了解到MSPM0系列的MCU外部晶体失效后无自动切换功能,如果低功耗模式下,RTC及WDT时钟源都是LFCLK,当LFCLK失效后,程序如同死机一般,无法进入RTC周期中断,也无法看门狗超时复位。请问如何写代码实现以下功能:1)、开启LFCLK失效中断、并在外部LFXT失效后切换到LFOSC;2)、开启LFXT恢复GOOD中断,并在中断中及时切换为LFXT。
你好,请参考工程师的回复:
目前是没有相关LFCLK Monitor的类似这样的处理的例程,但是有类似
以下是 DriverLibrary 中的代码,您可以使用该流程。这个函数不能直接满足您的需求,但它是一个很好的构建参考。我添加了注释以希望有帮助。void DL_SYSCTL_setLFCLKSourceLFXT(DL_SYSCTL_LFCLKConfig *config)
{
DL_Common_updateReg(&SYSCTL->SOCLOCK.LFCLKCFG,
((uint32_t) config->lowCap << SYSCTL_LFCLKCFG_LOWCAP_OFS) |
((uint32_t) config->monitor << SYSCTL_LFCLKCFG_MONITOR_OFS) |
(uint32_t) config->xt1Drive,
(SYSCTL_LFCLKCFG_XT1DRIVE_MASK | SYSCTL_LFCLKCFG_MONITOR_MASK |
SYSCTL_LFCLKCFG_LOWCAP_MASK));
// start the LFXT oscillator
SYSCTL->SOCLOCK.LFXTCTL =
(SYSCTL_LFXTCTL_KEY_VALUE | SYSCTL_LFXTCTL_STARTLFXT_TRUE);
// wait until LFXT oscillator is stable
// if it does not stabilize, check the hardware/IOMUX settings
//ADD A TIMER OR SYSTICK FOR A TIMEOUT BEFORE THIS STEP
while ((DL_SYSCTL_getClockStatus() & SYSCTL_CLKSTATUS_LFXTGOOD_MASK) !=
DL_SYSCTL_CLK_STATUS_LFXT_GOOD) {
;
}
//IF NO TIMEOUT SET LFCLK, OTHERWISE HANDLE TIMEOUT AND SKIP THIS
// switch LFCLK source from LFOSC to LFXT
SYSCTL->SOCLOCK.LFXTCTL =
(SYSCTL_LFXTCTL_KEY_VALUE | SYSCTL_LFXTCTL_SETUSELFXT_TRUE);
}
在 sysconfig 中确保启用“Enable to use monitor for LFXT, EXLF failure”。
然后你会想要 NVIC_EnableIRQ(SYSCTL_INT_IRQn); 在调用 SYSCFG_DL_init() 之后;
SYSCTL 中断在 GROUP0_IRQHandler 中。

对于ISR你会想要类似这样的:
//Setup LFCLK_Fail Interrupt
void GROUP0_IRQHandler(void)
{
//checks pending in the SYSCTRL interrupt register
switch(DL_SYSCTL_getPendingInterrupt(DL_SYSCTL_IIDX)){
case DL_SYSCTL_IIDX_LFCLK_FAIL: //We want to check if the LFCLK failed
/* The below function will reset the device, the parameter can be changed to
change the level of a reset, I suggest doing CTRL+Left Click to go into
the header file and see all the reset options*/
DL_SYSCTL_resetDevice(DL_SYSCTL_RESET_BOOT);
break;
default:
break;
}
}
我注意到 SYSCTL 中断屏蔽没有正确设置,我将检查原因
的确是这样,这与量产芯片有些差异,工程师正在等待确认这些差异,并且可能需要改变配置方式。
You're correct there is no parameter for the getPendingInterrupt function, I had accidently kept that when testing. I have found a difference between this and the production silicon so I am awaiting confirmation on the change. Based on this change we may need to find a different avenue.
对于量产版本的MSPM0G3507芯片来说,LFCLK_FAIL 在 NMI中(正如您的FAE朋友所说),所以它现在在DL_SYSCTL_NMI_IIDX.
下面这段代码你可以试一下:
void NMI_Handler(void)
{
switch(DL_SYSCTL_getPendingNonMaskableInterrupt()){
case DL_SYSCTL_NMI_IIDX_LFCLK_FAIL:
//__BKPT();
default:
break;
}
}
这是量产芯片的新改动。