Skocz do zawartości

STM32 - NUCLEO F411RE - konfiguracja przerwania zewnętrznego EXTI


juras

Pomocna odpowiedź

Witam Forumowiczów!

Postanowiłem w wolnym czasie przerobić kurs STM32. Korzystałem ze wskazówek kursu na stronie Forbota i natknąłem się na pewien problem, gdy chciałem skonfigurować przerwanie zewnętrzne. Aby uruchomić moduł wejść alternatywnych, należy użyć "RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);". Kurs był pisany pod NUCLEO--F103RB, ja posiadam NUCLEO-F411RE, więc przejrzałem kartę katalogowa, i doczytałem się, że EXTI znajduje się również na szynie APB2, jednak program nie widzi argumentu "RCC_APB2Periph_AFIO". Gdy przeglądałem zawartość biblioteki, nie znalazłem niczego, co mówiłoby jak uruchomić ten moduł. W karcie katalogowej są podane graniczne rejestry tego modułu, ale szczerze mówiąc nie wiem jak na podstawie tego mógłbym to skonfigurować. Dlatego mam pytanie, jak skonfigurować to za pomocą rejestrów, lub za pomocą której komendy z biblioteki (być może czegoś nie dopatrzyłem)? Podsyłam jeszcze link do karty katalogowej, z której korzystałem. Z góry dziękuję za odpowiedź i pozdrawiam.

datasheet

Zapomniałem dodać, że piszę w OpenStm32 i korzystam z bibliotek StdPeriph_Driver, czyli ze standardowych.

Link do komentarza
Share on other sites

Ja korzystam z STM32F4 - discovery i dla tego procka wygląda to tak:

//RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); - dla STM32F4 wygląda tak:
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);

i niżej:

    //GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource13); - dla STM32F4 wygląda tak:
   SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0);

Może ci to pomoże.

  • Pomogłeś! 1
Link do komentarza
Share on other sites

O! Widzę, że chłopaki poradziliście sobie z przejściem przerwania zewnętrznego na F4. Pomożecie? Co robię źle, że nie działa ono jak powinno?

#include "stm32f4xx.h"
//#include "stm32f4xx_exti.h"
//#include "stm32f4xx_syscfg.h"
//#include "misc.h"

void Configure_LED(){
/*Set variables used*/
GPIO_InitTypeDef gpio;
/*Enable clock for GPIOA*/
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
/*Set pin as output*/
GPIO_StructInit(&gpio);
gpio.GPIO_Pin = GPIO_Pin_5;
gpio.GPIO_Mode = GPIO_Mode_OUT;
gpio.GPIO_OType = GPIO_OType_PP;
GPIO_Init(GPIOA, &gpio);
}

void Configure_PC13(void) {
   /* Set variables used */
   GPIO_InitTypeDef GPIO_InitStruct;
   EXTI_InitTypeDef EXTI_InitStruct;
   NVIC_InitTypeDef NVIC_InitStruct;
   /* Enable clock for GPIOC */
   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
   /* Enable clock for SYSCFG */
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
   /* Set pin as input */
   GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;
   GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
   GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13;
   GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
   GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
   GPIO_Init(GPIOC, &GPIO_InitStruct);

   /* Tell system that you will use PC13 for EXTI_Line13 */
   SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC, EXTI_PinSource13);

   /* PC13 is connected to EXTI_Line13 */
   EXTI_InitStruct.EXTI_Line = EXTI_Line13;
   /* Enable interrupt */
   EXTI_InitStruct.EXTI_LineCmd = ENABLE;
   /* Interrupt mode */
   EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
   /* Triggers on rising and falling edge */
   EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
   /* Add to EXTI */
   EXTI_Init(&EXTI_InitStruct);

   /* Add IRQ vector to NVIC */
   /* PC13 is connected to EXTI_Line13, which has EXTI15_10_IRQn vector */
   NVIC_InitStruct.NVIC_IRQChannel = EXTI15_10_IRQn;
   /* Set priority */
   NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x00;
   /* Set sub priority */
   NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x01;
   /* Enable interrupt */
   NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
   /* Add to NVIC */
   NVIC_Init(&NVIC_InitStruct);
}
/* Set interrupt handlers */
/* Handle PC13 interrupt */
void EXTI15_10_IRQHandler(void) {
   /* Make sure that interrupt flag is set */
   if (EXTI_GetITStatus(EXTI_Line13) != RESET) {
       /* Do your stuff when PC13 is changed */
   	GPIO_ResetBits(GPIOA, GPIO_Pin_5); // turn LED off
       /* Clear interrupt flag */
       EXTI_ClearITPendingBit(EXTI_Line13);
   }
}

