Skocz do zawartości
Komentator

Kurs STM32 F4 - #7 - Komunikacja przez UART

Pomocna odpowiedź

hatamarii, super, dziękuję za kolejną poradę, która pomoże innym czytelnikom 🙂

Udostępnij ten post


Link to post
Share on other sites

Hej, kurs - BOMBA 😉

Mam małą prośbę, może ktoś podrzucić mi ciało funkcji UART_DMATransmitCplt z biblioteki stm32f4xx_hal_uart.c ?

Przerabiam cały kurs na innej płytce i właśnie w tej bibliotece w podaj funkcji musiałem coś przerobić, chciałbym zobaczyć jak jest ona zrealizowana w STM32f4 🙂

z góry dziękuję 🙂

Udostępnij ten post


Link to post
Share on other sites

Rozwiązanie problemu-zagadki zadanego przez autora, jakie u mnie zadziałało, znajduję się w tym linku

ponadto jest tam pokazane rozwiązanie związane z nieznikającym statusem HAL_UART_STATE_BUSY_TX.

Udostępnij ten post


Link to post
Share on other sites

Męczyłem się z tym dzisiaj cały dzień i noc... bo już 4 nad ranem, więc zwracam się do was z nadzieją, że pomożecie.

Zadanie jest proste chce za pomocą UART wysłać komunikaty MIDI.

Na arduino nie było żadnego problemu np.:

//send MIDI message
void MIDImessage(byte command, byte data1, byte data2) {
 Serial.write(command);
 Serial.write(data1);
 Serial.write(data2);
}

Jeżeli chodzi o stm, skonfigurowałem wszystko w cube jak należy i owszem wysyła --- to co w kursie wysyła ale nie umiem sobie poradzić z tym, żeby wysłać tak jak na arduino 3 liczby najlepiej w hex albo binarnie i żeby one w pożądanej postaci dotarły i wyszły z uart.

Słowem wysyłam np 144 dociera całkiem co innego. Próbowałem już różnych rzeczy ale bez skutku...

Wybaczcie chaotyczną wypowiedź, bardzo proszę o pomoc. 🙂

Jeśli chodzi o rozwiązanie problemu:

https://www.elektroda.pl/rtvforum/viewtopic.php?p=16811552#16811552

Wybaczcie, że obce forum ale... działa 🙂

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Link do "poprzedniej części kursu" odnośnie konfiguracji zegarów jest błędny (z innego kursu).

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Mistress9, gratuluję czujności, dziękuję za uwagę - już poprawione 🙂

Udostępnij ten post


Link to post
Share on other sites

Cześć.

Mam problem z tym zadaniem. Nie dość, że po zmianie tekstu i wgraniu programu do mikrokontrolera pojawia mi się błąd w 71 linijce, który jednak po ponownym skompilowaniu i wgraniu znika:

size = sprintf(data, "Liczba wyslanych wiadomosci: %d.\n\r", cnt);

To na domiar złego jak wejdę w program Realterm to pojawia mi się coś takiego:

Jak można to naprawić? Co robię źle?

Nie wiem czy to ma znaczenie, ale u mnie dioda nie mruga z częstotliwością 1Hz, chociaż, według mnie ustawiłem poprawnie wszystkie wartości:

Pozdrawiam i z góry dziękuję za pomoc.

EDIT:

No to tak, wstyd się oczywiście przyznać, ale wszystko to było przyczyną tego, że przy konfiguracji zegara, nie zmieniłem Input Frequency z 25 na 8. Po tym zabiegu wszystko zadziałało. Lecz nadal pojawia się "Warning" przy linijce z sprintf'em.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Witam, nie mogę zmusić do działania odbierania danych przez UART, co więcej gdy wgrywam kod z tutoriala nie chce sie on zbuildować. Wyskakuje taki błąd:
 

No rule to make target '.../04_UART_Receive_Multiple_Bytes/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/system_stm32f4xx.c', needed by 'Drivers/CMSIS/system_stm32f4xx.o'.  Stop.

Nie wiem co jest tego przyczyną. Gdy szukałem tego pliku nie mogłem go w ogóle znaleźć ale w innych projektach też go nie mam a mogę je zbuildować. Co więcej taki błąd zazwyczaj mi wyskakiwał gdy miałem w nazwie plików jakiś polski znam/spację ale wszystko usunąłem a błąd pozostał.

Udostępnij ten post


Link to post
Share on other sites

@coolwilk, standardowe pytania:

  1. Jaka jest pełna ścieżka do projektu?
  2. Czy poprzednie części kursu udało się przejść bez problemu i używasz identycznego sprzętu?
  3. Czy wszystkie narzędzia masz ustawione tak samo jak było to opisane w kursie?
  4. Czy próbowałeś wykonać ten projekt raz jeszcze od początku (aby uniknąć przypadkowych błędów)?

Udostępnij ten post


Link to post
Share on other sites
Dnia 10.11.2018 o 23:16, Treker napisał:

@coolwilk, standardowe pytania:

  1. Jaka jest pełna ścieżka do projektu?
  2. Czy poprzednie części kursu udało się przejść bez problemu i używasz identycznego sprzętu?
  3. Czy wszystkie narzędzia masz ustawione tak samo jak było to opisane w kursie?
  4. Czy próbowałeś wykonać ten projekt raz jeszcze od początku (aby uniknąć przypadkowych błędów)?

1. W pełnej ścieżce nie było ani spacji ani wolnych znaków. Była ona poprawna.

2. Nie bez problemów ale wszystkie rozwiązałem, używam zalecanego sprzętu do tego kursu

3. Tak jest, wszystko jest ustawione tak samo ALE nie robiłem remappingu pinów.

4. Tak

 

Problem rozwiązałem (nie ten dotyczący buildowania się projektu z artykułu). Otóż wszystko działa po zrobieniu remappingu. Dziwi mnie to bardzo. Czy sugeruje to, że te podstawowe piny wyjściowe dla UART są wadliwe (program jest taki sam, jedyna różnica to remapping)?

Udostępnij ten post


Link to post
Share on other sites

@coolwilk możesz podać tylko dla pewności, które piny i gdzie dokładnie przemapowałeś? Sprawdzę temat 🙂

Udostępnij ten post


Link to post
Share on other sites

@Treker przemapowałem dokładnie tak samo jak w poradniku, w sensie dokładnie z tych pinów na te, które zostały wskazane w artykule. 

Udostępnij ten post


Link to post
Share on other sites

Cześć! Pochwale się Wam swoim wybitnym osiągnięciem.

Funkcja atoi() w moim przypadku nie dawała do końca oczekiwanych rezultatów. Podczas wysłania liczby program zachowywał się jak należy, lecz gdy wysłany został znak informacją zwrotną było STOP. Wystarczy użyć funkcji strtol() i powinno działać normalnie.

switch (strtol(&received))
{
    ...
}

 

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Moim zdaniem użycie funkcji atoi(const char * str) w instrukcji switch jest błędne. Problem pojawia się, gdy oprócz cyfr wysyłamy coś innego, np. literkę "b", wtedy nie może zostać poprawnie wykonana konwersja z łańcucha znaków na typ int. Można to znaleźć w opisie funkcji:

Cytat

If no conversion can be performed, 0 is returned.


Wtedy przechodzimy błędnie do kodu odpowiadającemu za odebranie 0. Tutaj wystarczy po prostu, zamiast konwertować cyfrę na liczbę coś takiego, użyć wartości bezpośrednio.

switch(byte_received) {
  case '0':
    ...
  case '1':
    ...
  default:
    ...
}

 

Udostępnij ten post


Link to post
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!

Gość
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...