Skocz do zawartości

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.

  • 1 miesiąc później...

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 😉

  • 2 miesiące później...

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 😋

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);
}
}
  • 1 miesiąc później...

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)

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
  • 3 miesiące później...
  • 2 tygodnie później...
  • 5 miesiące później...

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.

  • 4 miesiące później...

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?

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