Ten poradnik zawiera szczegółowy opis wdrażania wbudowanego wyświetlacza STM32-U5 firmy Riverdi w projekcie. Przedstawia on 5-calowy wyświetlacz LCD TFT z nowej oferty Riverdi, oparty na mikrokontrolerach z serii STM32U5, znanych z zaawansowanych funkcji oszczędzania energii.
Poradnik – Tworzenie elementów graficznych dla potencjometru ADC z wykorzystaniem wbudowanego wyświetlacza Riverdi STM32 Embedded Displays
Dzięki wdrożeniu interfejsu użytkownika opartego na technologii pojemnościowego dotyku, opracowanego przy użyciu TouchGFX, w tym samouczku pokazano, jak wyświetlić zmiany sygnału analogowego (z potencjometru) na graficznym interfejsie użytkownika (GUI) poprzez konfigurację modułu ADC, napisanie kodu oraz zintegrowanie zarządzania zadaniami i kolejkami z systemem FreeRTOS w środowisku STM32CubeIDE. Opisując szczegółowo każdy krok – od konfiguracji MCU za pomocą cubeMX, przez pisanie kodu zadania ADC, połączenie z GUI i jego aktualizację, aż po ostateczne wgranie projektu – samouczek pokazuje usprawniony proces tworzenia oprogramowania, który pozwala bezpośrednio generować projekty za pomocą cubeMX, eliminując kłopoty, jakie pojawiały się przy poprzednich wbudowanych wyświetlaczach Riverdi STM32-H7, a w efekcie zapewnia responsywny wskaźnik i wyświetlacz napięcia w GUI, które dostosowują się do zmian na potencjometrze.
Ten poradnik przygotowała firma Controllerstech – Robotics Simplified, zajmująca się tworzeniem oprogramowania z siedzibą w Indiach. Ich celem jest dzielenie się wiedzą na temat oprogramowania dla mikrokontrolerów opartych na architekturze STM32. Poniżej przedstawiamy poradnik, który pierwotnie pojawił się tutaj: https://controllerstech.com/riverdi-stm32-u5-embedded-display/
Obejrzyj poradnik wideo:
Wbudowany wyświetlacz Riverdi STM32-U5
To kolejny poradnik poświęcony STM32 Embedded Displays firmy Riverdi, a dzisiaj mamy dla ciebie 5-calowy wyświetlacz LCD TFT z ich nowej oferty. Firma Riverdi specjalizuje się w produkcji różnych rodzajów wyświetlaczy, w tym wyświetlaczy opartych na platformie STM32, które od razu po podłączeniu obsługują bibliotekę TouchGFX. Wyświetlacz można kupić na stronie https://riverdi.com/product-category/stm32-embedded-displays
Ten wyświetlacz opiera się na MCU z serii STM32U5, które oferują zaawansowane rozwiązania energooszczędne oparte na architekturze Arm® Cortex®-M33, spełniające nawet najbardziej rygorystyczne wymagania dotyczące zużycia energii i wydajności. Dzięki pamięci flash o pojemności do 4 MB i pamięci SRAM o pojemności 2514 KB mikrokontrolery z serii STM32U5 przenoszą wydajność na zupełnie nowy poziom.
Opublikowałem już kilka poradników na temat wbudowanych wyświetlaczy Riverdi STM32-H7, w których pokazałem, jak skopiować gotowy projekt w inne miejsce, a potem zmodyfikować go w cubeMX i skopiować tylko potrzebne pliki z powrotem do oryginalnego projektu. Ten sposób działa, ale jeśli chcesz ponownie wygenerować projekt w CubeMX, wiąże się to z dużym wysiłkiem.
ALE dzięki tej nowej serii wbudowanych wyświetlaczy STM32-U5 możemy od razu odtworzyć projekt za pomocą cubeMX. Możemy nawet wgrać projekt za pomocą cubeIDE.
W tym samouczku odczytamy wartość potencjometru za pomocą przetwornika analogowo-cyfrowego (ADC), wyświetlacz pokaże zmiany wartości, a napięcie z ADC zostanie wyświetlone w polu tekstowym. W tym celu zbudujemy GUI przy użyciu biblioteki TouchGFX, a następnie wygenerujemy projekt ponownie za pomocą cubeMX, konfigurując urządzenie peryferyjne ADC, napiszemy kod i wgramy projekt za pomocą cubeIDE.
Projektowanie interfejsu użytkownika w TouchGFX
Utwórz projekt za pomocą TouchGFX


- Kliknij „Utwórz”, żeby utworzyć nowy projekt
- Wyszukaj „Riverdi”, żeby zobaczyć dostępne deski
- Wybierz wyświetlacz, który posiadasz. Ja mam 5-calowy model STM32U5.
- Nadaj nazwę projektowi
- Kliknij „Utwórz”, żeby utworzyć projekt.
Dodaj wymagane elementy do interfejsu użytkownika
Poniżej znajdziesz obrazek przedstawiający ostateczny projekt interfejsu użytkownika.


