嵌入式c - 实时时钟 - 计数器控制寄存器

时间:2016-11-10 17:26:12

标签: c cpu-registers real-time-clock

在下面的rtc_callback()中,RTC[QM_RTC_0].rtc_ccr |= RTC_CCR_INTERRUPT_ENABLE;行上发生了什么?

我也在下面列出了寄存器地图。

在RTC中什么是计数器控制寄存器?为什么要“或”中断使能?或者这甚至发生了什么?

define BIT(x) (1U << (x))
#define RTC_CCR_INTERRUPT_ENABLE BIT(0)

//==========================================================================

void rtc_callback(void *data) {

  // Bump the time count onwards
  rtc_set_alarm(QM_RTC_0, (RTC[QM_RTC_0].rtc_ccvr + ALARM));

  RTC[QM_RTC_0].rtc_ccr |= RTC_CCR_INTERRUPT_ENABLE;
}


//==========================================================================


int rtc_init(void (*cb)(void *)) {

  rtc_config_t cfg;

  cfg.init_val = 0;
  cfg.alarm_en = true;
  cfg.alarm_val = ALARM;

  cfg.callback = rtc_callback;
  cfg.callback_data = NULL;
  global_rtc_cb = cb;

  irq_request(IRQ_RTC_0, rtc_isr_0);
  clk_periph_enable(CLK_PERIPH_RTC_REGISTER | CLK_PERIPH_CLK);
  rtc_set_config(RTC_0, &cfg);

  return 0;
}

/** RTC register map. */
typedef struct {
    RW uint32_t rtc_ccvr;    /**< Current Counter Value Register */
    RW uint32_t rtc_cmr;         /**< Current Match Register */
    RW uint32_t rtc_clr;         /**< Counter Load Register */
    RW uint32_t rtc_ccr;         /**< Counter Control Register */
    RW uint32_t rtc_stat;    /**< Interrupt Status Register */
    RW uint32_t rtc_rstat;  /**< Interrupt Raw Status Register */
    RW uint32_t rtc_eoi;         /**< End of Interrupt Register */
    RW uint32_t rtc_comp_version; /**< End of Interrupt Register */
} rtc_reg_t;

0 个答案:

没有答案