Jak więc przetestować swój układzik, gdy mamy wykonać jego kilka kopii i trzeba sprawdzić, czy wszystko jest dobrze polutowane? Oczywiście jest mnóstwo metod na to. Można wgrać docelowy wsad i jeśli coś będzie nie tak to to zobaczymy. Sam robiłem tak, że miałem programiki na osobne peryferia zachowane gdy pisałem kod projektu i mogłem je kolejno wgrać. Jednak zawsze przewijała się podstawowa kwestia - testowanie GPIO (output/input) oraz napięć w układzie. Tu mi wpadł pomysł - zrobienie bardziej "uniwersalnego" kodu do takich rzeczy. Wybrałem komunikację przez uart z prostymi komendami AT opartymi o moja bibliotekę z GITa, więc dla niej to kolejny test użyteczności w praktyce.
Uwaga - projekt w fazie rozwojowej, ale w sumie dość prosty, więc dużo nie zajmie, ale wolę zawsze się tu zapytać - zawsze ktoś coś fajnego podpowie Po posprzątaniu i przetestowaniu wszystko pójdzie na GITa.
Jak pisałem wcześniej - funkcjonalności o jakie mi chodziło najbardziej to proste GPIO i ADC. Na upartego można dodać wiele innych rzeczy - uarty, SPI itp, ale wtedy nie będzie to już "proste CLI".
Więc zacznijmy od GPIO. Do dyspozycji mamy komendy:
- Konfiguracja danego pinu:
AT+GPIO_INIT=<port_gpio>,<nr_pinu>,<tryb>,<parametr>
gdzie:
port_gpio -> GPIOA/GPIOB/GPIOC/GPIOD/GPIOF (w F030F4P6 nie ma E)
nr_pinu -> 0-15
tryb -> OUTPUT, INPUT, ALTERNATE, ANALOG
parametr -> zalezny od trybu -> jeśli jest to:
OUTPUT -> 0 - stan niski, 1 - stan wysoki
INPUT -> 0 - no pullup/pulldown, 1 - pullup, 2 - pulldown
ANALOG -> pomijalny
ALTERNATE -> numer funkcji alternate, ale obecnie niewykorzystywane - może w przyszłości
Przykład:
AT+GPIO_INIT=GPIOA,6,OUTPUT,0 - Ustawienie stanu pinu:
AT+GPIO_OUT=<gpio>,<numer_pinu>,<stan(0/1)>
tu chyba nie muszę tłumaczyć
Przykład:
AT+GPIO_OUT=GPIOA,5,1 - Odczyt pinu:
AT+GPIO_IN=<gpio>,<numer_pinu>
odpowiedź od układu to:
Stan pinu: HIGH
lub
Stan pinu: LOW
To teraz ADC. Użyłem zwykłej konfiguracji pojedynczego pomiaru.
- Inicjalizacja ADC:
AT+ADC_INIT
tu wszystko jasne.
Oczywiście musimy ustawić wybrany pin w tryb analog komendą:
AT+GPIO_INIT=GPIOA,5,ANALOG,0 - I pomiar robimy w taki sposób:
AT+ADC_START=<numer_kanału_ADC>
kanał odczytujemy z dokumentacji.
Przykład pomiaru:
Wynik pomiaru ADC to: 2417 - Ale idąc trochę dalej - sam wynik z przetwornika dla nas nie jest zbytnio przyjazny. Dlatego istnieje kolejna komenda:
AT+ADC_START_V=<numer_kanalu>
i ona zwraca wynik w takiej formie:
Napięcie na ADC to: 1,946V
Skąd to przeliczenie? Otóż wynik jest mnożony przez 3300 (bo napięcie odniesienia to 3v3), a potem dzielony przez 4096(12bitowy przetwornik). Wyświetlam najpierw ten wynik przez 1000, potem modulo i mamy ładny zapis z 3 miejscami po przecinku. - Nie zawsze jednak mierzymy napięcia, które toleruje ADC procka - czasem potrzebny jest dzielnik. jak więc wtedy to przeliczyć? Otóż wspomniane wyżej współczynniki są zapisane w dwóch zmiennych (A i B). Możemy zobaczyć ich wartości komendą:
AT+ADC_GET_AB
A=3300 B=4096 - I możemy je ustawić jak tylko chcemy komendami:
AT+ADC_SET_A=<wartosc_wspolczynnika_A>
AT+ADC_SET_B=<wartosc_wspolczynnika_B>
Jak mamy kilka płytek do przetestowania mozemy to zrobić jakimś skryptem/przyciskami w programie do komunikacji z uartem na PC, czy skryptem w pythonie.
Kod wyląduje na gicie i potem go tutaj podlinkuje do zerknięcia.
Co myślicie o tym pomyśle, jakieś koncepcje na rozbudowanie/jakie jeszcze funkcjonalności mogą być przydatne? Konstruktywna krytyka mile widziana