1

在玩核板 g070 时,我试图用 RTC 的唤醒计时器每秒设置一次中断。但是我在CubeMX生成的头文件(stm32g0xx.h)中没有找到对应的中断。我试图只使用 LL,因为我想了解如何在较低级别处理中断。我按如下方式设置 RTC:

  LL_RTC_InitTypeDef RTC_InitStruct = {0};

  /* Peripheral clock enable */
  LL_RCC_EnableRTC();
  LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_RTC);

  RTC_InitStruct.HourFormat = LL_RTC_HOURFORMAT_24HOUR;
  RTC_InitStruct.AsynchPrescaler = 127;
  RTC_InitStruct.SynchPrescaler = 255;
  LL_RTC_Init(RTC, &RTC_InitStruct);

  // Auto-wakeup interrupt configuration
  LL_RTC_DisableWriteProtection(RTC);
  LL_RTC_WAKEUP_Disable(RTC);
  while (LL_RTC_IsActiveFlag_WUTW(RTC) != 1);
  // Configure second wakeup timer
  LL_RTC_WAKEUP_SetAutoReload(RTC, 0x8000);
  LL_RTC_WAKEUP_SetClock(RTC, LL_RTC_WAKEUPCLOCK_CKSPRE);
  LL_RTC_EnableIT_WUT(RTC);
  LL_RTC_WAKEUP_Enable(RTC);
  LL_RTC_SetAlarmOutEvent(RTC, LL_RTC_ALARMOUT_WAKEUP);
  LL_RTC_EnableWriteProtection(RTC);

然后我尝试设置 NVIC,但在 IRQn_Type 枚举中找不到相应的 IRQ。

NVIC_SetPriority(?, 1);
NVIC_EnableIRQ(?);

更新:

似乎 RTC_TAMP_IRQHandler 兼作唤醒中断(??)。将唤醒时钟设置为 LL_RTC_WAKEUPCLOCK_CKSPRE(或 LL_RTC_WAKEUPCLOCK_CKSPRE_WUT)似乎不起作用,但如果我使用 LL_RTC_WAKEUPCLOCK_DIV_16,则会发生中断。要重置中断,我只需清除唤醒中断标志(??)

void RTC_TAMP_IRQHandler(void)
{
  LL_RTC_ClearFlag_WUT(RTC);
  LL_GPIO_TogglePin(LED_GREEN_GPIO_Port, LED_GREEN_Pin);
}

任何人都可以解释为什么它会这样工作?

4

0 回答 0