[6] STM32CUBE w przykładach (obsługa interfejsu I2C)

Nie jest możliwe dokonanie pomiaru tylko ciśnienia atmosferycznego, polecenia należy wykonywać w ściśle określonej, przedstawionej powyżej, kolejności.

Obliczenie wysokości n.p.m. możliwe jest poprzez podstawienie zmierzonej wartości ciśnienia do wzoru:

gdzie p to zmierzona wartość ciśnienia, a p0, to aktualna wartość ciśnienia przy poziomie morza (np. 1013.25 hPa).

Rys. 5. Algorytm odczytu danych z czujnika (źródło: karta katalogowa układu BMP180)

 

Tworzymy projekt…

Utworzymy teraz prosty projekt realizujący opisaną powyżej procedurę odbioru danych z czujników i nadający te dane do komputera, poprzez interfejs UART, programator ST-LINK i kabel USB.

  1. Uruchamiamy program STM32CubeMX i tworzymy w nim nowy projekt. W kreatorze wyboru mikrokontrolera, wybieramy posiadany przez nas układ. Dla przypomnienia – na używanej podczas tworzenia kursy płytce rozwojowej Kamami KA-NUCLEO-F411, znajduje się układ STM32F411CEU6.
  2. Na pierwszej planszy generatora konfiguracji STM32CubeMX definiujemy interfejsy i piny z jakich będziemy korzystać w programie.

Jeśli do posiadanego przez nas układu podłączony jest zewnętrzny oscylator kwarcowy (tak jak na płytce Kamami KA-NUCLEO-F411), z listy po lewej stronie okna rozwijamy zakładkę RCC i z pola “High Speed Clock (HSE)” wybieramy pozycję “Crystal/Ceramic Resonator”.

Układ STM32F411CEU6 posiada 3 interfejsy I2C, które możemy uruchomić na wyprowadzeniach procesora: peryferial I2C1 – PB7 (linia SDA) / PB6 (linia SCL) lub PB9/PB8, I2C2 – PB3/PB10 lub PB9/PB10 oraz I2C3 – PB4/PA8 lub PB8/PA8. W omawianym przykładzie wybrany został peryferial I2C1 oraz piny PB7/PB6, odpowiadające wyprowadzeniom płytki – D9 i D10. Do tych wyprowadzeń podłączamy czujnik BMP180. Nie możemy też zapomnieć o rezystorach podciągających 4.7 kΩ (patrz schemat podłączenia), a także o połączeniu mas układów oraz zasileniu czujnika – napięciem 3.3V. Po wybraniu peryferialu I2C oraz wyprowadzeń procesora, rozwijamy, na liście po lewej stronie okna programu STM32CubeMX, zakładkę odpowiadającą wybranemu peryferialowi i w polu “I2C”, wybieramy pozycję “I2C” – standardowy tryb pracy.

W projekcie skorzystamy także z interfejsu UART, a dokładniej paeryferialu UART2, przyłączonego na płytce KA-NUCLEO, poprzez wyprowadzenia układu – PA2 (TX) i PA3 (RX), do programatora, który umożliwi nam przekazania odczytów do komputera. Dokładny opis konfiguracji i działania interfejsu UART zawarty został w czwartej części kursu. Aby uruchomić interfejs UART, z listy w lewej części okna CubeMX, rozwijamy zakładkę “UART2” i w polu “Mode”, wybieramy opcję “Asynchonous”.

Rys. 6. Konfiguracja wyprowadzeń w programie STM32CubeMX

 

  1. Po skonfigurowaniu wyprowadzeń, przechodzimy do zakładki “Clock Configuration” i w identyczny sposób, jak w poprzednich częściach, konfigurujemy sygnał taktujący rozchodzący się po układzie. Jeśli do układu mikrokontrolera podłączony jest zewnętrzny oscylator kwarcowy, z pola “PLL Source MUX”, wybieramy pozycję “HSE” i w polu “Input frequency” wpisujemy częstotliwość (w MHz) sygnału generowanego przez oscylator (na płytce Kamami KA-Nucleo, jest to wartość 8 MHz). Dalej, w polu “System Clock MUX”, wybieramy pozycję “PLLCLK”. Następnie, w polu “HCLK (MHz), wpisujemy pożądaną częstotliwość taktowania całego układu, po przejściu przez pętlę PLL. Zazwyczaj wybieraliśmy w tym polu maksymalną dozwoloną częstotliwość – 100 MHz, w przypadku korzystania z peryferialu I2C, nie jest to jednak możliwe, dlatego proponuję wpisać tam nieco niższą częstotliwość np. 80 MHz.
