Programowy UART w trybie full-duplex dla LPC111x oraz LPC13xx

 

 

 

 

Rodziny mikrokontrolerów LPC111X (rdzeń ARM Cortex-M0) i LPC13XX (rdzeń ARM Cortex-M3) oferują bogaty wybór interfejsów komunikacyjnych. Każdy z mikrokontrolerów zawiera asynchroniczny układ nadawczo-odbiorczy UART. Jednak w pewnych sytuacjach zachodzi potrzeba wykorzystania większej liczby interfejsów UART, niż jest dostępnych w urządzeniu. W takich przypadkach można dołączyć zewnętrzne, osobne układy będące kontrolerami UART, jednak lepszym rozwiązaniem jest programowa implementacja dodatkowego interfejsu UART w mikrokontrolerze, co pozwala zaoszczędzić koszty i miejsce na płytce PCB. Dzięki temu rozwiązaniu projektanci mogą zmniejszyć rozmiar gotowego urządzenia oraz jego cenę. W artykule opisano jedną z możliwych implementacji programowych interfejsu UART w trybie full-duplex.

 

 

Prezentowana implementacja UART została przeniesiona na modele LPC111X oraz LPC13XX z mikrokontrolera LPC2000. Opis implementacji UART na układzie LPC2000 można odnaleźć w nocie aplikacyjnej AN10689.

Przedstawione oprogramowanie nie jest zoptymalizowane. Po starannej optymalizacji wielkości kodu, przestrzeń pamięci potrzebna na dodanie programowej obsługi UART w istniejącym projekcie może zająć jedynie 1 kB. Jeśli praca w trybie full-duplex nie jest wymagana, rozmiar kodu można jeszcze zmniejszyć, usuwając nieużywane funkcje UART.

Implementacja

Rozwiązanie programowe opiera się na 32-bitowym liczniku i jego zdolności do zmiany stanu na określonym wyprowadzeniu podczas jednoczesnego monitorowania stanu innego wyprowadzenia. Gdy funkcje odczytu i zmiany stanu są wykorzystywane, procedura odbiorcza korzysta z dodatkowego rejestru wzorca (match register) licznika. Każdy z liczników ma cztery takie rejestry (ich wykorzystanie opisuje tabela 1). W tej implementacji użyty został licznik Timer32_0. W tabeli 2 opisano parametry pracy interfejsu UART w przykładowym kodzie.

 

Tabela 1. Wykorzystanie rejestrów wzorca

Licznik MRn Funkcja
MR0 RX
MR1 RX
MR2 Dostępny dla użytkownika
MR3 TX

 

Implementacja programowa korzysta z kolejki FIFO o odpowiednio dobranej długości, pozwalając na buforowania zarówno informacji nadawanych, jak i odbieranych. Warto zauważyć, że przepustowość układu UART oraz długość kolejki FIFO nadajnika i odbiornika jest ustalana w czasie procesu kompilacji i nie może być zmieniana podczas pracy programu.

 

Tabela 2. Parametry pracy interfejsu UART

Parametr Wartość
Bity startu 1
Bity danych 8
Bity stopu 1
Bity parzystości brak

 

Przykładowy kod źródłowy wykorzystuje kompatybilność wyprowadzeń układów LPC111X oraz LPC13XX, dzięki czemu wymaga minimalnych zmian w celu przystosowania do danej platformy. Tabela 3 zawiera listę funkcji przyporządkowanych pinom używanym w programie demonstracyjnym. Wykorzystane na potrzeby przetestowania implementacji interfejsu UART zestawy ewaluacyjne przedstawione w niniejszym artykule są wyposażone w układ konwertujący sygnały UART do RS-232 lub USB. Wyprowadzenia związane z programowym interfejsem UART muszą być podłączone do tych układów w celu komunikacji z komputerem PC. Jako, że piny mikrokontrolerów LPC111X i LPC13XX domyślnie używają konfigurowalnych rezystorów podciągających, podczas konfiguracji portów P1.6 i P1.7 powinny one zostać wyłączone, by nie łączyć się z sygnałami programowego UART.

 

Tabela 3. Funkcje wyprowadzeń

Numer pinu Konfiguracja Opis
P0.11 CT32B0_MAT3 Sprzętowy rejestr Tx
P1.5 CT32B0_CAP0 Sprzętowy rejestr Rx
P1.6 GPIO (nieaktywny) RS-232 sterownik Rx
P1.7 GPIO (nieaktywny) RS-232 sterownik Tx
P1.11 Wyjście flaga CALL (aktywna w stanie niskim)
P3.0 Wyjście flaga TX_PRO (aktywna w stanie niskim)
P3.1 Wyjście flaga przerwania INT CT32B0 (aktywna w stanie niskim)
P3.2 Wyjście flaga przerwania INT_TX Tx (aktywna w stanie niskim)
P3.3 Wyjście flaga przerwania INT_RX Rx (aktywna w stanie niskim)

 

O autorze