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

STM32F103/CooCox - Pin WAKEUP nie budzi procesora z trybu STANDBY.

26 Paź 2013 15:36 1638 6
  • Poziom 14  
    Sekwencja włączenia trybu STANDBY jest taka:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Problem jest taki, że jeśli procesor wejdzie w stan STANDBY, to narastające zbocze sygnału WAKEUP (GPIOA0) nie budzi procesora.
    Proszę o podpowiedź, czego brakuje?
  • Poziom 27  
    Na pewno nie budzi? Pamiętaj że po wybudzeniu z tego trybu program nie jest dalej kontynuowany, ale zaczynany od początku, więc jeżeli na początku programu po inicjalizacji wprowadzasz procesor w tryb standby i czekasz że po wybudzeniu program będzie się kontynuował, to trzeba sprawdzać co wywołało reset - jeżeli wybudzenie z trybu standby to pomijasz kolejne wprowadzenie procesora w ten tryb.

    P.S. U mnie ta sekwencja działa.
  • Poziom 14  
    Na pewno nie budzi się.
    Przed wprowadzeniem procesora w tryb STANDBY jest impuls na diodę LED i to się nie wykonuje po podaniu '1' na WAKEUP.
    Procesor się nie budzi i nie rozpoczyna sekwencji resetu.
    Kod programu:
    Kod: c
    Zaloguj się, aby zobaczyć kod
  • Poziom 27  
    U mnie ta sekwencja działa bez problemu (STM32F100RB), więc musisz szukać może przyczyny w połączeniach przycisku. Raczej niczego w kodzie nie brakuje. Najlepiej jak przycisk jest stale podciągany do 0 i przyciskiem zwierany do +. A na pewno dochodzi do inicjacji wakeup? Nie wisi przypadkiem na przycisku - while(WAKEUP); ?

    Dodano po 1 [minuty]:

    U mnie jest tak:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    i działa.

    Dodano po 12 [minuty]:

    Na końcu zamiast puste while(1), wrzuć w pętlę mruganie diodą, zobaczysz czy dochodzi do uśpienia procesora czy też przelatuje do końca kodu.
  • Poziom 14  
    Jest pull-down.
    Jest podawany stan '1' na pin WAKEUP.
    Dodałem kod jaki proponował "dziechu".
    Program osiąga linię: PWR_EnterSTANDBYMode(); ,
    dalej nie wykonuje się (tak jak powinno być).
    Podanie stanu '1' na WAKEUP nie powoduje zresetowania procesora.
    Dodam, że pracuję na kwarcu 8[MHz] z włączonym PLLx3 czyli 24[MHz].
    Zmieniony kod:
    Kod: c
    Zaloguj się, aby zobaczyć kod
  • Poziom 27  
    No to nie mam pojęcia. Zrób jeszcze test na pin PA0, np. klawisz wciśnięty - led świeci, puszczony - nie świeci itp. W kodzie jest wszystko co trzeba, to musi być jakiś 'głupi' błąd. Mogę jeszcze wrzucić ten kod na STM32F103ZET, ale wątpię żeby była jakaś różnica. Możesz jeszcze spróbować czy wybudza się np. z watchdoga. Zapuść watchdoga z jakimś dłuższym czasem, np. kilka sek. i wprowadź procesor w standby, zobaczymy czy tylko pin wakeup go nie wybudza, czy też w ogóle nic.

    P.S. A dlaczego masz zdefiniowane LED1_ON, LED1_OFF a w programie masz LED2_ON itd.?
  • Poziom 14  
    Sprawa wyjaśniona.
    Sygnał był podawany na WAKEUP przez dzielnik rezystorowy taki, że napięcie w stanie wysokim było 3.2[V].
    Jednakże po wykonaniu funkcji:
    Kod: c
    Zaloguj się, aby zobaczyć kod
    procesor automatycznie dołącza pull-down o wartości od 30 do 50 [kOhm].
    Powodowało to, że napięcie na WAKEUP w stanie wysokim wynosiło tylko 1.6[V] czyli poniżej 0.65*VDD jakie jest wymagane dla stanu wysokiego.
    Po zmianie dzielnika wszystko jest OK.
    Wystarczająca sekwencja włączająca budzenie pinem WAKEUP i tryb STANDBY jest następująca:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Dziękuję za sugestie.
    Zamykam temat.