在玩核板 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);
}
任何人都可以解释为什么它会这样工作?