[3] Kurs: pierwsze kroki z STM32F0DISCOVERY. Zabawy z USART

Uwaga! Opublikowane odcinki kurs są dostępne pod adresem.

 

Samouczek jest dedykowany szczególnie tym projektantom, którzy stają przed perspektywą zmiany mikrokontrolera z 8-bitowego na nowszy i tańszy 32-bitowy. Wszystkie programy są napisane w języku C. W przykładach nie użyto bibliotek służących do obsługi peryferiali, dzięki czemu kod programów jest krótki i czytelny, a zajętość pamięci znacznie mniejsza, niż w typowych programach demonstracyjnych, udostępnianych przez producentów mikrokontrolerów. Zwrócono również szczególną uwagę na poprawność prezentowanych rozwiązań i sposób zapisu programu ułatwiający optymalizację kodu i wychwytywanie błędów przez kompilator. Przedstawione programy zostały napisane w taki sposób, że nie generują one żadnych ostrzeżeń kompilatora. Przykłady przygotowano na zestaw STM32F0DISCOVERY.

 

Port szeregowy USART

Mikrokontrolery STM32F051 są wyposażone w sterownik transmisji szeregowej USART, który może służyć do transmisji zarówno asynchronicznej, jak i synchronicznej. Użyty w trybie asynchronicznym, może on np. sterować interfejsem RS232. Na płytce DISCOVERY (STM32F0DISCOVERY) nie ma translatorów poziomów RS232, jednak własności elektryczne i logiczne STM32F05x umożliwiają współpracę z interfejsem RS232 bez użycia translatora, o ile transmisja odbywa się w warunkach laboratoryjnych – na małą odległość i bez zakłóceń. Do połączenia mikrokontrolera z interfejsem RS232C komputera  PC potrzebny będzie tylko jeden rezystor o wartości od 47 do 100 k?.

Przedstawiony poniżej projekt oprogramowania powstał przez modyfikację projektu BtnBlink. Nosi on nazwę USART1.

 

Zaprogramowanie modułu USART

Przed zaprogramowaniem modułu USART należy określić parametry transmisji. Wybierzemy szybkość 9600 bit/s, format 8-bitowy bez parzystości, z jednym bitem stopu. Wartość, która posłuży do zaprogramowania szybkości transmisji, zdefiniujemy jako wyrażenie preprocesora. Ponieważ nie użyjemy układu translatora poziomów RS232C, zaprogramujemy odwracanie poziomów napięć na liniach RX i TX.

W celu zaprogramowania modułu USART należy:

  • Włączyć moduł poprzez ustawienie bitu USART1EN w rejestrze APB2ENR.
  • Włączyć port GPIOA.
  • Wybrać funkcję AF 1 (RX i TX USART1) dla wyprowadzeń 10 i 9 portu GPIOA.
  • Włączyć ściąganie w dół dla linii RX
  • Ustawić linie 10 i 9 portu GPIOA jako AF, pozostawiając funkcje interfejsu SWD dla linii 14 i 13.
  • Ustawić podzielnik szybkości transmisji w rejestrze BRR modułu USART1.
  • Włączyć odwracanie polaryzacji linii RX i TX – bity TXINV i RXINV rejestru CR2.
  • Włączyć przerwanie odbioru danych, zezwolenie na nadawanie i odbiór oraz cały układ USART1 w rejestrze CR1 – musi to być ostatnia czynność podczas programowania rejestrów modułu USART.
  • Włączyć przerwanie USART1 w module NVIC – rejestr ISER[0].

Ponieważ w projekcie użyjemy przerwania modułu USART, należy je oprogramować. Jedynym włączonym źródłem tego przerwania będzie odebranie danej. Procedura obsługi przerwania USART1 odczytuje odebrany znak i poddaje go prostemu przetwarzaniu. Małe litery są zamieniane na wielkie i odwrotnie, a odebranie kodu CR powoduje, poprzez ustawienie zmiennej mchange, zmianę trybu świecenia diod. Po przetworzeniu znak zostaje odesłany z powrotem.

Podczas wysyłania znaku do PC nie jest sprawdzana gotowość nadajnika USART. W naszym przykładzie nie ma to znaczenia, gdyż przy nadawaniu z komputera PC znaków wprowadzanych przez użytkownika w programie terminala nie ma możliwości przepełnienia bufora nadajnika interfejsu USART mikrokontrolera znakami odsyłanymi zwrotnie Nie jest to jednak uniwersalny sposób programowej obsługi nadawania, który może być zastosowany w każdej sytuacji. Poprawne nadawanie danych z użyciem przerwań zostanie zaprezentowane w następnym przykładzie.

 

Połączenie modułu STM32F0DISCOVERY z komputerem

W celu umożliwienia komunikacji modułu z komputerem PC należy poprowadzić trzy połączenia – masy oraz dwóch linii danych. Ponieważ zasilamy moduł STM32F0 z komputera, masa jest już połączona przez port USB. Do nawiązania transmisji wystarczy więc wykonać połączenia linii danych z komputera do modułu i z modułu do komputera. Wyjście danych mikrokontrolera – linię 9 portu GPIOA – łączymy bezpośrednio z wejściem danych komputera PC – linią 2 złącza DB9. Wejście danych mikrokontrolera – linię 10 portu GPIOA – łączymy przez rezystor szeregowy 100 k? z wyjściem danych komputera PC – linią 3 złącza DB9. Podczas wykonywania połączeń należy zachować szczególną uwagę – błędne podłączenie wyjścia danych mikrokontrolera do niewłaściwej linii złącza DB9 może spowodować trwałe uszkodzenie mikrokontrolera.

 

Do pobrania

O autorze