Skocz do zawartości

Kurs STM32 F1 HAL - #5 - komunikacja z komputerem, UART


Pomocna odpowiedź

html_mig_img
W poprzedniej części kursu STM32 nauczyliśmy się używać linii I/O do komunikacji z otoczeniem. Nadszedł czas na poznanie pierwszego interfejsu, który pozwoli na większą interakcję ze światem.UART posłuży nam do przesyłania komunikatów między STM32, a komputerem PC.

UWAGA, to tylko wstęp! Dalsza część artykułu dostępna jest na blogu.

Przeczytaj całość »

Poniżej znajdują się komentarze powiązane z tym wpisem.

Link do komentarza
Share on other sites

Pytanie od osoby, która pisze na rejestrach:

UART_HandleTypeDef uart;

uart.Instance = USART2;
uart.Init.BaudRate = 115200;
uart.Init.WordLength = UART_WORDLENGTH_8B;
uart.Init.Parity = UART_PARITY_NONE;
uart.Init.StopBits = UART_STOPBITS_1;
uart.Init.HwFlowCtl = UART_HWCONTROL_NONE;
uart.Init.OverSampling = UART_OVERSAMPLING_16;
uart.Init.Mode = UART_MODE_TX_RX;
HAL_UART_Init(&uart);

Rejestry (kod pod konfigurację wybranego uarta, ale chodzi głównie o linię z USART->CR1):

enum
{
USART1_NR = 1,
USART2_NR = 2,
USART3_NR = 3,
};

void UsartConfig(uint8_t USART_nr, uint32_t baud_rate)
{

switch(USART_nr)
{
case USART1_NR:
RCC->APB2ENR |= RCC_APB2ENR_USART1EN;
gpio_pin_cfg(GPIOB, 6, GPIO_MODE_AF_PP_2MHZ); //TX
gpio_pin_cfg(GPIOB, 7, GPIO_MODE_IN_FLOATING); //RX
USART1->BRR = CPU_FREQUENCY/baud_rate; //CLK/2/9600 -- //APB1/9600
break;

case USART2_NR:
RCC->APB1ENR |= RCC_APB1ENR_USART2EN;
gpio_pin_cfg(GPIOA, 2, GPIO_MODE_AF_PP_2MHZ); //TX
gpio_pin_cfg(GPIOA, 3, GPIO_MODE_IN_FLOATING); //RX
USART2->BRR = CPU_FREQUENCY/2/baud_rate;
break;

case USART3_NR:
RCC->APB1ENR |= RCC_APB1ENR_USART3EN;
gpio_pin_cfg(GPIOB, 10, GPIO_MODE_AF_PP_2MHZ); //TX
gpio_pin_cfg(GPIOB, 11, GPIO_MODE_IN_FLOATING); //RX
USART3->BRR = CPU_FREQUENCY/2/baud_rate;
break;
}

USART->CR1 = USART_CR1_UE | //usart_on
USART_CR1_TE | //Transmitter enable
USART_CR1_RXNEIE | //RXNE interrupt enable
USART_CR1_TXEIE |  //TXE interrupt enable
USART_CR1_RE; //Receiver enable
}

