ZHCAEI9 September   2024 MSPM0L1227 , MSPM0L1227-Q1 , MSPM0L1228 , MSPM0L1228-Q1 , MSPM0L2227 , MSPM0L2227-Q1 , MSPM0L2228 , MSPM0L2228-Q1

 

  1.   1
  2.   摘要
  3.   商标
  4. 1引言
  5. 2低频子系统简介
    1. 2.1 使用 VBAT 对 LFSS IP 进行复位
    2. 2.2 电源域电源检测
      1. 2.2.1 启动序列
      2. 2.2.2 LFSS IP 行为
    3. 2.3 LFXT、LFOSC
    4. 2.4 独立看门狗计时器 (IWDT)
    5. 2.5 防篡改 I/O
      1. 2.5.1 IOMUX 模式
      2. 2.5.2 防篡改模式
        1. 2.5.2.1 篡改事件检测
        2. 2.5.2.2 时间戳事件输出
        3. 2.5.2.3 检测信号发生器
    6. 2.6 便笺式存储器 (SPM)
    7. 2.7 实时时钟 (RTC)
    8. 2.8 VBAT 充电模式
  6. 3应用示例
    1. 3.1 防篡改 I/O 检测信号示例
    2. 3.2 RTC 防篡改 I/O 时间戳事件示例
    3. 3.3 超级电容器充电示例
    4. 3.4 LFOSC 转换回 LFXT 的示例
    5. 3.5 RTC_A 校准
      1. 3.5.1 外设 ADC 12
      2. 3.5.2 RTC_A

LFOSC 转换回 LFXT 的示例

此示例展示了水表计量中存在的一个问题,即 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;
  }
}