Skocz do zawartości

[C] Nucleo F303K8 i niedziałający wakeup z RTC.


Pomocna odpowiedź

Napisano

Hej Panowie!

Posiadam od niedawna płytkę Nucleo F303K8 z mikrokontrolerem STM32F303K8T6. Zabrałem się ostatnio za naukę wbudowanego RTC, ale nie mogę sprawić, żeby przerwanie od wybudzenia zaczęło działać.

Wydaje mi się, że wszystko jest skonfigurowane(zewnętrzne przerwania EXTI, NVIC oraz sam RTC), jednak do wywołania funkcji obsługo przerwania nie dochodzi(dioda się nie zapala). Co ciekawe, przykład jest przepisany na mur beton z std periph, jednak niestety nie bangla. Załączam pliki źródłowe projektu do posta.

Czy moglibyście mi pomóc i rzucić na to okiem?

Pozdrawiam,
szymam

src_rtc.tar.gz

Protip: jak chcesz pomocy to nie utrudniaj życia potencjalnym chętnym do pomocy

Jasne, słuszna uwaga. Zarzucam konfigurację poszczególnych elementów:

void rtc_config(RTC_InitTypeDef RTCINIT_STRUCT){
//zegar pwr
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);

//dostep do backup rejestrow rtc
PWR_BackupAccessCmd(ENABLE);

//wlaczenie wewnetrznego oscylatora
RCC_LSICmd(ENABLE); //czekaj, az bedzie gotow
while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET){};

//ustawienie zrodla dla zegara RTC
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);

//start i synchronizacja zegara RTC
RCC_RTCCLKCmd(ENABLE);
RTC_WaitForSynchro();

RTCINIT_STRUCT.RTC_AsynchPrediv = 88;
RTCINIT_STRUCT.RTC_SynchPrediv = 470; /* (42KHz / 89) - 1 = 470 */
RTCINIT_STRUCT.RTC_HourFormat = RTC_HourFormat_24;
RTC_Init(&RTCINIT_STRUCT);
}

void interrupt_config(NVIC_InitTypeDef NVIC_STRUCT, EXTI_InitTypeDef EXTI_STRUCT){
EXTI_ClearITPendingBit(EXTI_Line20);
EXTI_STRUCT.EXTI_Line = EXTI_Line20;
EXTI_STRUCT.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_STRUCT.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_STRUCT.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_STRUCT);

NVIC_STRUCT.NVIC_IRQChannel = RTC_WKUP_IRQn;
NVIC_STRUCT.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_STRUCT.NVIC_IRQChannelSubPriority = 0;
NVIC_STRUCT.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_STRUCT);

/* Configure the RTC WakeUp Clock source: CK_SPRE (1Hz) */
RTC_WakeUpClockConfig(RTC_WakeUpClock_CK_SPRE_16bits);
RTC_SetWakeUpCounter(0x0);

/* Enable the RTC Wakeup Interrupt */
RTC_ITConfig(RTC_IT_WUT, ENABLE);

/* Enable Wakeup Counter */
RTC_WakeUpCmd(ENABLE);
}

void gpio_config(GPIO_InitTypeDef GPIO_STRUCT){
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);

GPIO_StructInit(&GPIO_STRUCT);  // domyślna konfiguracja
GPIO_STRUCT.GPIO_Pin = GPIO_Pin_5;  // konfigurujemy pin 5
GPIO_STRUCT.GPIO_Mode = GPIO_Mode_OUT;
GPIO_STRUCT.GPIO_OType = GPIO_OType_PP;// jako wyjście
GPIO_Init(GPIOA, &GPIO_STRUCT);  // inicjalizacja modułu GPIOA
}

void RTC_WKUP_IRQHandler(void){
if(RTC_GetITStatus(RTC_IT_WUT) != RESET){
	/* Toggle on LED1 */
	GPIO_SetBits(GPIOA, GPIO_Pin_5);
	RTC_ClearITPendingBit(RTC_IT_WUT);
	EXTI_ClearITPendingBit(EXTI_Line20);
}
}

Wywołuję to w kolejności jak są zdefiniowane. Oczywiście oprócz funkcji obsługi przerwania.

Ja sam RTC nie używałem, ale uwaga do

przepisany na mur beton z std periph

Przepisane czy skopiowane? Różnie z tym przepisywaniem bywa 😉

Przykład jak rozumiem był konkretnie pod ten mikrokontroler?

Ja sam RTC nie używałem, ale uwaga do
przepisany na mur beton z std periph

Przepisane czy skopiowane? Różnie z tym przepisywaniem bywa 😉

Przykład jak rozumiem był konkretnie pod ten mikrokontroler?

Przekopiowane. Tak, stałe i inne przepisywałem z kodu std periph.

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...