Skocz do zawartości
Komentator

Kurs STM32 - #5 - Komunikacja z komputerem, UART

Pomocna odpowiedź

piomar123, jest dokładnie tak jak napisałeś, GetITStatus sprawdza czy przerwanie jest włączone - w dość skomplikowany sposób zresztą. GetFlagStatus jest dużo szybsza i łatwiejsza do analizy, więc chyba lepiej przy niej zostać.

porousstructure, po pierwsze napis w C musi kończyć się zerem, inaczej mogą pojawić się "krzaki" i dziwne wyniki. Po drugie nie sprawdzasz przepełnienia bufora - to poważny, chociaż częsty błąd. Po wysłaniu bufora nie resetujesz zmiennej i, więc dane powinny się dopisywać do poprzednich. Dodajesz też znak 0x0d, co chyba nie jest celowe (i tak wysyłasz go jeszcze raz z printf).

kulawikm, kurs dotyczy stm32f103, wiec jeśli masz pytania odnośnie F4 załóż proszę oddzielny temat.

Udostępnij ten post


Link to post
Share on other sites

Witam serdecznia. Transmisja działa przy użyciu portu wirtualnego z płytki. Chciałem spróbować transmisji przez inną przejściówkę usb-rs232, ale na schemacie widzę, że żeby się dobrać do PA2 i PA3 trzeba zlutować SB62,SB63, więc sobie odpuściłem. Skonfigurowałem więc USART3 podobnie jak USART2, wpiąłem się w D8, D2 - nie ruszyło. Czy przy konfiguracji USART3 trzeba zwrócić uwagę na coś dodatkowego? Pozdrawiam 😉

Udostępnij ten post


Link to post
Share on other sites

Tak przy okazji, chciałby ktoś pouczyć się STM'a wspólnie? Skype lub na żywo (Gdańsk?)

Albo dorobić trochę grosza i udzielić korepetycji?

Mój email: highlevellanguages@gmail.com

Udostępnij ten post


Link to post
Share on other sites

Cześć. Mam dziwny problem z konfiguracją pinów TX oraz RX. Otóż, gdy ten sam kod jest po prostu w funkcji main wszystko działa poprawnie, natomiast gdy umieszczę go w funkcji to STM przestaje przesyłać cokolwiek. Zamieszczam poniżej wspomniany kod:

void konfig_TXRX(GPIO_InitTypeDef gpio)
{
 //RX LINE
gpio.GPIO_Pin = GPIO_Pin_2;
gpio.GPIO_Mode = GPIO_Mode_AF_PP;
//GPIO_Init(GPIOA, &gpio);

//TX LINE
gpio.GPIO_Pin = GPIO_Pin_3;
gpio.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &gpio);

}

Próbowałem też odwołania do zmiennej gpio przez referencję jako (GPIO_InitTypeDef* gpio), nic to nie dało. Mam wrażenie jakby funkcja GPIO_Init() nie ustawiała na porcie tego co jest zapisane w liniach wyżej, tylko nie wiem dlaczego. Proszę o wyjaśnienie 😋

Udostępnij ten post


Link to post
Share on other sites

damian11, pokaż cały program - będzie łatwiej. Gdzie dokładnie masz deklaracje struktury gpio?

Udostępnij ten post


Link to post
Share on other sites

Program odczytuje dwa kanały ADC, używa DMA, wysyła wynik na terminal. Reszta funkcji jest ok, sprawdzałem. Różnicę robi tylko konfig_TXRX(), gdy użyję tej funkcji nic się nie pojawia na terminalu, jak temu zaradzić 🙂 ? W sumie nie sprawia mi to tak dużej różnicy czy te parę linijek będzie w funkji czy nie, ale chcę wiedzieć na przyszłość z czego wynika to, że mi to teraz nie działa 😋

#include <stdio.h>
#include <stdint.h>
#include "stm32f10x.h"
#include "konfig.h"

volatile uint32_t timer_ms = 0;

void SysTick_Handler()
{
if (timer_ms)
timer_ms--;
}

void delay_ms(int time)
{
timer_ms = time;
while (timer_ms);
}
/*
void konfig_TXRX(GPIO_InitTypeDef gpio)
{
 //RX LINE
gpio.GPIO_Pin = GPIO_Pin_2;
gpio.GPIO_Mode = GPIO_Mode_AF_PP;
//GPIO_Init(GPIOA, &gpio);
 //TX LINE
gpio.GPIO_Pin = GPIO_Pin_3;
gpio.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &gpio);

}*/


