У меня работает прерывание от RTC чтоб пробуждать из спящего
режима.
Взял за основу код из примера, но у меня он работает от встроенного генератора на 40 кГц
Вот код инициализации, ещё код для контроллера прерываний и само прерывание:
void RTC_Init(void) { RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); PWR_BackupAccessCmd(ENABLE); /* Is it the first configuration */ BKP_DeInit(); RCC_LSICmd(ENABLE); RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI); RCC_RTCCLKCmd(ENABLE); RTC_WaitForLastTask(); RTC_WaitForSynchro(); RTC_ITConfig(RTC_IT_SEC, ENABLE); RTC_WaitForLastTask(); RTC_EnterConfigMode(); RTC_SetPrescaler(800); // 20 msec RTC_WaitForLastTask(); RTC_SetCounter(0); RTC_WaitForLastTask(); RTC_ExitConfigMode(); BKP_WriteBackupRegister(BKP_DR1, 0XA1A1); RTC_NVIC_Config(); }
static void RTC_NVIC_Config(void) { NVIC_InitTypeDef NVIC_InitStructure = {0}; NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); }
void RTC_IRQHandler(void) { uint16_t port; port = (uint16_t)(GPIOA->INDR); port ^= 0x00FC; GPIOA->OUTDR = port; RTC_ClearITPendingBit(RTC_IT_SEC|RTC_IT_OW); RTC_WaitForLastTask(); }