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。
目前内测样片也就是pre-production版本的板子只有一种方法换回使用LFOSC就是通过BOOTRST。
如果能接受这种方式的话可以给你一个简单参考。
你好,工程师推荐使用LFCLK Monitor,相关细节在TRM中有描述。
你需要在连接之前检查LFXT的状态是否良好。你是否在连接之前检查了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; } }
这是量产芯片的新改动。