int main(void)
{
//deklaracja struktur konfiguracyjnych
GPIO_InitTypeDef gpio;
USART_InitTypeDef uart;
DMA_InitTypeDef dma;
ADC_InitTypeDef adc;

konfig_RCC();
konfig_ADC(&gpio,&adc);
konfig_SysTick();
konfig_USART(&uart);
//konfig_TXRX(&gpio);
konfig_DMA(&dma);
konfig_LED(&gpio);

//RX LINE
gpio.GPIO_Pin = GPIO_Pin_2;
gpio.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &gpio);
//TX LINE
gpio.GPIO_Pin = GPIO_Pin_3;
gpio.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &gpio);


extern uint16_t adc_value[ADC_CHANNELS];

while (1)
{
	int i;
	for (i = 0; i < ADC_CHANNELS;i++)
		printf("ADC%d = %d\n", i, adc_value[i]);

GPIO_SetBits(GPIOA, GPIO_Pin_5);
delay_ms(100);
GPIO_ResetBits(GPIOA, GPIO_Pin_5);
delay_ms(400);
}
}

Udostępnij ten post


Link to post
Share on other sites

Moja pytanie będzie z dziedziny raczej tych oczywistych, ale jednak wolę zapytać przed zakupami. 🙂 Żeby wykonać to ćwiczenie potrzebuje konwertera USB<--> RS232 żeby się podpiąć do komputera oraz przejściówki USB<--> miniUSB żeby podpiąć się do zestawu STM32 i wtedy powinno mi się wyświetlić coś w oknie programu Tera Term (oczywiście zakładając, że wgrany program jest ok)

Udostępnij ten post


Link to post
Share on other sites

bastik, zestawy Nucleo posiadają wbudowany konwerter USB UART. Wystarczy, że będziesz robił dokładnie to, co zostało opisane w tekście. Komunikacja na pewno wtedy ruszy 🙂

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Czy ktoś z Was próbował połączyć się z płytką za pomocą FlashLoader Demonstrator? Jeżeli tak to może jakaś podpowiedź jak to zrobić poprawnie.

Udostępnij ten post


Link to post
Share on other sites

lewander, a z czym konkretnie masz problem?

Udostępnij ten post


Link to post
Share on other sites

lewander, a czy wykonujesz odpowiednie operacje na pinach BOOT i podpinasz się do odpowiedniego UARTa?

Udostępnij ten post


Link to post
Share on other sites

Witam. Poradnik rewelacja.

Po 4 dniach udało mi się nawiązać komunikację przez UART. Wszystkie etapy kursu wykonałem poza jednym. Chodzi o USART_FLAG_RXNE. Po napisaniu kodu i skompilowaniu w komunikatorze nie wyświetla się nic, jakby program był w martwej pętli. Program stoi w miejscu.

Z tego co widzę, to kod odbierania danych niewiele się różni od wysyłania. Jedyną różnicą jest dodanie własnie jednej formuły:

while(1){
   	GPIO_SetBits(GPIOB, GPIO_Pin_7);
   	        delay_ms(100);
   	        GPIO_ResetBits(GPIOB, GPIO_Pin_7);
   	        delay_ms(100);

   	        if (USART_GetFlagStatus(USART3, USART_FLAG_RXNE)) {
   	             char c = USART_ReceiveData(USART3);
   	             switch (c)
   	             {
   	                 case 'a':
   	                    printf("Odebrano komunikat A!\r\n");
   	                     break;
   	                 case 'b':
   	                    printf("Odebrano komunikat B!\r\n");
   	                     break;
   	                 default:
   	                    printf("Nieznany komunikat:(\r\n");
   	                     break;
   	             }
   	         }
   }

Robię na innej płytce, ale wszystko jeest analogiczne.

Udostępnij ten post


Link to post
Share on other sites

Witam

Po pierwsze DZIĘKUJĘ za ten kurs! Jest naprawdę super! Mam jednak pytanie, ponieważ pracuję na płytce NucleoF030R8 i w związku z tym biblioteki i niektóre funkcje się nieco różnią - chodzi mi konkretnie o włączenie funkcji alternatywnych, ktorych nie mogę znaleźć w żadnej bibliotece i już zwyczajnie nie wiem jak mogę je włączyć w tej płytce. Próbowałam wykonać poprzednią lekcję, podpunkt przerwań od przycisków bez włączenia tej funkcji i efekt był taki jak się spodzewałam- płytka nie zadziałała. Ktoś może wie gdzie znajdę, lub jak brzmi polecenie, któr włącza funkcje alternatywne pinów w mk f030r8?

Udostępnij ten post


Link to post
Share on other sites

antMan, _kursSprzet

PS Witam na forum 😉

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!

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