- Dodałem wskaźnik, którego wartości mogą wynosić od 0 do 100.
- TextArea1, na którym wyświetlacz wyświetli wartość na wskaźniku.
- TextArea2, które posłuży do wyświetlania napięcia z przetwornika ADC.
W obu polach tekstowych użyto symboli wieloznacznych, więc możemy aktualizować wartości bezpośrednio z kodu.
Po zaprojektowaniu interfejsu użytkownika wygeneruj projekt i otwórz go w programie cubeIDE.


Skonfiguruj projekt w programie cubeMX
Poniżej znajduje się rysunek przedstawiający wyprowadzenia złącza rozszerzeń oraz sposób podłączenia potencjometru do tego złącza.


Wykorzystamy kanał 11/12 przetwornika analogowo-cyfrowego (ADC1), który jest podłączony do pinu PA7 (pin 20). Domyślnie przetwornik ADC jest skonfigurowany w trybie różnicowym, ale żeby potencjometr działał, musimy ustawić go w trybie jednostronnym.
Poniżej znajdziesz konfigurację cubeMX.


Skonfigurowałem kanał 12 przetwornika ADC1 w trybie single-ended. Rozdzielczość przetwornika ADC jest ustawiona na 12 bitów.
Musimy też utworzyć zadanie i kolejkę, żeby wysłać dane z ADC do GUI. Poniżej jest obrazek pokazujący konfigurację zadania ADC.


Zadanie ADC ma ustawiony normalny priorytet. Będzie ono służyć do odczytu wartości z przetwornika ADC, a następnie wysłania jej do kolejki.
Musimy też skonfigurować kolejkę, żeby wysyłała dane do GUI. Poniżej jest obrazek pokazujący konfigurację kolejki.


Kolejka ADC jest skonfigurowana z 5 elementami typu integer. Będziemy wysyłać wartości z przedziału od 0 do 100, więc typ integer w zupełności wystarczy.
To już cała konfiguracja, jakiej potrzebujemy – wygenerujmy teraz projekt.
Napiszmy kod
Zdefiniowane przez nas zadanie ADC znajdziesz w pliku app_freertos.c.
{
for(;;)
{
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, 100);
uint16_t ADC_VALUE = HAL_ADC_GetValue(&hadc1);
HAL_ADC_Stop(&hadc1);converted_value = map(ADC_VALUE, 0, 4095, 0, 100);
if (osMessageQueueGetSpace(ADCQueueHandle) > 0)
{
osMessageQueuePut(ADCQueueHandle, &converted_value, 0, 0);
}
osDelay(100);
}
}
W zadaniu ADC odczytamy wartość z przetwornika ADC, a potem wyślemy ją do GUI za pomocą kolejki ADC.
- Używam trybu blokującego, żeby odczytać wartość z przetwornika ADC i zapisać ją w zmiennej ADC_VAL.
- Rozdzielczość przetwornika ADC jest ustawiona na 12 bitów, więc wartości będą mieścić się w przedziale od 0 do 4095.
- Następnie zamienimy te wartości na skalę od 0 do 100. Przekonwertowane wartości zostaną potem zapisane w zmiennej ` converted_val`.
- Następnie sprawdzimy, czy w kolejce jest jeszcze miejsce. Jeśli jest, wyślijmy tę wartość do kolejki.
- To zadanie będzie uruchamiać się co 100 ms. Po prostu odczytujemy wartość z potencjometru, więc czas i szybkość działania zegara nie są tu aż tak ważne.
Te wartości zostaną odebrane w modelu GUI. Poniżej znajduje się kod pokazujący implementację modelu.
{
if (osMessageQueueGetCount(ADCQueueHandle) > 0)
{
osMessageQueueGet(ADCQueueHandle, &ADC_VAL, 0, 0);
}
modelListener->setADC (ADC_VAL);
}
W modelu funkcja tick jest wywoływana przy każdym odświeżeniu ramki. W tej funkcji sprawdzimy, czy w kolejce są jakieś dane.
- Jeśli w kolejce są jakieś dane, odczytamy je i zapiszemy w zmiennej ADC_VAL.
- Ta zmienna jest zdefiniowana w pliku Model.hpp.
- Następnie wywołamy funkcję setADC w modelu modelListener.
Funkcja setADC jest zdefiniowana w pliku modelListener.hpp, ale powinna być zaimplementowana jako funkcja pusta. Pokazano to poniżej.
Ta pusta implementacja sprawia, że GUI szuka tej funkcji w pliku prezentera. To właśnie tam faktycznie zdefiniujemy tę funkcję.
{
view.setADC(val);
}
W prezenterze wywołamy tę samą funkcję, co w widoku.
W widoku właśnie pisze się tę funkcję. Poniżej znajdziesz definicję funkcji setADC
{
Unicode::snprintf(textArea1Buffer, TEXTAREA1_SIZE, „%d”, val);
textArea1.invalidate(); adc_voltage = (float)(val*3.3)/100.0;
Unicode::snprintfFloat(textArea2Buffer, TEXTAREA2_SIZE, „%.2f”, adc_voltage);
textArea2.invalidate();
gauge1.setValue(val);
gauge1.invalidate();
}
- Najpierw zamienimy tę wartość na format znakowy za pomocą funkcji snprintf, a potem skopiujemy ją do bufora textArea1.
- textArea1 jest umieszczone nad wskaźnikiem, więc będzie wyświetlać wartości z przedziału od 0 do 100.
- Następnie przekonwertujemy te wartości na zakres liczb zmiennoprzecinkowych od 0 do 3,3 – posłuży to do wyświetlania napięcia na pinie przetwornika ADC.
- Następnie przekonwertuj wartość typu float na format znakowy za pomocą funkcji snprintfFloat i skopiuj ją do bufora textArea2.
- Pole tekstowe textArea2 jest umieszczone poniżej wskaźnika i będzie wyświetlać wartości z przedziału od 0 do 3,3.
- Na koniec ustawimy wartość na wskaźniku.
To kończy naszą część kodu. Teraz wgramy projekt bezpośrednio z programu cubeIDE.
Wypal projekt
Zanim zaczniemy z flashowaniem, musimy trochę zmodyfikować konfigurację debugowania. Projekt wygenerowany przez TouchGFX nie tworzy pliku zewnętrznego modułu ładującego, więc musimy podać jego ścieżkę względem naszego systemu plików.
Otwórz konfigurację debugowania, kliknij kartę „Debugger”, przewiń w dół do sekcji „External Loaders”.