Po co ustawiany jest parzystość, kontrola hardware`owa, długości słowa - skoro domyślnie są ustawione identyczne wartości ?

Chyba lepiej uczyć pisać krótszy kod niż nadpisywać wartości rejestrów tym samym co już tam jest wpisane 😉

Strona 822 RM LINK

dejmieno, jak chchcesz się faktycznie czegoś nauczyć to polecam oprócz kursów z forum zgodnie z dokumentacją biblioteki HAL pisać własne programy testować, debugować: LINK

Link do komentarza
Share on other sites

ps19, w biblliotece StdPeriph były dostępne funkcje ustawiające struktury danych domyślnymi wartościami. Był to odpowiednik konstruktora C++ i pozwalał na uzyskanie przewidywalnej zawartości zmiennej, którą przekazujemy do wywołania biblioteki. W bibliotece HAL te funkcje gdzieś się zgubiły więc można użyć memset do wyzerowania całej zmiennej, albo pracowicie wyspełnić wszystkie pola.

Pisanie na rejestrach ma swoje zalety, nie będę się na ten temat kłócił, bo sam często wolę takie podejście - ale ten kurs bazuje na HAL, więc trzeba programować zgodnie z tym co ST dostarczyło. W każdym razie wpisanie początkowych wartości to niewielka cena za pewność otrzymanej konfiguracji. Wbrew pozorom czasem w rejestrze możemy mieć coś innego niż dokumentacja producenta podaje (miałem takie przejścia z układami Atmela - bootloader pierwszego poziomu nie sprząta po sobie i nie zawsze mamy to co się spodziewamy...).

  • Lubię! 2
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

Ja mogę jeszcze dodać, że uzupełnienie wszystkich pól struktury ułatwia późniejszą modyfikację kodu, jeżeli chcemy jakieś ustawienie zmienić na 'niestandardowe'. Nie trzeba szukać w dokumentacji biblioteki dokładnej nazwy pola i listy dopuszczalnych wartości, tylko np. zmieniamy

uart.Init.Parity = UART_PARITY_NONE;

na

uart.Init.Parity = UART_PARITY_EVEN;
  • Lubię! 1
Link do komentarza
Share on other sites

grizka, ten kurs pokazuje jak zastąpić bibliotekę StdPeriph nowszą wersją, czyli Cube HAL. Przykłady i układ kursu pozostaje taki jak w wersji poprzedniej. Kurs nie omawia wszystkich możliwości biblioteki HAL, to raczej wprowadzenie do programowania STM32 oraz pokazanie jak zacząć. Jeśli to wywołuje niedosyt to nawet dobrze - może zachęci czytelników do dalszej nauki oraz rozwijania umiejętności programowania. Natomiast jeśli podczas czytania pojawia się niesmak, to radziłbym po prostu nie czytać. To darmowy kurs, nie ma obowiązku czytania, jeśli to nieprzyjemna czynność, lepiej tego nie robić.

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

UART jest podpięty do pinów PA2 i PA3, czyli to oznacza, że nie można normalnie korzystać z tych pinów? Nie mogę sobie skonfigurować pinu PA3 jako wejścia i podpiąć do niego przycisku?

Link do komentarza
Share on other sites

Mikrokontroler STM32F103 posiada kilka uart-ów, a każdy z nich może być podłączony z różnymi wyprowadzeniami. To że linie PA2 oraz PA3 mogą być podpięte do UART-a nie oznacza, że nie można ich skonfigurować jako zwykłe piny I/O. Jednak na płytce Nucleo są one fizycznie połączone z mikrokontrolerem programatora, więc podłączenie np. Przycisku może uszkodzić programator. Jeśli programator zostanie odłączony (przez rozłamanie płytki) lub wylutujemy odpowiednie zworki, możliwe będzie użycie PA2 i PA3 jako zwyłych pinów - ale jest wiele innych dostępnych bez komplikacji, więc może lepiej ten przycisk podłączyć do wolnych wyprowadzeń?

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

Różnice między F4 a F1 dla biblioteki HAL. Podczas pisania na F4 gpio.Mode = GPIO_MODE_AF_INPUT wygeneruje błąd, nie ma takiej stałej. Jest tylko GPIO_MODE_INPUT. Jak się nie skompiluje to nie jest źle, od razu wiadomo co nie tak. Ciekawe co się stanie, gdy migracja będzie w drugą stronę. Kod z F4 będzie miał gpio.Mode = GPIO_MODE_INPUT, na F1 się skompiluje, ale czy UART będzie działał?

Link do komentarza
Share on other sites

Da ktoś podpowiedź jak zrobić zad. 5.2. ? Nie mam pojęcia za bardzo pojęcia gdzie szukać.

HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)

zmieniałem wartość size, ale nadal odczytuje mi tylko 1 znak z klawiatury.

Link do komentarza
Share on other sites

@wierczewski, witam na forum 😉 Widzę, że to Twoje pierwsze kroki na Forbocie, oto najważniejsze informacje na start:

  • Chcesz przywitać się z innymi członkami naszej społeczności? Skorzystaj z tematu powitania użytkowników.
  • Opis najciekawszych funkcji, które ułatwiają korzystanie z forum znajdziesz w temacie instrukcja korzystania z forum - co warto wiedzieć?
  • Poszczególne posty możesz oceniać (pozytywnie i negatywnie) za pomocą reakcji - ikona serca w prawym dolnym rogu każdej wiadomości.

50 minut temu, wierczewski napisał:

Nie mam pojęcia za bardzo pojęcia gdzie szukać.

Pokaż co konkretnie zmieniałeś i jak według Ciebie taka wersje programu miała dokładnie działać - naprowadzimy Cie delikatnie na rozwiązanie 😉

Link do komentarza
Share on other sites

@TrekerJa zrozumiałem tą funkcję(hal_uart_receive) w ten sposób, iż parametr size określa rozmiar buforu do jakiego są załadowywane dane. Więc jeśli zwiększę rozmiar z 1 na większa wartość to zwiększę ilość znaków jakie mogę przesłać do niego. Aczkolwiek jak to teraz napisałem to jednak mylnie to zrozumiałem i tu chodzi o wielkość pojedynczego znaku. Tzn aby wykonać to zadanie muszę stworzyć pętle wykonującą się 3 razy aby wczytać do jakiejś tablicy char znaki, a następnie je porównać w switchu?

Link do komentarza
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...

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.