Skocz do zawartości

Pomocna odpowiedź

(edytowany)

Z moich uwag, poza tym, co wcześniej opisał Elvis odnośnie końca linii i buforowania, to dorzuciłbym problematyczne działanie przykładu z 10 znakami w buforze. Na moim kompie RealTerm wyrzucał krzaczki na końcu stringa (w sensie 10 znaków normalnie i potem jakieś randomy). Wydaje mi się, że wynikało to z faktu braku zamknięcia tablicy znakiem '\0' (10-znakowy bufor i 10 znaków zapisanych). Jak uzupełniłem ten znak na dodanym przeze mnie 11. miejscu problem zniknął i wypisywanie odbywało się normalnie.

Edytowano przez PrimeSoul
  • Lubię! 1

@PrimeSoul dzięki za sygnał. Na pewno będziemy za jakiś czas aktualizować ten kurs, aby wstawić zrzuty z aktualnych wersji Cube i poprawić część tematów merytorycznie. Będę dawał znać na forum, gdy kurs będzie już zaktualizowany 🙂

  • 2 tygodnie później...
/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
uint8_t Received[10];
/* USER CODE END PV */

/* USER CODE BEGIN PFP */
/* Private function prototypes -----------------------------------------------*/
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {

	uint8_t Data[40]; // Tablica przechowujaca wysylana wiadomosc.
	uint16_t size = 0; // Rozmiar wysylanej wiadomosci

	size = sprintf(Data, "Odebrana wiadomosc: %s\n\r",Received);

	HAL_UART_Transmit_IT(&huart1, Data, size); // Rozpoczecie nadawania danych z wykorzystaniem przerwan
	HAL_UART_Receive_IT(&huart1, Received, 10); // Ponowne włączenie nasłuchiwania
	HAL_GPIO_TogglePin(LED_BLUE_GPIO_Port, LED_BLUE_Pin);
}
/* USER CODE END PFP */

/* USER CODE BEGIN 2 */
HAL_UART_Receive_IT(&huart1, Received, 10);
/* USER CODE END 2 */

Kod jest taki jak w kursie o stm32 f4. Ja chciałbym, żeby mi każde słowo się wyświetlało w Real Term, nie tylko o długości 10 znaków, ale także po 8 znaków czy 6 znaków. Reasumując, chciałbym o dowolnej ilości znaków słowo wysłane przez UART, zobaczyć w terminalu. Piszę słowo "pies" chciałbym zobaczyć to słowo, później napisze np. "dzwoneczek" też chciałbym aby to słowo się pojawiło w terminalu.

  • 1 rok później...

Mam problem z wyświetlaniem wiadomości. Raz, że niektóre znaki nie działają, a dwa, że po dziesiątej wiadomości jakby dodatkowo \r \n przestawało działać i nowe komunikaty wyświetlają się po sobie. Baud się zgadza z konfiguracją, port również, kwarc ustawiony zgodnie z prawdą na 8MHz, wyświetlanie Ansi, program uruchamiany jako administrator.

2021-03-13_171201.png

Dnia 13.03.2021 o 17:28, Repti napisał:

Mam problem z wyświetlaniem wiadomości. Raz, że niektóre znaki nie działają, a dwa, że po dziesiątej wiadomości jakby dodatkowo \r \n przestawało działać i nowe komunikaty wyświetlają się po sobie. Baud się zgadza z konfiguracją, port również, kwarc ustawiony zgodnie z prawdą na 8MHz, wyświetlanie Ansi, program uruchamiany jako administrator.

2021-03-13_171201.png

Mialem identyczny problem, zmiana typu tablicy data na uint16_t pomogla.

  • 10 miesiące później...
(edytowany)

Cześć!

Kurs jest bardzo fajny i już wiele się nauczyłem. Jednak zauważyłem, że część rzeczy się "przeterminowała" i już nie działa od strzała tylko trzeba coś modyfikować. Korzystam z zestawu przeznaczonego pod ten kurs.

Staram się by mój ARM odsyłał do PC odpowiedzi "STOP" i "START", ale mi nie wychodzi. Być może ktoś z was miał podobnie.

Występują ostrzeżenia, że jest: sprintf(char *str, const char *str,...) oraz HAL_UART_Transmit_IT (..., uint8_t *, uint16_t). Można zadeklarować: char data[50] zamiast uint8_t data[50] i wtedy pasuje w sprintf() [nie ma ostrzeżenia], oraz użyć (uint8_t*) w HAL_UART_Transmit_IT.

