0

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;
4

0 回答 0