logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[STM32F4] STM32F429 - USART2 nie działa na płytce 32F429IDISCOVERY

BIDMEXI 31 Gru 2014 04:31 1875 7
REKLAMA
  • #1 14274098
    BIDMEXI
    Poziom 9  
    Posty: 88
    Pomógł: 1
    Ocena: 27
    Witam.

    Posiadam mikrokontroler STM32F429 na płytce 32F429IDISCOVERY. Napisałem obsługę wysyłania i odbierania znaków przez USART, jednak program nie pracuje.

    Program przedstawia się następująco:


    -Załączam taktowanie do układu USART2:


    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    -Konfiguruję piny D5 (Rx) i D6 (Tx) jako alternatywne:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    - Konfiguruję układ USART2 do pracy:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    - Piszę funkcję obsługującą przerwanie:


    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    - W pętli głównej sprawdzam, czy coś odebrano. Jak tak - wysyłam literę "a" jako odpowiedź:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Niestety, ale program nie pracuje.... Czym to może być spowodowane? Przetestowałem już chyba wszystkie możliwości.
  • REKLAMA
  • Pomocny post
    #2 14274512
    stracho
    Poziom 13  
    Posty: 71
    Pomógł: 5
    Ocena: 5
    Czy nie trzeba dodatkowo włączyć taktowania dla GPIOD ?
  • REKLAMA
  • Pomocny post
    #4 14274550
    BlueDraco
    Specjalista - Mikrokontrolery
    Posty: 6479
    Pomógł: 939
    Ocena: 421
    Pomysł, żeby nadawać znak wtedy, gdy odbiornik jest gotowy i nie wiedząc, co jest w buforze nadawania, niekoniecznie musi być poprawny. Pomyśl, co będzie wysłane po odbiorze pierwszego znaku.

    Bufor odbioru ma u Ciebie raz 16, a raz 17 znaków.

    Cyz odebranodane ma atrybut volatile?

    Czy włączyłeś przerwanie UART?

    Takie inicjowanie UART działa poprawnie (wyjęte z większego programu dla F401/F411):
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • Pomocny post
    #5 14274983
    piotrva
    VIP Zasłużony dla elektroda
    Posty: 6409
    Pomógł: 625
    Ocena: 735
    Ale Twój program nie działa bo nie masz włączonego taktowania dla GPIO.
  • REKLAMA
  • #6 14276257
    BIDMEXI
    Poziom 9  
    Posty: 88
    Pomógł: 1
    Ocena: 27
    stracho napisał:
    Czy nie trzeba dodatkowo włączyć taktowania dla GPIOD ?


    Taktowanie jest włączane:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    dziechu napisał:
    A gdzie masz włączanie przerwań od USART?


    Włączam przerwania tak:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    BlueDraco napisał:
    Cyz odebranodane ma atrybut volatile?


    tak

    Niestety, ale program nadal nie działa. W pętli głównej cały czas wysyłam 'a', jednak nic nie jest w rzeczywistości transmitowane:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #8 14276375
    BIDMEXI
    Poziom 9  
    Posty: 88
    Pomógł: 1
    Ocena: 27
    Zmieniłem program, uwzględniając wcześniejsze uwagi. Na początku skupiam się tylko na wysyłaniu danych.


    Na początku załączam taktowanie portu PD:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Następnie konfiguruję wyprowadzenia PD5 i PD6 - linie TX i RX:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Później konfiguruję przerwania - kontroler NVIC:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod



    Następnie konfiguruję USART:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    i w pętli głównej wywołuję funkcję:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Efektem działania programu jest pojawienie się kropki w terminalu i zatrzymanie się programu na poleceniu:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    w specjalnie przygotowanej funkcji wysyłającej dane:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Czym to może być spowodowane?

    Dodano po 1 [godziny] 1 [minuty]:

    Zmieniłem USART2 na USART3 - program nie działał. Gdy zmieniłem USART3 na USART1 (taktowany przez szynę APB2), program zaczął wysyłać dane i można było przeczytać na terminalu tekst z funkcji
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    , czyli "Hello world".

    Dlaczego zatem inne USARTY nie działają?

    Dodano po 15 [minuty]:

    Dodam, że parametr

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    był też dobrze ustawiony dla USART3 / USART2, czyli:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

Podsumowanie tematu

LABEL_AI_GENERATED
Użytkownik ma problem z działaniem USART2 na płytce 32F429IDISCOVERY z mikrokontrolerem STM32F429. W kodzie włączono taktowanie USART2 oraz skonfigurowano piny D5 (Rx) i D6 (Tx) jako alternatywne, jednak program nie działa. Odpowiedzi sugerują, że należy włączyć taktowanie dla portu GPIOD oraz przerwania USART. Użytkownik potwierdza, że taktowanie GPIO jest włączone, a przerwania są konfigurowane, ale nadal nie udaje się transmitować danych. W kolejnych postach użytkownik modyfikuje kod, aby uwzględnić wcześniejsze uwagi, w tym poprawną konfigurację pinów i przerwań.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA