ZHCAEI9 September 2024 MSPM0L1227 , MSPM0L1227-Q1 , MSPM0L1228 , MSPM0L1228-Q1 , MSPM0L2227 , MSPM0L2227-Q1 , MSPM0L2228 , MSPM0L2228-Q1
此示例展示了水表计量中存在的一个问题,即 LFXT 由于湿度而被禁用。LFXT 自动禁用后,会转换为使用 LFOSC 来保持低频时钟以 32kHz 的频率运行。当 LFXTGOOD 位为 true 时,许多用户在转换回 LFXT 时会遇到问题。此示例说明了如何转换回 LFXT。
Code Composer Studio 提供了时钟树选项,可用于配置所需的时钟路径。将 LFXT 设置为 LFCLK 的源,并确保已启用 LFCLK 启动监视器和 LFCLK 监视器。这样就可以监视 LFXT 转换到 LFOSC 失败的情况。将时钟输出设置为所需的引脚以测量频率,从而确保时钟正常工作。将 LFX_Out 接地可以禁用 LFXT,该操作会切换 LED PA 16 以指示 LFXT 发生故障且正在使用 LFOSC。LFOSC 无法自动转换回 LFXT;因此,在将启用 STARTLFXT 位的键设置为 true 的过程中,我们随后会转到 IRQHandler 以将启用 SETUSELFXT 位的键设置为 true 并再次开启时钟监视器。当 LFXT 被清除并且适合再次使用时,这些过程允许从 LFOSC 再次转换回 LFXT。
#include "ti_msp_dl_config.h"
bool clockFailed = false;
static const DL_SYSCTL_LFCLKConfig gLFCLKConfig = {
.lowCap = true,
.monitor = true,
.xt1Drive = DL_SYSCTL_LFXT_DRIVE_STRENGTH_HIGHEST,
};
int main(void)
{
SYSCFG_DL_init();
SYSCTL->SOCLOCK.LFCLKCFG |= SYSCTL_LFCLKCFG_MONITOR_ENABLE; /*enable LFCLK monitor*/
delay_cycles(32000);
DL_SYSCTL_enableSleepOnExit();
NVIC_EnableIRQ(SYSCTL_INT_IRQn);
while (1) {
if(clockFailed == 1){ //it wont hit this line of the code unless you pause the program
SYSCTL->SOCLOCK.LFXTCTL = (SYSCTL_LFXTCTL_KEY_VALUE | SYSCTL_LFXTCTL_STARTLFXT_TRUE); //this starts the STARTLFXT bit
delay_cycles(32000);
clockFailed = false;
}
}
}
void NMI_Handler(void)
{
switch (DL_SYSCTL_getPendingNonMaskableInterrupt()){
case SYSCTL_NMIIIDX_STAT_LFCLKFAIL: /*toggles LED as LFXT failed*/
DL_GPIO_togglePins(GPIO_LEDS_PORT, GPIO_LEDS_User_LED_2_PIN | GPIO_LEDS_USER_LED_1_PIN); /*toggle LED PA16*/
DL_SYSCTL_enableInterrupt(0x10); //enable the bit in the IMASK of LFXTGOOD
clockFailed = true;
break;
default:
break;
}
}
void GROUP0_IRQHandler(void){
volatile uint32_t PendingInterrupt = SYSCTL->SOCLOCK.IIDX;
switch(PendingInterrupt){
case 5:
DL_GPIO_togglePins(GPIO_LEDS_PORT, GPIO_LEDS_User_LED_2_PIN | GPIO_LEDS_USER_LED_1_PIN);
clockFailed = false;
SYSCTL->SOCLOCK.LFXTCTL = (SYSCTL_LFXTCTL_KEY_VALUE | SYSCTL_LFXTCTL_SETUSELFXT_TRUE); //this write the key and set it to use LFXT
SYSCTL->SOCLOCK.LFCLKCFG = SYSCTL->SOCLOCK.LFCLKCFG | SYSCTL_LFCLKCFG_MONITOR_MASK; //this turns on the clock monitor
break;
}
}