STM32Butterfly2: sterowanie LED RGB za pomocą wyspecjalizowanego sterownika PCA9633

Na początku programu realizowana jest inicjalizacja linii wykorzystywanych przez joystick. Odbywa się to poprzez włączenie zegara dla używanego portu GPIO, skonfigurowanie linii jako wejść i podciągnięciu ich do potencjału dodatniego. Za konfiguracje linii jako wyjścia odpowiada funkcja io_config_ext, która jako pierwszy parametr przyjmuje nazwę portu, jako drugi wartość określającą, które linie podlegają konfiguracji, natomiast trzeci i czwarty parametr określa tryb działania. Z kolei funkcja io_set_clr_mask powoduje podciągnięcie linii do VCC, funkcja do działania wymaga podania trzech parametrów. Pierwszy parametr funkcji określa port, drugi parametr określa, które linie zostają ustawione, a które wyzerowane, natomiast trzeci parametr jest maską blokującą zmianę stanu pozostałych linii.

W kolejnym kroku inicjalizowany jest licznik SysTick, realizuje to funkcja time_init(). Inicjalizacja polega na zapisaniu do odpowiedniego rejestru wartości określającej częstotliwość występowania przerwania od licznika SysTick, ustawieniu priorytetu przerwania oraz włączeniu licznika.

Następnie przeprowadzana jest inicjalizacja sprzętowego kontrolera magistrali I2C. Odpowiada za to funkcja i2cm_init, przyjmuje ona parametr, który określa częstotliwość taktowania wysyłanych danych. Listing funkcji inicjalizującej został przedstawiony poniżej.

 

W pierwszym kroku funkcji włączany jest zegar portu GPIO, w którym występują linie używane do transmisji. Następnie przeprowadzana jest konfiguracja linii jako alternatywne z otwartym drenem i podciągnięte do VCC. Funkcje użyte do tej konfiguracji są identyczne jak przy konfiguracji linii podłączonych do joysticka, opisanej powyżej. Kolejną czynnością jest włączenie zegara dla pierwszego kontrolera I2C. Włączenie zegara odbywa się poprzez ustawienie odpowiedniego bitu w rejestrze APB1ENR.

W kolejnym etapie następuje włączenie kontrolera I2C oraz jego zresetowanie. Czynność włączenia realizowana jest poprzez zapis bitu CR1_PE_SET, natomiast reset odbywa się poprzez udstawienie i wyzerowanie bitu CR1_SWRST, które oddzielone jest operacją nop(). Powyższe operacje wykonywane są na rejestrze I2C_CR1.

Następnie ustawiana jest częstotliwość kontrolera, wartość ta zapisana jest jako sześć najmłodszych bitów rejestru I2C_CR2. W celu zachowania stanu pozostałych bitu rejestru bez zmian rejestr najpierw jest odczytywany, następnie zerowane są najmłodsze bity, po czym na podstawie częstotliwości taktowania magistrali APB obliczana jest zapisywana wartość.

W następnym kroku ustawiana jest szybkość wysyłania danych, odpowiada za to funkcja i2cm_set_speed, która jako parametr przyjmuje częstotliwość transmisji. Do ustawienia powyższego parametru została wydzielona odrębna funkcja gdyż wymagane jest zachowanie odpowiedniej kolejności działania.

Kolejnym krokiem jest konfiguracja rejestru I2C_CR2, odbywa się to poprzez działanie na kopi zawartości. Na początku zerowana jest część bitów, po czym odbywa się ustawianie bitu ACK. Po wprowadzaniu zmian kopia zapisywana jest do rejestru.

Następnie poprzez zapis do rejestru I2C_OAR1 ustawiany jest adres urządzenia oraz zerowane rejestry I2C_SR1 i I2C_SR2 informujące o statusie kontrolera I2C. Na zakończenie przeprowadzana jest konfiguracja priorytetu przerwań i następuje ich włączenie.

Do pobrania

O autorze