Rys. 7. Zakładka “Clock Configuration” w programie STM32CubeMX
  1. Teraz możemy już przejść do zakładki “Configuration” i dokonać właściwej konfiguracji obu wykorzystywanych peryferiali – I2C1 oraz UART2.

Aby przejść do konfiguracji interfejsu I2C, klikamy przycisk “I2C1”, znajdujący się w polu “Connectivity”.

Konfiguracja peryferialu I2C dzieli się na dwie sekcje – “Master Features” oraz “Slave Features”. Tym razem, interesuje nas jedynie sekcja “Master Features”, zawierająca parametry pracy urządzenia nadrzędnego – mikrokontrolera. Układy STM32 mogą również pracować w trybie urządzenia podrzędnego, jako sterownik czujnika lub innego urządzenia. Istnieje też możliwość pracy w trybie MultiMaster, gdzie istnieje wiele urządzeń nadrzędnych.

Pola “I2C Clock Mode” oraz “I2C Clock Speed (Hz)” określają szybkość transmisji. Przy wyborze trybu “Standard Mode”, maksymalna częstotliwość taktowania jaką możemy ustawić to: 100 kHz. Po wyborze opcji “Fast mode”, w polu “I2C Clock Speed (Hz)” możemy wybrać maksymalną szybkość, równą: “400 kHz”.

Dla trybu pracy urządzenia podrzędnego (sekcja “Slave Features”), najważniejszymi opcjami są “Primary address length selection” oraz “Primary slave address”. Określamy w nich: długość adresu oraz sam adres urządzenia. W przypadku 7-bitowego adresu, należy podać liczbę dziesiętną z zakresu od 0 do 127. Na podstawie tej wartości poprzez jej pomnożenie przez 2 lub pomnożenie przez 2 i dodanie 1, generowane są “adresy”: nadawczy i odbiorczy.

Rys. 8. Konfiguracja interfejsu I2C w programie STM32CubeMX

W przypadku interfejsu UART, zadowalają nas domyślne parametry połączenia – Baud Rate: “115200”, Word Lenght: 8 bitów, brak bitu parzystości i 1 bit stopu.

Rys. 9. Konfiguracja interfejsu UART w programie STM32CubeMX
  1. Nie pozostaje nam już nic innego, jak wygenerować projekt i zaimportować go w środowisku IDE. Będąc jeszcze w programie STM32CubeMX, klikamy ikonę zębatki znajdującą się na pasku narzędziowym. W nowym oknie wybieramy nazwę projektu (pole “Project Name”), ścieżkę dostępu do miejsca w którym ma on zostać zapisany (“Project Location”), z pola “Toolchain / IDE”, wybieramy używane przez nas środowisko – “SW4STM32”, w zakładce “Code Generation”, zaznaczamy opcję “Generate peripheral initialization as a pair of ‘.c/.h’ files per pepipheral” i klikamy przycisk “OK”.
Rys. 10. Konfiguracja projektu w generatorze konfiguracji STM32CubeMX
  1. Uruchamiamy program System Workbench for STM32, zamykamy planszę powitalną, w ramce „Project Explorer” klikamy prawym przyciskiem myszy i jak zwykle, z menu kontekstowego wybieramy kolejno: „Import” -> „Existing Projects into Workspace”, podajemy ścieżkę dostępu, wybieramy nowo utworzony projekt i zatwierdzamy import przyciskiem „Finish”.
  2. Aby możliwe było korzystanie z wartości zmiennoprzecinkowych, w funkcji sprintf(), konieczne jest dodanie parametru „-u _printf_float” do linii polecenia linkera. Robimy to, klikając prawym przyciskiem myszy na nazwę nowego projektu, z menu kontekstowego, wybierając pozycję „Properties” oraz nawigując do „C/C++ Build” -> „Settings” -> „Miscellaneous” i dopisując do pola „Linker flags” wartość: „ -u _printf_float”.
Rys. 11. Zmiana parametrów wywołania linkera w środowisku IDE System Workbench for STM32

Do pobrania

Autor: