【简介】
在之前的贴子中我们已经使用了RTC的计时功能(【S32K146】S32K146片内RTC使用),S32K146的RTC还支持alarm 功能,我们在此基础上继续配置验证RTC的alarm 功能。
【S32DS配置】
使用S32DS 配置RTC 初始时间为2025 1/1 0:0:0

配置alarm 时间为2025 1/1 0:1:0 并开启alarm 中断 并设置中断callback 函数

生成初始化配置代码如下:
/*
 * RTC Initialization configurations
 */
/*! rtc_1InitCfg0 instance initialization configuration */
const rtc_init_config_t rtc_1InitCfg0 = {
  .updateEnable = false,
  .nonSupervisorAccessEnable = false,
  .compensationInterval = 0U,
  .compensation = 0,
  .clockSelect = RTC_CLK_SRC_LPO_1KHZ,
  .clockOutConfig = RTC_CLKOUT_DISABLED
};
/*! rtc_1InitCfg0_StartTime Initial Time and Date */
const rtc_timedate_t rtc_1InitCfg0_StartTime  = {
  .year = 2025U,
  .month = 1U,
  .day = 1U,
  .hour = 0U,
  .minutes = 0U,
  .seconds = 0U
};
/*
 * RTC Register Lock configurations
 */
/*! rtc_1LockCfg0 register lock configuration */
const rtc_register_lock_config_t rtc_1LockCfg0 = {
  .lockRegisterLock = false,
  .statusRegisterLock = false,
  .controlRegisterLock = false,
  .timeCompensationRegisterLock = false
};
/*
 * RTC Alarm configurations
 */
/*! rtc_1AlarmCfg0 alarm configuration */
rtc_alarm_config_t rtc_1AlarmCfg0 = {
  .alarmTime = {
    .year = 2025U,
    .month = 1U,
    .day = 1U,
    .hour = 0U,
    .minutes = 1U,
    .seconds = 0U
  },
  .repeatForever = false,
  .repetitionInterval = 0UL,
  .numberOfRepeats = 0UL,
  .alarmIntEnable = true,
  .callbackParams = NULL,
  .alarmCallback = rtc_alarm_isr_callback
};
/*
 * RTC Time Seconds Interrupt configurations
 */
/*! rtc_1SecIntCfg0 time seconds configuration */
rtc_seconds_int_config_t rtc_1SecIntCfg0 = {
  .secondIntConfig = RTC_INT_1HZ,
  .secondIntEnable = false,
  .secondsCallbackParams = NULL,
  .rtcSecondsCallback = NULL
};
/*
 * RTC Fault interrupt configurations
 */
/*! rtc_1FaultCfg0 fault configuration */
rtc_interrupt_config_t rtc_1FaultCfg0 = {
  .overflowIntEnable = false,
  .timeInvalidIntEnable = false,
  .callbackParams = NULL,
  .rtcCallback = NULL
};【测试验证】
添加如下初始化RTC 并在设置alarm,在alarm 回调中添加打印并打印当前RTC时间
void rtc_alarm_isr_callback(void * callbackParam)
{
    LOG_I("Alarm call back.");
    rtc_timedate_t  currentTime;
    status_t ret;
    ret = RTC_DRV_GetCurrentTimeDate ( RTC_1, ¤tTime );
    if(ret != STATUS_SUCCESS)
    {
        LOG_E("RTC read failed %x.",ret);
    }
    else
    {
        LOG_I("%d:%d:%d %d:%d:%d",currentTime.year,currentTime.month,currentTime.day,
                                  currentTime.hour,currentTime.minutes,currentTime.seconds);
    }
}
static int rtc_init(void)
{
    status_t ret;
    /* Call the init function */
    ret = RTC_DRV_Init(RTC_1, &rtc_1InitCfg0);
    if(ret != STATUS_SUCCESS)
    {
        LOG_E("RTC init failed %x.",ret);
    }
    else
    {
        LOG_I("RTC init OK.");
    }
    /* Set the time and date */
    ret = RTC_DRV_SetTimeDate(RTC_1, &rtc_1InitCfg0_StartTime);
    if(ret != STATUS_SUCCESS)
    {
        LOG_E("RTC set time failed %x.",ret);
    }
    else
    {
        LOG_I("RTC set time OK.");
    }
    /* Start RTC counter */
    ret = RTC_DRV_StartCounter(RTC_1);
    if(ret != STATUS_SUCCESS)
    {
        LOG_E("RTC start failed %x.",ret);
    }
    else
    {
        LOG_I("RTC start OK.");
    }
    /* Start RTC counter */
    ret = RTC_DRV_ConfigureAlarm(RTC_1, &rtc_1AlarmCfg0);
    if(ret != STATUS_SUCCESS)
    {
        LOG_E("RTC start failed %x.",ret);
    }
    else
    {
        LOG_I("RTC start OK.");
    }
    return 1;
}
INIT_BOARD_EXPORT_LEVEL1(rtc_init);下载运行结果如下,跟预期的一致出发了alarm 中断callback 


 
					
				 
						
 
			
			
			
						
			 
					
				 
					
				 
					
				 我要赚赏金
 我要赚赏金 STM32
STM32 MCU
MCU 通讯及无线技术
通讯及无线技术 物联网技术
物联网技术 电子DIY
电子DIY 板卡试用
板卡试用 基础知识
基础知识 软件与操作系统
软件与操作系统 我爱生活
我爱生活 小e食堂
小e食堂

