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

stm32f051r8 - Niedziałające przerwanie od timera

Propaganja12 13 Kwi 2013 18:15 1254 11
  • #1 13 Kwi 2013 18:15
    Propaganja12
    Poziom 9  

    Witam

    Zaczynam się bawić z moim stm32 discovery i mam problem z konfiguracją przerwania.

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Nie wiem czemu to nie działa,czytałem że trzeba ustawić coś w rejestrach NVIC ale nie mogę go znaleźć w reference manualu.
    Drugie pytanie, jest jakiś zbiór makrodefinicji żeby np. zamiast |=(1<<0) pisać |=(1<<BS6)?

    0 11
  • #2 13 Kwi 2013 18:21
    Freddie Chopin
    Specjalista - Mikrokontrolery

    Propaganja12 napisał:
    Nie wiem czemu to nie działa,czytałem że trzeba ustawić coś w rejestrach NVIC ale nie mogę go znaleźć w reference manualu.

    Nagłówek core_cm0.h

    Propaganja12 napisał:
    Drugie pytanie, jest jakiś zbiór makrodefinicji żeby np. zamiast |=(1<<0) pisać |=(1<<BS6)?
    Propaganja12 napisał:
    #include "stm32f0xx.h"


    4\/3!!

    0
  • #3 13 Kwi 2013 19:00
    BlueDraco
    Specjalista - Mikrokontrolery

    Nie działa, bo:

    1. źle zaprogramowałeś timer - nie włączyłeś auto reload.
    2. Nie włączyłeś przerwania timera w NVIC (pseudofunkcja NVIC_IRQEnable().
    3. Nie zerujesz znacznika przerwania w prpcedurze obsługi przerwania.

    A poza tym masz bezsensowny else if w przerwaniu timera.

    0
  • #4 13 Kwi 2013 21:10
    Propaganja12
    Poziom 9  

    Coś mi tu nadal nie działa.

    Kod: c
    Zaloguj się, aby zobaczyć kod

    W przerwaniu zeruje bit UIF:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Tak poza tym to nie działają mi te makrodefinicje,jeśli jak wyżej wpiszę (1<<UIF) to wywala błąd. Programuje w CooCox jeśli ma to jakieś znaczenie.

    0
  • #5 13 Kwi 2013 21:32
    excray
    Poziom 39  

    Kod: c
    Zaloguj się, aby zobaczyć kod


    EDIT> Poprawione

    0
  • #6 13 Kwi 2013 21:43
    rajszym
    Poziom 19  

    Porty BSRR są tylko do zapisu.

    0
  • #7 13 Kwi 2013 22:22
    Propaganja12
    Poziom 9  

    Dobra,ogarnąłem makra.W avr'ach wyglądały trochę inaczej.
    Zamieszczam cały poprawiony i niedziałający kod:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #8 13 Kwi 2013 22:30
    BlueDraco
    Specjalista - Mikrokontrolery

    1. Uruchomienie timera z nazwami symbolicznymi bitów:
    TIM3->CR1 = TIM_CR1_ARPE | TIM_CR1_CEN;
    Popatrz w plik stm32f05xx.h - masz tam definicje bitów dla każdego rejestru, m.in. TIM_DIER_UIF i całe mnóstwo innych. Nazwy bitów są poprzedzone nazwami rejestrów.
    3. Do kasowania znacznika przerwania wystarczy podstawienie - nie potrzeba &=. Np.
    TIM3->SR = ~TIM_SR_UIF;
    4. Programowanie timerów STM32F051 pokazywałem tu już kilka razy - przeszukaj forum.

    5. Co konkretnie nie działa? Próbowałeś debugować?

    0
  • #9 13 Kwi 2013 22:38
    Propaganja12
    Poziom 9  

    Pierwszy raz używam debugera. Program leci po kolei i zapętla się w while.

    Program według mnie powinien co sekundę,naprzemiennie zaświecać i gasić diodę led.
    Dioda działa,program nie chce mi wejść w przerwanie.

    0
  • Pomocny post
    #10 13 Kwi 2013 22:40
    Freddie Chopin
    Specjalista - Mikrokontrolery

    Quiz pod tytułem znajdź problem widoczny z daleka:

    Propaganja12 napisał:
    RCC->APB2ENR|=(RCC_APB1ENR_TIM14EN);//wlacz zegar tim14


    4\/3!!

    0
  • #11 13 Kwi 2013 22:43
    alagner
    Poziom 25  

    ale jak to nie wchodzi w przerwanie? A masz tam breakpointa żeby to "złapać"?

    0
  • #12 13 Kwi 2013 22:43
    Propaganja12
    Poziom 9  

    Działa,dzięki.

    0