Comparator

该示例通过使用 RTC 比较器实现定时功能。

当 RTC 定时时间到,会触发 RTC 对应通道的比较器中断。

用户可以通过不同的宏配置改变示例中 RTC 通道设置,定时时间等信息,具体宏配置详见 配置选项

环境需求

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

配置选项

  1. 可配置如下宏修改 RTC 预分频值与比较器的值。

    #define RTC_PRESCALER_VALUE     (3200-1)                /*< Set this macro to modify the RTC Prescale value. RTC_CLK = 32k / 3200 = 10Hz. */
    #define RTC_COMP_VALUE          (10)                    /*< Set this macro to modify the RTC Comparator value. Time = 10 / RTC_CLK. */
    
  2. 可配置如下宏修改 RTC 通道设置。

    #define RTC_COMP_INDEX          RTC_COMP1
    #define RTC_COMP_INDEX_INT      RTC_INT_COMP1
    

编译和下载

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

测试验证

  1. 比较器设定时间(1s)到,触发中断,打印中断信息,每次计数值 +10。

    RTC_Handler: RTC_COMP_INDEX1
    RTC_Handler: RTC counter current value = 10
    RTC_Handler: RTC_COMP_INDEX1
    RTC_Handler: RTC counter current value = 20
    ...
    

代码介绍

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

源码路径

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

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

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

初始化

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

../../../../../../_images/rtc_comparator_init_flow.png

RTC 初始化流程

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

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

  3. 调用 RTC_INTConfig(),使能 RTC 比较器通道 1 计数中断,调用 RTC_NvCmd(),使能 RTC 中断功能。NVIC 相关配置可参考 中断配置

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

    void driver_rtc_init(void)
    {
        RTC_DeInit();
    
        RTC_SetPrescaler(RTC_PRESCALER_VALUE);
        RTC_SetCompValue(RTC_COMP_INDEX, RTC_COMP_VALUE);
    
        RTC_INTConfig(RTC_COMP_INDEX_INT, ENABLE);
    
        /* Config RTC interrupt */
        NVIC_InitTypeDef NVIC_InitStruct;
        NVIC_InitStruct.NVIC_IRQChannel = RTC_IRQn;
        NVIC_InitStruct.NVIC_IRQChannelPriority = 3;
        NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStruct);
    
        RTC_NvCmd(ENABLE);
        /* Start RTC */
        RTC_ResetCounter();
        RTC_Cmd(ENABLE);
    }
    

功能实现

  1. 比较器设定时间(0.1s*10 = 1s)到,触发 RTC 中断,进入中断处理函数 RTC_Handler

    1. 打印中断信息和比较值信息。

    2. 重新设置比较值。

    3. 清除比较器通道 1 计数中断。

    DBG_DIRECT("RTC_Handler: RTC_COMP_INDEX%d", RTC_COMP_INDEX);
    DBG_DIRECT("RTC_Handler: RTC counter current value = %d", RTC_GetCounter());
    RTC_SetCompValue(RTC_COMP_INDEX, RTC_GetCounter() + RTC_COMP_VALUE);
    RTC_ClearCompINT(RTC_COMP_INDEX);