Skocz do zawartości

Kurs STM32L4 – #4 – komunikacja przez UART, debugger


Komentator

Pomocna odpowiedź

@LN7 spróbuj dla pewności odłączyć i podłączyć płytkę do komputera raz jeszcze. Możliwe, że port COM jest z jakiegoś powodu zajęty (zakładam, że wybrałeś poprawny numer)? Normalnie terminal powinien pracować bez problemu równolegle z włączonym debuggerem.

Link do komentarza
Share on other sites

Im więcej części kursu za mną, tym bardziej mi się podoba 🙂 Ale od pewnego czasu nurtuje mnie pytanie - jak samemu można wpaść na podmianę funkcji __io_putchar? Genialne 🙂 

  • Lubię! 1
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

@xanes miło słyszeć, że kurs Ci się podoba! Wiele sztuczek z tego kursu to na pewno po prostu wynik zawodowych doświadczeń autora tych materiałów. @Elvis podpowiesz skąd można uczyć się takich sztuczek? Można to znaleźć w "dokumentacji" lub w jakiś przykładach producenta?

Link do komentarza
Share on other sites

@Treker @Elvis Bardzo dziękuję! Nie znałem tej praktyki. Przejrzałem Core/Src/syscalls.c, a także  Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart.c pod kątem funkcji HAL_UART_TxCpltCallback i HAL_GPIO_EXTI_Callback z 7. części kursu, co do których w zasadzie miałem analogiczne pytanie, i wszystko powoli staje się jasne. Dzięki!

  • Lubię! 1
Link do komentarza
Share on other sites

Super materiał, wszystko przejrzyście wytłumaczone. Przy okazji zadań domowych była mała powtórka z poprzedniej części kursu. Od strony programistycznej wszystko mi działa. Zanim przejdę do następnej części to mam pytania o działanie samej płytki, środowiska i terminala, bo pojawiło mi się kilka uciążliwości przy pracy.

1. Często po wykonaniu debugowania pliku main.c i wciśnięciu przycisku run, pojawia mi się komunikat: No ST-LINK detected! Please connect ST-LINK and restart the debug session. Sprawdzałem w managerze urządzeń i płytka normalnie była widoczna, poza tym diody na programatorze i płytce normalnie się świeciły. Dopiero fizyczne rozłączenie kabla i podłączenie powrotne pozwalało na wgranie programu (robiłem próby na dwóch różnych kablach i zmieniałem porty usb w kompie, ale problem cały czas się powtarza). 

2. Nie zawsze po wgraniu nowego programu jest możliwe skomunikowanie się od razu z terminalem Tera Term i tu znowu pomocne jest fizyczne rozłączenie płytki i ponowne podłączenie. 

3. Przy robieniu zadań domowych z przyciskiem zauważyłem, że jest dość spore opóźnienie zanim od wciśnięcia przycisku w terminalu pojawi się wartość licznika. Układ ma jakby taką "bezwładność", jak szybko wciskam przycisk, to w terminalu nic się nie wyświetla, natomiast jak wciskam przycisk z lekkim przytrzymaniem i co powiedzmy sekundę, to komunikat i wartość się wyświetlają. Czy to normalny efekt, bo przy pisaniu z klawiatury nie ma żadnych opóźnień.

Link do komentarza
Share on other sites

@szeryf super że robisz zadania dodatkowe, tak trzymaj 🙂

A jaki masz system? Te pierwsze 2 problemy wydają się mieć część wspólną. U mnie Win 10 64b Tera Term działa od razu, odpalam łączy się i wyświetla dane. Nie trzeba zamykać Tera Term aby wgrać program, nie ruszam kabla USB. Wiem, że to mało profesjonalna porada, ale możesz sprawdzić to na innym komputerze? Ewentualnie jeżeli masz jakąś przejściówkę do UARTu może spróbuj podłączyć ją i zobaczyć czy pomoże.

Co mi jeszcze przychodzi do głowy, to stary sterownik, stara wersja ST-linka, albo jakiś firewall, który nadgorliwie sprawdza co tam się wysyła. Zobacz czy odłączenie antywirusa pomoże.

 

12 godzin temu, szeryf napisał:

Przy robieniu zadań domowych z przyciskiem zauważyłem, że jest dość spore opóźnienie zanim od wciśnięcia przycisku w terminalu pojawi się wartość licznika.

To też wydaje się mieć tę samą przyczynę. Ewentualnie może w kodzie coś Ci blokuje, w kolejnych częściach kursu w szczególności tej jest opisana pułapka w jaką można wpaść obsługując przyciski, przerwania i np UART jednocześnie. Mógłbyś wrzucić kod?

Link do komentarza
Share on other sites

@szeryf A czy sprawdziłeś inny kabel USB? Najlepiej użyj jak najkrótszego. Po uruchomieniu debugowania (guzik z "żukiem") nie wciskaj run, tylko kontynuuj ("resume", F8) jak Ci się wykonanie zatrzyma na pierwszym breakpoincie, jeśli wciśniesz run to będziesz miał taki objaw, jak piszesz. Sekwencje "guzików" masz opisaną w kursie (cz. II), zobacz czy wciskasz dokładnie te i w dokładnie tej samej kolejności. Jeśli tak, to oprócz tego, o czym pisze @Gieneq  obstawiam też kabel USB.

  • Pomogłeś! 1
Link do komentarza
Share on other sites

