Elektroda.pl
Elektroda.pl
X
Computer Controls
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[STM32 Cortex-M3] Konfiguracja przerwań

10 Mar 2011 19:34 2887 4
  • Poziom 9  
    Witam,

    Jestem poczatkujacy jesli chodzi o programowanie pod architekture Cortex. Posiadam zestaw ewaluacyjny STM32 Butterfly. Probuje skonfigurowac przerwanie, aby wykonało się po naciśnięciu przycisku. Debugujac program widac, ze po nacisnieciu przycisku flagi sa ustawiane, ale funkcja obslugujaca przerwanie nie jest wywolywana.

    tak wyglada moj kod konfigurujacy przerwanie:

    Code:
      NVIC_InitTypeDef NVIC_InitStructure;
    
      // Wlacz przerwanie
      NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;
      NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
      NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
      NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
      NVIC_Init(&NVIC_InitStructure);

      GPIO_InitTypeDef GPIO_InitStructure;
      //konfiguracja GPIOE jako wejscie plywajace
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
      GPIO_Init(GPIOE, &GPIO_InitStructure);

      GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource8);

      EXTI_InitStruct.EXTI_Line = EXTI_Line8;
      EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
      EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling;
      EXTI_InitStruct.EXTI_LineCmd = ENABLE;
      EXTI_Init(&EXTI_InitStruct);



    a tak funkcja w pliku stm32f10x_it.c

    Code:
    void EXTI9_5_IRQHandler(void)
    
    {
      if (EXTI_GetITStatus(EXTI_Line8) != RESET)
      {
        GPIO_WriteBit(GPIOE, GPIO_Pin_8, (BitAction)((1 - GPIO_ReadOutputDataBit(GPIOE, GPIO_Pin_8))));

        // czyszczenie flagi przerwania
        EXTI_ClearITPendingBit(EXTI_Line8);

      }
    }


    Co moze powodowac, ze funkcja nie jest wykonywana po wykryciu przerwania? Czy moze je niepoprawnie skonfigurowalem?
  • Computer Controls
  • Poziom 30  
    Na początku upewnij się, że włączyłeś zegary we wszystkich wymaganych urządzeniach (albo załącz na forum cały program). Możesz też wymusić obsługę przerwania zewnętrznego używając funkcji bibliotecznej "EXTI_GenerateSWInterrupt".
    A poza tym proponuję zacząć od migania diodką a później napisz taki prosty program starając się powoli zastępować funkcje biblioteczne ST własną konfiguracją rejestrów (wykorzystaj tylko pliki nagłówkowe i definicyjne). W ten sposób poznasz bardzo szybko procesor.
  • Computer Controls
  • Poziom 9  
    Dzieki, za szybka odpowiedz. W zalaczniku wysylam plik main.c oraz stm32f10x_it.c
    Jak narazie probuje wykonywac przyklady z ksiazki STM32 Mikrokontrolery w praktyce. Jesli ktos bedzie mogl zerknac na kod i powiedziec co jest nie tak to bede wdzieczny

    Czyli nie polecacie uzywanie bibliotek ST?
  • Poziom 30  
    Zacznij od migania diodką !
    Przesyłam Ci kilka działających przykładów związanych z GPIO, EXTI i timerem "systemowym". Biblioteki ST są dobre na starcie, ale kod, który się generuje na podstawie tych bibliotek jest 2 razy większy (w porywach) od tego napisanego "ręcznie". Natomiast nie polecam całkowitego "odcinania" się od nagłówków (*.h) napisanych przez ST. Ja utworzyłem sobie bibliotekę (*.lib) z tego co zrobiło ST i używam jej sporadycznie (jak coś nie chce się skonfigurować normalnie - czyli nie ustawiam jakiegoś detalu)
  • Poziom 9  
    Dzieki za zrodla. Okazalo sie, ze problem lezal w samym projekcie. Stworzylem nowy projekt i dodalem wszystkie potrzebne pliki i przerwania zaczely dzialac poprawnie.

    Jak narazie pracuje na bibliotekach ST, diodkami juz dawno migam:) Mam takie pytanko co trzeba zrobic, aby program wgrany poprzez JTAG do flasha, po resecie odpalal sie normalnie? W tej chwili po resecie program sie nie uruchamia.