Jak utworzyć projekt na STM32 pod pisanie na rejestrach?
Od bardzo długiego czasu czytelnicy i kursanci pytają się mnie: “MATI! A kiedy zrobisz coś na STM32, ale na rejestrach?”. Na ogół odpowiadałem, iż “jak przyjdzie czas”, ale sam nie wiedziałem kiedy to nastapi.
Do teraz Właśnie rozpoczynamy cykl wpisów poświęcony programowaniu STM32 na rejestrach właśnie
Będzie to kilkanaście wpisów z podstawami. Idealne na początek dla wszystkich, kto chce rozpocząć swoją przygodę z STM32 bez HALa i bez Arduino.
Seria STM32 na Rejestrach na YouTube
Wpisy te powstają równolegle do serii na moim YouTube o tej samej tematyce. jeżeli wolisz wersję video to zapraszam Cię właśnie tam. Artykuły te są skrótem z tego, co pokazuję na YouTube.
Platforma STM32 NUCLEO-C031C6
Będziemy programowali sprzęt, więc siłą rzeczy musimy go mieć. Do tej serii wybrałem STM32 z rodziny C0. Wyszła ona na początku 2023 roku. Została stworzona z myślą prostego zastąpienia mikrokontrolerów 8-bitowych.
Jest bardzo minimalistyczna i “uboga” w peryferia jak na przystało STM32. Jednocześnie układy te są nieskomplikowane, co ułatwi nam czytanie dokumentacji i stawianie pierwszych kroków.
Wybrałem konkretnie STM32C031C6T6. Dlaczego? Mamy do niego dedykowaną płytkę NUCLEO-C031C6, którą możesz kupić między innymi w moim sklepie.
Jest to gotowa platforma z mikrokontrolerem, która jest od razu gotowa do pracy. Co z programatorem? No właśnie. Zestawy Nucleo cechują się tym, iż mają wbudowany programator i debuger ST-Link. Tak też jest tutaj. Jest on odpowiednio podłączony i gotowy do pracy. Wystarczy wpiąć przewód USB (w naszym wypadku micro) i płytka jest gotowa do działania.
Oprócz programatora znajdziemy tutaj złącza. Mamy dwa rodzaje złącz:
- Zgodne z Arduino Uno Rev 3. Standard w dzisiejszym świecie. Pasują tutaj shieldy zbudowane z myślą o Arduino.
- ST Morpho. Dwa duże złącza, na które wyprowadzone są wszystkie piny mikrokontrolera na Nucleo.
Do użytku mamy również dwa przyciski: przycisk użytkownika podłączony do jednego z pinów, oraz Reset mikrokontrolera.
W okolicach przycisków zawsze jest co najmniej jedna dioda LED, która również jest do naszego użytku. Na naszym Nucleo oznaczona jest jako LD4.
Potrzebne dokumentacje
Datasheet – w uproszczeniu DS
Nota konkretnego mikrokontrolera i jego ogólny opis. Znajdziesz tutaj ogólny opis funkcjonalny całego układu. Z jakich peryferiów się składa i co one robią (tak z grubsza). Bardzo interesujący elementem jest diagram blokowy, z którego nie raz w tej serii skorzystamy. Z niego dowiadujemy się o wewnętrznych połączeniach między poszczególnymi peryferiami mikrokontrolera.
W datasheecie znajdziesz pinout, czyli jakie wyjścia są wyprowadzone na którą nóżkę obudowy. Często te dokumentacje pokrywają kilka obudów. Zaraz za pinoutem znajdziesz spis wszystkich funkcji alternatywnych danego pinu. W tym miejscu dowiesz się jakie dodatkowe funkcje może spełnić dany pin. W tym miejscu również dowiesz się, czy dany pin toleruje na sobie napięcie 5V. STM32 domyślnie działają z napięciem 3,3V, ale większość z ich pinów jest 5V-tolerant.
Następną kategorią informacji w Datasheecie jest charakterystyka elektryczna. Znajdziesz tutaj wszystkie informacje odnośnie zasilania, maksymalnych prądów, a także schemat poprawnego zasilania mikrokontrolera. Przydatne przy robieniu własnego urządzenia.
Na samym końcu są informacje o obudowach i ich wymiarach. Gdybyś kiedyś chciał robić płytkę PCB pod mikrokontroler, to z pewnością z tego skorzystasz… albo znajdziesz gotową bibliotekę elementów.
Reference Manual – w uproszczeniu RM
Największy z potrzebnych dokumentów i w zasadzie niezbędny przy programowaniu na rejestrach. Będziemy go maltretować przez całą tę serię. Co w nim znajdziemy?
Dokładny opis każdego z elementów mikrokontrolera. Wszystkie peryferia, pamięci, układy zegarów i zasilania są tutaj szczegółowo opisane. Oprócz rdzenia. Ten ma oddzielną dokumentację, ale nie będzie nam potrzebna w tej serii.
Znajdziesz tutaj opis funkcjonalny, czyli to jak działają i jakie mają poszczególne funkcje i tryby dane peryferia. Oprócz szczegółowego opisu jest tutaj także dokładny opis rejestrów oraz ich zawartości.
To stąd będziemy brali większość informacji o tym jak ustawić konkretne peryferium, oraz jak go użyć. Programowanie mikrokontrolerów to ciężka orka na dokumentacji. Często jest ona zawiła dla osób początkujących, ale gwałtownie idzie nabrać wprawy.
Nie będę tutaj omawiał, jakie mamy tutaj rozdziały. Będziemy je stopniowo odkrywali w ramach potrzeb.
Errata – w uproszczeniu ES
Niektórzy mówią, iż jest ważniejsza niż pozostałe. Dlaczego? Tutaj znajdują się znane i upublicznione błędy w krzemie mikrokontrolera. Czasami bywa tak, iż robisz wszystko według Reference Manuala i przez cały czas nie działa. Rozwiązanie może być właśnie w Erracie.
To tutaj producent podaje co nie działa i jak sobie z tym poradzić. Są to tzw. Workarounds, czyli obejścia problemów. Albo sprzętowe, albo programowe w zależności co jest popsute.
Widziałem ciekawą tezę na podstawie erraty. Mówiła ona mniej więcej tyle, iż po tym dokumencie można stwierdzić, czy producent ma w poważaniu producentów sprzętu korzystających z ich układów. Bo jeżeli przez kilka kolejnych serii mikrokontrolerów pojawia się dokładnie taki sam błąd, to o czym to świadczy? Niektórzy mówią, iż o braku szacunku właśnie
Ja mam nieco inne zdanie na ten temat. Czasami jest to po prostu nieopłacalne ekonomicznie
Dokumentacja Nucleo
W tej serii będziemy pracowali na płytce ewaluacyjnej NUCLEO-C031C6. Warto również i do niej warto zaopatrzyć się w przydatną dokumentację. Wyróżniłbym 3 przydatne dokumenty. Do pobrania są na stronie Twojej płytki Nucleo. Nasza płytka: https://www.st.com/en/evaluation-tools/nucleo-c031c6.html
- Data Brief / Specyfikacja
Krótki dokument ze specyfikacją płytek Nucleo. Dotyczy on całej podobnej serii. Z niego dowiemy się co oprócz mikrokontrolera znajduje się na naszym Nucleo. jeżeli chciałbyś użyć tego samego mikrokontrolera na swoim PCB, to tutaj znajdziesz jego dokładny model.
- User Manual
Opis elementów i konfiguracji płytki Nucleo. Zestawy deweloperskie mają możliwość sprzętowej zmiany konfiguracji. Umożliwiają to różnego rodzaju zworki. Mamy zworki duże, które możemy zmieniać manualnie. Mamy też zworki małe w postaci rezystorów SMD, które trzeba będzie przelutować.
W tym dokumencie opisane są między innymi możliwości konfiguracji naszej płytki Nucleo. Znajdziesz tutaj również pinout i spis funkcji, które możesz doprowadzić na złącza Nucleo.
Tutaj też się dowiesz o wbudowanym ST-Linku i o tym jak go użyć do programowania zewnętrznych układów. Nie jest on skazany na pracę tylko z Nucleo. Z powodzeniem możesz go używać “na zewnątrz”.
- Schemat
Ostatnim dokumentem będzie schemat Nucleo. Firma ST jest na tyle uprzejma, iż do wszystkich swoich evali udostępnia schematy w formie PDF. Tutaj będziemy zerkali, aby sprawdzić, w jakiej konfiguracji dołączony jest przycisk do mikrokontrolera.
Ze schematu możemy sporo wyczytać. Czasami zdarza się, iż niektóre piny są ze sobą z jakiegoś powodu połączone. Tutaj dowiesz się co to za połączenia.
Schematem możesz też się posłużyć jeżeli będziesz chciał zaprojektować własne PCB.
Schemat znajdziesz w zakładce CAD.
Utworzenie projektu w STM32CubeIDE
Działam na wersji 1.12.1, ale dla pisania na rejestrach nie ma ona większego znaczenia. No własnie… CubeIDE do pisania na rejestrach? Dlaczego? Pokażę Ci jak sprytnie wykorzystać to środowisko, aby ułatwić sobie życie.
Teraz co musimy zrobić, aby pisać kod? Lecimy po kolei:
Tworzymy pusty projekt. Musimy stworzyć nowy, czysty projekt. W pierwszej kolejności otworzy Ci się MCU Selector. Skorzystaj z zakładki MCU/MPU Selector i wpisz model mikrokontrolera. Nasz to STM32C031C6T6.
W konfiguratorze musisz uważać, aby nie zaznaczyć opcji generowania projektu bazującego na HALu. Wybierz tutaj Empty Project. Nazwij projekt jak chcesz i kliknij Finish.
Mamy projekt. Niestety nie da rady jeszcze w nim nic pisać. Potrzebujemy dodać biblioteki CMSIS i nagłówki dla mikrokontrolera. Mamy dwie opcje do wyboru. Albo szukamy w Internetach… albo wyciągniemy je z projektu opartego na HALu. Tak właśnie między innymi po to nam CubeIDE
Stwórz drugi projekt w taki sam sposób, ale na końcu zaznaczając STM32Cube zamiast Empty. To będzie nasz projekt-dawca.
Aby dodać nagłówki mikrokontrolera potrzebujemy skopiować kilka folderów:
- /Drivers/CMSIS/Device/ST/STM32C0xx
- /Drivers/CMSIS/Include
Utworzyliśmy nowy folder – Drivers. Nie jest on domyślnie dodany do kompilacji. Musimy go wrzucić do listy kompilatora. Kliknij PPM (Prawy Przycisk Myszy) na projekcie i wejdź w Properties. Następnie odnajdź konfigurację C/C++ General > Paths and Symbols > Source Location i dodaj folder Drivers używając Add Folder.
Teraz dodajmy Include dla Device i CMSIS do ścieżek Include w projekcie. Będzie można je dużo łatwiej dołączać. Zamiast pisać całą ścieżkę, po prostu będziemy wpisywać samą nazwę pliku.
Nadal zostajemy w Properties naszego projektu. Tym razem wchodzimy w C/C++ Build > Settings > MCU GCC Compiler > Include paths i w tym miejscu dodajemy dwa wpisy prowadzące do naszych nagłówków.
- ../Drivers/CMSIS/Device/ST/STM32C0xx/Include
- ../Drivers/CMSIS/Include
Teraz możemy pisać kod tylko… jeszcze nie wiemy co i jak. Skąd się dowiemy? Oczywiście ode mnie, ale to już w kolejnym wpisie.
Podsumowanie
Jak widzisz trochę tych elementów “wstępnych” jest. Jednak nie jest to takie straszne i z pomocą STM32CubeIDE idzie to dosyć sprawnie.
W kolejnym wpisie zajmiemy się GPIO Output. Będziemy robić mikrokontrolerowego Hello Worlda, czyli miganie diodą
Daj znać w komentarzu czy Ci się podobał ten wpis! Może masz jakąś propozycję co pokazać w ramach cyklu STM32 na Rejestrach? Podziel się tym artykułem ze znajomymi.
Projekt z tego artykułu znajdziesz na: https://github.com/lamik/stm32narejestrach_1