12 godzin temu, xanes napisał:

 Po uruchomieniu debugowania (guzik z "żukiem") nie wciskaj run, tylko kontynuuj ("resume", F8) jak Ci się wykonanie zatrzyma na pierwszym breakpoincie, jeśli wciśniesz run to będziesz miał taki objaw, jak piszesz. 

@xanes dzięki za przypomnienie☺️, faktycznie to powodowało ten błąd.

Co do opóźnień, to testowałem na dwóch kablach usb, dłuższym i krótszym z zestawu. Zrobiłem też tak jak radził @Gieneq, czyli zainstalowałem całe środowisko na dość szybkim laptopie, ale problem opóźnień cały czas występuje. W programie użyłem funkcji is_button_pressed z poprzedniego odcinka, a do pętli while wrzuciłem poniższy kod:

if(is_button_pressed()){
	printf("zmienna licznik wynosi: %d\n", licznik);
	if (licznik % 2 == 0){
		HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_SET);
		} else {
		HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET);
		}
	licznik++;
	HAL_Delay(20);
	while(is_button_pressed()){
	}
	HAL_Delay(20);
 }

Użyłem zewnętrznego przycisku podłączonego do PC8 (tak jak w poprzednim odcinku z podłączonym rezystorem i włączonym trybem pull-up). Na obu komputerach jest win10 ze wszystkimi aktualizacjami.

Link do komentarza
Share on other sites

Ja stopniowo, po lekturze na sucho całości, przechodzę przez kolejne części już działając w środowisku i takie mi się nasuwają problemy.
Pracuję pod MacOS. Jaką alternatywę dla Tera Term mogę zastosować w MacOS? Chodzi tu głównie o problem wysyłania danych z klawiatury. Na codzień do podglądu tego co się dzieje na serialu używam SerialTools i dobrze się sprawuje, ale jedynie do podglądu tego co jest wysyłane na terminal. Zatem czego użyć?

I kolejny problem. Skoro mamy rozpisane zagadnienie komunikacji UART... Mam moduł karty WiFi ESP8255  v2 którym sterujemy właśnie przez UART komendami AT. Czy na tym etapie kursu da się sterować połączeniem tej płytki STM32 z siecią WiFi? Ewentualnie jeśli macie jakieś namiary do poczytania o tym jak te dwa urządzenia skutecznie "pożenić" ze sobą. No bo jak rozumiem jedno to nawiązanie połączenia Rx/Tx z modułem, a drugie to zarządzanie sterowaniem/transmisją. Generalnie chciałbym poznać jak użyć go jako karty WiFi i jako małego serwera WWW (np. do sterowania stanem portów przez przeglądarkę). Udało mi się z bezpośrednio z terminala przez moduł połączyć z siecią WiFi. Jednak nadal problem stanowi późniejsza komunikacja i przesyłanie danych z/na zdalny serwer. 

Link do komentarza
Share on other sites

Dnia 10.07.2021 o 14:09, MC2Systems napisał:

Jaką alternatywę dla Tera Term mogę zastosować w MacOS?

Tutaj nic nie doradzę, bo nie pracuję na MacOS, a nie chce podpowiadać czegoś w ciemno. Może @Elvis coś podpowie?

Jeśli chodzi o drugą część Twojej wiadomości: UART to UART, nie ważne z czym się komunikujesz - trzeba przestrzegać tylko tego, aby oba urządzenia były skonfigurowane do pracy z tą samą prędkością i gotowe. Komendy AT do modułu wysyła się "tak samo" jak teksty, które wysyłaliśmy do PC. Mechanizm po stronie mikrokontrolera jest taki sam - musisz tylko dostosować prędkość i treść tego co jest wysyłane, do tego co oczekuje moduł WiFi. Nie ma to już dużego związku z samym STM32 - musisz po prostu przestudiować notę ESP i utworzyć własną bibliotekę (tak byłoby najlepiej), która ułatwi prace z tym modułem. W dalszych częściach kursu pokazaliśmy jak na podstawie noty katalogowej komunikować się np. z ekspanderem portów, wyświetlaczem, czy czujnikiem ciśnienia. Tutaj sytuacja jest podobna - analiza noty modułu, który podłączasz i stopniowe tworzenie odpowiednich funkcji. ESP to rozbudowane układy, które możesz programować bezpośrednio w Arduino, ale to już zupełnie inna tematyka (oderwana od STM32) 🙂

  • Pomogłeś! 1
Link do komentarza
Share on other sites

Bardzo ciekawy materiał👍 Do tej pory jak programowałem to po prostu pisało się print(...) i tyle 😂- bez zastanowienia, jakby to było coś normalnego. Ten fragment kursu pokazał, co kryje się pod takim niepozornym printf() i jak można go w prosty sposób obsłużyć w emdedded. Całość przedstawiona bardzo przystępnie.

W trakcie przerabiania tego fragmentu kursu miałem tylko jedną wątpliwość do pierwszego przykładu wysyłania danych po UART:

  const char message[] = "Hello world!\r\n";
  HAL_UART_Transmit(&huart2, (uint8_t*)message, strlen(message), HAL_MAX_DELAY);

Czy przy przekazywaniu danych do przesłania nie brakuje "&"? We wszystkich pozostałych przykładach widnieje konsekwentnie poniższy zapis (w tym przypadku dla pojedynczego znaku): 

(uint8_t*)&ch

Bez "&" naturalnie również działa. Chciałbym po prostu rozwiać swoje wątpliwości w kwestii, czy & nie ma tam z jakiegoś konkretnego powodu. Pozdrawiam 🙂 

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.