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