Udało mi się wyeliminować ostrzeżenia (było 7 czy 8), błędów nie było. Niemniej program nie działa tak jak oczekuję. W RealTerm wyświetlają się przedziwne znaczki.

image.thumb.png.ee290f36019da18d9c0b1048d6724035.png

UPDATE_01: Za każdym razem po włączeniu RealTerm należy przestawić wybrany ostatnio port COM na inny i z powrotem wybrać ten z ProfilicSerial, oraz rozłączyć się i połączyć na nowo przyciskiem "Open". To okazało się być przyczyną dziwnych znaczków.

UPDATE_02: Obecnie program działa już niemal w 100%. Przesyła "START", "STOP" i wypisuje jaka cyfra została wysłana inna niż 0 czy 1. Niemniej dla literek wyskakuje zawsze "STOP". To za pewne efekt atoi(). Używam własnej funkcji wait(), ponieważ poza main() HAL_DELAY() zatrzymuje program na dobre.

Mój kod wygląda następująco:

/* USER CODE BEGIN PFP */
	void wait(int ticks){
		for (int i = 0; i <= ticks*1000000; i++){
			i=i;
		}
	}

	void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){

			char data[50];
			uint16_t size = 0;

			switch (atoi((char*)&received)){

			case 0:
				size = sprintf(data, "STOP\r\n");
				HAL_GPIO_TogglePin(GPIOD, blue_led_Pin);
				wait(2);
				HAL_GPIO_TogglePin(GPIOD, blue_led_Pin);
				break;

			case 1:
				size = sprintf(data, "START\r\n");
				HAL_GPIO_TogglePin(GPIOD, blue_led_Pin);
				wait(2);
				HAL_GPIO_TogglePin(GPIOD, blue_led_Pin);
				break;

			default:
				size = sprintf(data, "UNKNOWN SIGN RECEIVED %d\r\n", atoi((char*)&received));
				break;

			}

			HAL_UART_Transmit_IT(&huart1, (uint8_t*) data, size);
			HAL_UART_Receive_IT(&huart1, &received, 1);
		}

/* USER CODE END PFP */
/* USER CODE BEGIN 2 */
  HAL_UART_Receive_IT(&huart1, &received, 1);
  /* USER CODE END 2 */

 

Edytowano przez okaluka
Update problemu #004

Cześć!

Okazuje się, że uruchomienie DMA, samo skonfigurowanie go do działania, powoduje, że program się nie zgrywa na ARM.
Korzystam z Cube32mxIde 1.8.0 i próbowałem na wszystkich wersjach, aż do 1.0.0....

Mieliście może podobny problem?

Z góry dzięki za pomoc.

Hej, 

Dziękuję za zainteresowanie tematem.
Program jest "pusty" tj. nie ma innego kodu poza tym, który jest generowany przez samego Cube32mxIDE. W tym konfiguracja DMA.
Kiedy nie konfiguruję DMA (jakiegokolwiek, np ADC) program zgrywa się na płytkę, a kiedy konfiguruję DMA to się nie zgrywa.
Wygląda to jak gdyby sama konfiguracja DMA powodowała jakiś problem. Poza tym mogę powiedzieć, że nie zmieniam żadnych dodatkowych opcji, nie buszuję w ustawieniach i innych co mogłoby spowodować problem. Dodam, że jestem już na 8 części kursu i wykonałem z powodzeniem wszystkie ćwiczenia i zadania "domowe", tylko DMA się nie udało.
W innych niż 1.8.0 wersjach jest po prostu informacja "Connection lost". W wersji 1.8.0 jak na screenie poniżej:
image.thumb.png.1e05f762b903bfefebf0462a27d6b314.png

36 minut temu, okaluka napisał:

Hej, 

Dziękuję za zainteresowanie tematem.
Program jest "pusty" tj. nie ma innego kodu poza tym, który jest generowany przez samego Cube32mxIDE. W tym konfiguracja DMA.
Kiedy nie konfiguruję DMA (jakiegokolwiek, np ADC) program zgrywa się na płytkę, a kiedy konfiguruję DMA to się nie zgrywa.
Wygląda to jak gdyby sama konfiguracja DMA powodowała jakiś problem. Poza tym mogę powiedzieć, że nie zmieniam żadnych dodatkowych opcji, nie buszuję w ustawieniach i innych co mogłoby spowodować problem. Dodam, że jestem już na 8 części kursu i wykonałem z powodzeniem wszystkie ćwiczenia i zadania "domowe", tylko DMA się nie udało.                                                                                                                                                    
 

