LinkedIn YouTube Facebook
Szukaj

Newsletter

Proszę czekać.

Dziękujemy za zgłoszenie!

Wstecz
Artykuły

[NOWY FRAMEWORK] Microchip Harmony dla PIC32, część 1

Projekt jest bardziej lub mniej skomplikowany, ale zawsze ma pewną minimalną liczbę plików źródłowych i nagłówkowych. W przypadku bardziej skomplikowanych projektów stosuje się metodę tworzenia szkieletu projektu z niezbędnymi plikami źródłowymi i nagłówkowymi. W dokumentacji Harmony jest rozdział dokładnie opisujący wszystkie te pliki: ich zawartość „startową” i umiejscowienie w katalogach i podkatalogach projektu. Ja z ciekawości utworzyłem sobie taki szkieletowy projekt. Wymaga to sporo pracy i uwagi, gdyż łatwo się przy tym pomylić. Po tym doświadczeniu zacząłem szukać firmowych projektów szkieletowych i… niestety niczego nie znalazłem. Nie znalazłem tez takich projektów umieszczonych w Internecie przez innych użytkowników. Nie ma ich, bo po prostu są niepotrzebne.

Tu dochodzimy do kolejnego poziomu wsparcia: wtyczki (plug-in) MPLAB Harmony Configurator – MHC. W MPLAB X IDE jest zaimplementowany mechanizm pobierania i instalowania wtyczek bezpośrednio z okna Tools-Plugins. W zakładce Available Plugins są wyświetlane dostępne wtyczki. Po zaznaczeniu MPLAB Harmony Configurator i kliknięciu na przycisk Install wtyczka zostanie automatycznie pobrana z serwera Microchipa i zainstalowana. Można ją uruchomić z okna Tools->Embeded->MPLAB Harmony Configurator.

Wróćmy teraz do naszego przykładowego projektu. W katalogu V1_03_01/apps/examples umieściłem swój katalog o nazwie test_harmony/fimware. Następnie utworzyłem nowy projekt MPLAB Harmony Projekt o nazwie test_harmony z mikrokontrolerem PIC32MX795F512L. Ten projekt nie zawiera żadnych plików źródłowych, ani nagłówkowych, ale ma przygotowane wszystkie niezbędne foldery. Na tym etapie musimy mieć pobrany i zainstalowany plug-in MHC. Jeżeli tak jest, to zostanie on automatycznie otwarty (rysunek 7).

 

Rys. 7. Pusty projekt MPLAB Harmony z otwartym MHC

 

Po kliknięciu na przycisk Configurations możemy:

  • zapisać bieżącą konfigurację z domyślną nazwą,
  • zapisać bieżącą konfigurację z nową nazwą,
  • otworzyć inną wcześniej zapisaną konfigurację,
  • zmienić ścieżkę dostępu do katalogu z MPLAB Harmony.

Na początek zapiszemy bieżącą konfigurację z domyślną nazwą w domyślnym katalogu projektu. Potem klikamy na przycisk Generate i MHC automatycznie tworzy szkielet projektu z wszystkimi plikami wynikającymi ze startowej domyślnej konfiguracji MHC. Struktura plików projektu Harmony jest dość rozbudowana nawet w tym projekcie, który na tym etapie nic nie robi (rysunek 8).

 

Rys. 8. Struktura plików projektu

 

Wszystkie pliki projektu można umownie podzielić na:

  • konfiguracyjne (inicjalizacja systemu, opcje statycznej konfiguracji i procedury sterowania systemem),
  • bibliotek (inicjalizacja bibliotek i procedury bibliotek peryferii),
  • aplikacji (inicjalizacja i warstwy procedury aplikacji).

Po wygenerowaniu plików przez MPLAB Harmony Configurator mamy gotowy szkielet projektu, na którym można osadzić naszą warstwę aplikacji.