Kliknij na moduł ładujący, a potem kliknij „Edytuj”.
Teraz kliknij na „system plików”.


Teraz znajdź program ładujący w katalogu STM32cubeProgrammer. U mnie znajduje się on w Program Files -> STMicroElectronics -> STM32CubeProgrammer -> bin -> ExternalLoaders.
Gdy już znajdziesz programator, kliknij „Zastosuj”, żeby zapisać konfigurację, a potem kliknij „URUCHOM”, żeby wgrać projekt na płytkę.
Wynik
Poniżej znajdziesz gif przedstawiający wyświetlacz.


Jak widać, wskaźnik całkiem nieźle reaguje na obrót potencjometru. Pole tekstowe na wskaźniku pokazuje aktualną wartość wskaźnika.
Poniższe pole tekstowe pokazuje aktualne napięcie na pinie ADC, które może wynosić od 0 do 3,3 V.
Pobierz kod
Tutaj możesz pobrać kod udostępniony przez Controllertech: Potencjometr
Riverdi – europejski producent wyświetlaczy najwyższej jakości
Dlaczego warto nam zaufać i wybrać nasze produkty? Riverdi to europejski producent wyświetlaczy najwyższej jakości. Od ponad 10 lat produkujemy wyświetlacze TFT LCD i mamy wielu klientów na całym świecie, do których regularnie dostarczamy nasze produkty.
Na naszej stronie znajdziesz wiele serii różnych wyświetlaczy, ale dostarczamy nie tylko wyświetlacze najwyższej jakości, ale też doskonałą dokumentację. Na stronie znajdziesz też modele 3D każdego wyświetlacza, a większość z nich ma dołączony raport EMI, dzięki czemu dowiesz się, jaki jest poziom emisji. Proces składania zamówienia jest bardzo prosty – jeśli chcesz zamówić próbkę, możesz ją kupić w naszym sklepie internetowym. Wystarczy wejść na stronę https://riverdi.com/product-category/stm32-embedded-displays/.
Możesz też skontaktować się z jednym z naszych dystrybutorów. Riverdi dysponuje rozległą siecią dystrybucji, w tym wieloma partnerami w USA, którzy mogą od razu dostarczyć ci ten wyświetlacz.
Pamiętaj, żeby ZAPISZAĆ SIĘ do naszego kanału na YouTube i wypełnić FORMULARZ CZŁONKOWSKI pod adresem
, żeby być na bieżąco z materiałami Riverdi University i wydarzeniami na żywo!
ODKRYJ NASZĄ
Whitepaper
Osiągnij idealną interakcję użytkownika z wyświetlaczem dzięki odpowiedniemu czujnikowi Touch Sensor IC. Czy kiedykolwiek zmagałeś się z problemami związanymi z fantomowymi dotknięciami lub certyfikacją? Rozwiń swoje prace B+R jak profesjonalista dzięki naszemu Whitepaperowi!



