Tick

该示例通过使用 RTC 外设实现 TICK 定时功能。

每经过 TICK 定时就会进入触发 RTC 中断,并打印相关 log 信息。

环境需求

该示例的环境需求,可参考 环境需求

配置选项

  1. 可配置如下宏修改 RTC 预分频值。

    #define RTC_PRESCALER_VALUE     (3200-1)                /*< Set this macro to modify the RTC Prescale value. RTC_CLK = 32k / 3200 = 10Hz. */
    

编译和下载

该示例的编译和下载流程,可参考 编译和下载

测试验证

  1. TICK 时间到后(0.1秒),触发 RTC 中断,打印中断信息。

    RTC_Handler: RTC_INT_TICK
    

代码介绍

该章节主要介绍示例中的初始化和相应功能实现的代码和流程说明。

源码路径

工程文件和源码路径如下:

  • 工程路径: sdk\samples\peripheral\rtc\tick\proj

  • 源码路径: sdk\samples\peripheral\rtc\tick\src

初始化

RTC 初始化的流程如图所示:

../../../../../../_images/rtc_tick_init_flow.png

RTC 初始化流程

  1. 调用 RTC_DeInit() ,复位 RTC 外设。

  2. 调用 RTC_SetPrescaler(), 设置 RTC 预分频系数。

  3. 调用 RTC_INTConfig(),使能 RTC TICK 中断,调用 RTC_NvCmd(),使能 RTC 中断功能。NVIC 相关配置可参考 中断配置

  4. 调用 RTC_ResetCounter() 复位 RTC 计数器,调用 RTC_Cmd() 使能 RTC 外设。

void driver_rtc_init(void)
{
    RTC_DeInit();
    RTC_SetPrescaler(RTC_PRESCALER_VALUE);

    RTC_INTConfig(RTC_INT_TICK, ENABLE);

    /* Config RTC interrupt */
    NVIC_InitTypeDef NVIC_InitStruct;
    NVIC_InitStruct.NVIC_IRQChannel = RTC_IRQn;
    NVIC_InitStruct.NVIC_IRQChannelPriority = 2;
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStruct);

    RTC_NvCmd(ENABLE);

    /* Start RTC */
    RTC_ResetCounter();
    RTC_Cmd(ENABLE);
}

功能实现

  1. 每经过 TICK 设定时间,都会触发 RTC 中断,在中断处理函数内打印相关状态,并清除中断标志位。

    void RTC_Handler(void)
    {
        /* RTC tick interrupt handle */
        if (RTC_GetINTStatus(RTC_INT_TICK) == SET)
        {
            DBG_DIRECT("RTC_Handler: RTC_INT_TICK");
            // Add application code here
            RTC_ClearTickINT();
        }
    }