Wygenerowany przez MHC plik main.c zawiera tylko procedurę inicjalizacji SYS_Initialize() i niekończoną pętlę while(true)listing 1. Ta pętla realizuje mechanizm poolingu , o którym pisałem wcześniej. Wywoływana w tej pętli procedura SYS_Task() realizuje funkcję jednej maszyny stanów.

 

List. 1. Plik main.c

int main (void )
{
  
/*Inicjalizacja modułów MPLAB Harmony , oraz inicjalizacja aplikacji */
  SYS_Initialize (NULL );
//pętla poolingu 
  while (true )
  {
    /* funkcja maszyny stanów. */
    SYS_Tasks ();

  }

  return (EXIT_FAILURE );
}

Inicjalizacja systemu SYS_initialize() (listing 2) polega głównie na zainicjowaniu układów taktowania rdzenia i układów peryferyjnych, domyślnym wyłączeniu interfejsu JTAG oraz zainicjowaniu układów portów.

 

List. 2. Inicjalizacja systemu

void SYS_Initialize (void* data )
{
  /* Inicjalizacja taktowania rdzenia */
  SYS_CLK_Initialize(NULL );
  sysObj.sysDevcon = SYS_DEVCON_Initialize(SYS_DEVCON_INDEX_0, (SYS_MODULE_INIT*)&sysDevconInit);
  SYS_DEVCON_PerformanceConfig(SYS_CLK_SystemFrequencyGet());
/*wyłączenie interfejsu JTAG*/
  SYS_DEVCON_JTAGDisable();
/*inicjalizacja modułu portów*/
  SYS_PORTS_Initialize();

  /* Inicjalizacja driverów urządzen*/
  /* Inicjalizacja usług systemowych*/
  /* Inicjalizacja Middleware */

  /* Inicjalizacja aplikacji użytkownika */
  APP_Initialize()
}

Na tym etapie nie używamy driverów urządzeń ani middleware. Kiedy te moduły pojawią się w projekcie, muszą zostać zainicjowane. Inicjalizacja aplikacji polega na zdefiniowaniu stanu początkowego maszyny stanów. W pliku app.h umieszczono definicję stanu początkowego APP_STATE_INIT. Kiedy użytkownik będzie rozbudowywał swoją aplikację, to musi tu definiować kolejne stany maszyny stanów (listing 3).

 

List. 3. Definicja stanów maszyny stanów

typedef enum
{
      /* definicja stanu początkowego maszyny stanów */
	APP_STATE_INIT=0,
} APP_STATES;

Jedną z ważniejszych funkcji w systemie jest funkcja APP_Tasks () umieszczona w pliku app.c. To właśnie w tej funkcji będzie implementowana maszyna stanów. Funkcja APP_Tasks () jest ciągle wywoływana w nieskończonej pętli głównej funkcji main().

 

List. 4. Funkcja inicjalizacji i implementacji maszyny stanów

void APP_Tasks (void )

void APP_Tasks (void )
{
  /* testowanie stanów aplikacji */
  switch (appData.state )
  {
    /* stan początkowy aplikacji */
    case APP_STATE_INIT:
    {
      break;
    }

    /* tu jest miejsce na implementacje maszyny stanów.*/

    /* default nie powinien być nigdy wykonany */
    default:
    {
      /*sygnalizacja o obsługa błędu stanów maszyny stanów */
      break;
    }
  }
}

Tak wygląda projekt, który został domyślnie skonfigurowany przez plug-in MHC w trakcie tworzenia w środowisku MPLAB X IDE. W drugiej części artykułu pokażemy jak go samodzielnie skonfigurować do wykonywania prostych programów.

 

Absolwent Wydziału Elektroniki Politechniki Wrocławskiej, współpracownik miesięcznika Elektronika Praktyczna, autor książek o mikrokontrolerach Microchip i wyświetlaczach graficznych, wydanych nakładem Wydawnictwa BTC. Zawodowo zajmuje się projektowaniem zaawansowanych systemów mikroprocesorowych.