Skocz do zawartości
Ważne ogłoszenie » Kliknij i sprawdź informacje o nowym forum! Czytaj dalej... ×
Komentator

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

Recommended Posts

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.

Udostępnij ten post


Link to post
Share on other sites

Nareszcie!!! Błagam dodawajcie szybciej artykuły z tego kursu ;).

Udostępnij ten post


Link to post
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

Udostępnij ten post


Link to post
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ę! 1

Udostępnij ten post


Link to post
Share on other sites

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;

Udostępnij ten post


Link to post
Share on other sites

a gdzie przerawnia a gdzie dma w usart ??

niby kolejny krok ale niesmak pozostaje

Udostępnij ten post


Link to post
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ę! 1

Udostępnij ten post


Link to post
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?

Udostępnij ten post


Link to post
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ę! 1

Udostępnij ten post


Link to post
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ł?

Udostępnij ten post


Link to post
Share on other sites

Ja także zauważyłem tą różnice pomiędzy F4 i F1 jednak pomimo zmiany GPIO_MODE_AF_INPUT na GPIO_MODE_INPUT nadal uart nie działa :-(

macie jakiś pomysł czy jest jeszcze ktoś ?

pozdrawiam

Udostępnij ten post


Link to post
Share on other sites

pyszny21, _kurssprzet

Udostępnij ten post


Link to post
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

Zarejestruj nowe konto, to proste!

Zarejestruj nowe konto

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się

×