Digilent Pmod i STM32 (cz. 8) – PmodMTDS, PmodRTCC i PmodCMPS2

PmodRTCC

Drugi z prezentowanych w tej części modułów to PmodRTCC zawierający zegar czasu rzeczywistego z kalendarzem oparty o układ Microchip MCP79410. Układ ten umożliwia dodatkowo ustawienie dwóch alarmów, generację fali prostokątnej, a także korzystanie z pamięci EEPROM (128 B) i SRAM (64 B). Do obsługi modułu PmodRTCC została udostępniona biblioteka RTCCI2C dostępna na stronie producenta: https://reference.digilentinc.com/pmod/pmod/rtcc/example_code. Jest ona przeznaczona dla środowiska MPIDE, dlatego na potrzeby opisywanego przykładu musiała ona zostać modyfikowana tak, aby mogła być użyta w środowisku Atollic z mikrokontrolerem STM32L496ZGT6.

Fotografia 4. Moduł PmodRTCC

Połączenie z modułem KAmeleon

Moduł PmodRTCC posiada 8-pinowe złącze dla interfejsu I2C (J2) i 2-pinowe złącze J1 zawierające piny MFP (Multi-Function Pin), a także GND. Pin MFP może pełnić różne funkcje, zależnie od konfiguracji układu – w prezentowanym przykładzie będzie on źródłem przerwań wywołanych wystąpieniem alarmu. Sygnały modułu PmodRTCC podłączono do złącza oznaczonego jako ARDUINO CONNECTOR na płytce KAmeleon zgodnie z tabelą 4 i fotografią 5.

Tabela 4. Sposób podłączenia modułu PmodRTCC do złącza ARDUINO CONNECTOR zestawu KAmeleon

Sygnał Numer pinu PmodRTCC Numer pinu KAmeleon ARDUINO CONNECTOR Pin mikrokontrolera
SCL 1 (J2) D15 PF14
SDA 2 (J2) D14 PF15
MFP 1 (J1) D13 PB10

Fotografia 5. Moduł PmodRTCC podłączony do płytki KAmeleon

Kod przykładu

Za obsługę interfejsu I2C odpowiadają trzy zmodyfikowane metody klasy RTCCI2C: begin, readValue i writeValue. Pierwsza z nich, przedstawiona na listingu 5, odpowiada za konfigurację interfejsu I2C4, a także pinu PB10 do obsługi przerwania. Przerwanie jest wykrywane na zboczu opadającym sygnału MFP w momencie wystąpienia alarmu. Dla komunikacji I2C konfigurowane są dwa piny – PF14 i PF15 oraz interfejs I2C4. Dla tego ostatniego konieczne jest podanie wartości rejestru TIMINGR, przedstawionego na rysunku 6. Jest on odpowiedzialny za generację odpowiednich przebiegów czasowych na liniach SDA i SCL: SCLL i SCLH definiują długość stanu niskiego i wysokiego sygnału SCL, SCLDEL oznacza opóźnienie pomiędzy ustawieniem wartości na linii danych a zboczem narastającym sygnału zegarowego, natomiast SDADEL opóźnienie pomiędzy zboczem opadającym zegara, a zmiana stanu na linii danych. Pole PRESC wyznacza dzielnik sygnału zegarowego taktującego układ I2C mikrokontrolera.

Kod programu z plikami projektowymi środowiska Atollic można pobrać w sekcji „Do pobrania”

Listing 5. Konfiguracja interfejsu I2C do komunikacji z modułem PmodRTCC

Rysunek 6. Definicja rejestru I2C_TIMINGR (źródło: dokumentacja mikrokontrolera STM32L496ZG)

Funkcje odpowiedzialne za komunikację z modułem PmodRTCC przedstawiono na listingu 6. Wykorzystują one blokujące wywołania HAL_I2C_Master_Transmit i HAL_I2C_Master_Receive biblioteki STM32Cube.

Listing 6. Funkcje realizujące odczyt i zapis rejestru.

Konfiguracja rejestrów MCP79410

Oprócz wymienionych funkcji, klasa RTCCI2C zawiera także metody konfigurujące poszczególne rejestry układu MCP79410. W tabeli 5 wymieniono funkcje użyte w kodzie przykładu. Wszystkie wartości są zapisywane i odczytywane w kodzie BCD.

Tabela 5. Metody klasy RTCCI2C użyte w przykładzie

Metoda klasy RTCCI2C Opis
startClock/stopClock Uruchomienie/zatrzymanie zegara przez włączenie/wyłączenie oscylatora.
setSec/getSec Zapis/odczyt sekund zegara lub alarmu.
setMin/getMin Zapis/odczyt minut zegara lub alarmu.
setHour/getHour Zapis/odczyt godziny zegara lub alarmu.
setDay/getDay Zapis/odczyt dnia tygodnia (0x01 – 0x07) zegara lub alarmu.
setDate/getDate Zapis/odczyt dnia miesiąca (0x01 – 0x32) zegara lub alarmu.
setMonth/getMonth Zapis/odczyt miesiąca (0x01 – 0x12) zegara lub alarmu.
setYear/getYear Zapis/odczyt roku (0x00 – 0x99) zegara lub alarmu.
enableAlarm Włączenie alarmu
getAmPm Czas dla zegara 12-godzinnego (AM/PM).

Funkcja main

Funkcję main przykładowej aplikacji przedstawiono na listingu 7. Konfiguruje ona moduł PmodRTCC i ustawia datę: Niedziela, 4. marca 2018 23:15:30. Następnie ustawiany jest alarm na 10 sekund od zdefiniowanej daty. Pętla główna, za pomocą funkcji pomocniczej printTime, co sekundę odczytuje datę i godzinę. Odczytane wartości są od razu wysyłane na port szeregowy LPUART1. Alarm jest sygnalizowany przez zapalenie diody LED1 podłączonej do pinu PC7. Port szeregowy LPUART1 jest konfigurowany i obsługiwany za pomocą kodu znajdującego się w pliku serial.c, natomiast sterownik diody został umieszczony w pliku led.c.

Listing 7. Kod główny przykładowej aplikacji

Moduły PmodMTDS, PmodRTCC i PmodCMPS2, a także zestaw KAmeleon oraz wiele innych płytek ewaluacyjnych i modułów rozszerzających można znaleźć w ofercie Kamami.pl

Do pobrania

O autorze