int main(void) {
   /* System init */
   SystemInit();
   /*Configure LED on PA5*/
   Configure_LED();
   /* Configure PC13 as interrupt */
   Configure_PC13();
   GPIO_SetBits(GPIOA, GPIO_Pin_5); // turn LED on

   while (1) {
   }
}
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Witam,
używam płytki F446RE i mój problem polega na tym, że gdy naciskam przycisk żeby uruchomić przerwanie, diody przestają się zapalać, tak jakby cały program się zawiesił. Jest ktoś z was w stanie wyłapać błąd? Z góry dziękuję za odpowiedź.

#include "stm32f4xx.h"

volatile uint32_t timer_ms = 0;

void SysTick_Handler()
{
if(timer_ms)
{
	timer_ms--;
}
}

void delay_ms(int time)
{
timer_ms = time;
while(timer_ms > 0) {};
}

void EXTI15_10_IRQHandler()
{
   if (EXTI_GetITStatus(EXTI_Line13)) {
       if (GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13) == 0) {
           GPIO_SetBits(GPIOA, GPIO_Pin_5);
       } else {
           GPIO_ResetBits(GPIOA, GPIO_Pin_5);
       }

       EXTI_ClearITPendingBit(EXTI_Line13);
   }
}

int main(void)
{
   GPIO_InitTypeDef gpio; // obiekt gpio z konfiguracja portow GPIO
   EXTI_InitTypeDef exti;
   NVIC_InitTypeDef nvic;

   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD, ENABLE); // uruchomienie zegara modulu GPIO
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
   SysTick_Config(SystemCoreClock / 1000);

   GPIO_StructInit(&gpio);

   gpio.GPIO_Pin = GPIO_Pin_5;
   gpio.GPIO_Mode = GPIO_Mode_OUT;
   gpio.GPIO_OType = GPIO_OType_PP;
   GPIO_Init(GPIOA, &gpio);

   gpio.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;
   gpio.GPIO_Mode = GPIO_Mode_OUT; // jako wyjscie
   gpio.GPIO_OType = GPIO_OType_PP;
   GPIO_Init(GPIOC, &gpio);

   gpio.GPIO_Pin = GPIO_Pin_13; //przycisk
   gpio.GPIO_Mode = GPIO_Mode_IN;
   gpio.GPIO_OType = GPIO_OType_PP;   // Push/Pull
   gpio.GPIO_PuPd = GPIO_PuPd_UP;   // Włączamy rezystory
   GPIO_Init(GPIOC, &gpio);

   SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC, EXTI_PinSource13);

   EXTI_StructInit(&exti);
   exti.EXTI_Line = EXTI_Line13;
   exti.EXTI_Mode = EXTI_Mode_Interrupt;
   exti.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
   exti.EXTI_LineCmd = ENABLE;
   EXTI_Init(&exti);

   nvic.NVIC_IRQChannel = EXTI15_10_IRQn;
   nvic.NVIC_IRQChannelPreemptionPriority = 0x00;
   nvic.NVIC_IRQChannelSubPriority = 0x00;
   nvic.NVIC_IRQChannelCmd = ENABLE;
   NVIC_Init(&nvic);

   uint32_t led = 0;
   while (1)
   {
       GPIO_SetBits(GPIOC, 1 << led); //włącz diode
       delay_ms(150); // poczekaj
       GPIO_ResetBits(GPIOC, 1 << led); //wyłącz diode
       if (++led >= 10)
       { // przejdz do nastepnej
           led = 0;
       }
   }
}
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.