Cześć,

a próbowałeś może "wgrać" program na płytkę za pomocą programu "ST-LINK"? Ja też kiedyś miałem taką podobną systuację, że debugger ni nie startował, po wgraniu programu osobno za pomocą "ST-LINK" wszstko zaczęło działąć poprawnie. Poza tym wydaje mi się, że po przejściu na UART za pomocą DMA powinieneś zmienić wywołania funkcji  HAL_UART_Transmit_IT na HAL_UART_Transmit_DMA (z funkcjami do odbioru podobnie).

Zobacz też ten link:

https://community.st.com/s/question/0D50X00009XkfcUSAR/haluarttransmitdma-issues

może być pomocny.

Pozdrawiam

  • Pomogłeś! 1
Dnia 10.02.2022 o 13:08, FlyingDutch napisał:

a próbowałeś może "wgrać" program na płytkę za pomocą programu "ST-LINK"? Ja też kiedyś miałem taką podobną systuację, że debugger ni nie startował, po wgraniu programu osobno za pomocą "ST-LINK" wszstko zaczęło działąć poprawnie. Poza tym wydaje mi się, że po przejściu na UART za pomocą DMA powinieneś zmienić wywołania funkcji  HAL_UART_Transmit_IT na HAL_UART_Transmit_DMA (z funkcjami do odbioru podobnie).

Tak, próbowałem. Być może zrobiłem przy tym jakiś błąd, kto wie. Aczkolwiek zbudowałem .hex także innego programu, takiego, który działał żeby sprawdzić sam proces, i program zadziałał. Przy DMA się co prawda zgrywał, ale nie działał. Muszę to przetestować jeszcze raz...

Dnia 10.02.2022 o 11:29, Gieneq napisał:

kurs był pisany na wersji 1.6.x i przykład ten działał, sam testowałem. Pokaż jaki masz błąd. czy masz ten sam układ co w kursie?

Jeśli w moim przypadku zgranie projektu wersją 1.6.0 się nie udało to myślę, że może być temu winien firmware ST-Link'a... Niestety nie mam innego programatora, żeby sprawdzić czy tak właśnie jest. Pozostaje poczekać na update FW...

2 minuty temu, okaluka napisał:

Tak, próbowałem. Być może zrobiłem przy tym jakiś błąd, kto wie. Aczkolwiek zbudowałem .hex także innego programu, takiego, który działał żeby sprawdzić sam proces, i program zadziałał. Przy DMA się co prawda zgrywał, ale nie działał. Muszę to przetestować jeszcze raz...

Jeśli w moim przypadku zgranie projektu wersją 1.6.0 się nie udało to myślę, że może być temu winien firmware ST-Link'a... Niestety nie mam innego programatora, żeby sprawdzić czy tak właśnie jest. Pozostaje poczekać na update FW...

Cześć,

update firmware programatora możesz zrobić on-line za pomocą aplikacji ST_LINK. Spróbuj obniżyć zegar programatora w opcjach ST_LINK'a to czasami pomaga.

Pozdrawiam

  • Pomogłeś! 1
(edytowany)
Dnia 12.02.2022 o 08:07, FlyingDutch napisał:

Cześć,

update firmware programatora możesz zrobić on-line za pomocą aplikacji ST_LINK. Spróbuj obniżyć zegar programatora w opcjach ST_LINK'a to czasami pomaga.

Cześć, kiedy włączyłem ST-Link dostałem komunikat o możliwym update'cie, ale do innej, trochę starszej wersji firmware'u i to rozwiązało problem. Programy z zainicjalizowanym DMA zgrywają się i działają bez zarzutu.
Mogę dodać, że wersja Cube32IDE 1.8.0 błędnie generuje inicjalizację DMA na końcu całej inicjalizacji, a powinna zaraz za GPIO, a po niej inicjalizowana powinno być cała reszta. Należy to zmienić w w zaawansowanych opcjach menedżera niebieskimi strzałkami w prawym górnym rogu zaraz nad tabelą i dopiero generować program.

image.thumb.png.bc8a9edecf1c9d957be806318e45d902.png

Dziękuję za wskazówki! 🙂

UPDATE: Chyba za wcześnie się pochwaliłem. W przypadku peryferiów TIM i ADC z DMA nie ma problemu, ale w przypadku UART dalej jest.
Na razie to zostawiam z powodu braku czasu. Jakby Wam przyszło coś jeszcze do głowy to dajcie znać 😉

 

Edytowano przez okaluka
  • Lubię! 1

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...