niedziela, 10 marca 2019

PIC32MM - Tutorial part 2 - Jak ustawić zegar.

Cechą charakterystyczną PIC jest wysoka precyzja generatora wewnętrznego RC. Co implikuje fakt, że w większości przypadków kwarc zewnętrzny jest tutaj zbędny. Dlatego nie znajdziemy go na naszej płytce Curiosity. W tutorialu pokażę jak w najprostszy dostępny sposób możemy skonfigurować zegar wewnętrzny RC a zajmie nam to dosłownie moment. Ja najczęściej wykorzystuję maksymalny dostępny pułap częstotliwości oferowany przez generator RC czyli 24 MHz. Zatem na koń szable w dłoń.


Na wstępie dwa obrazki poglądowe pokazujące dystrybucję zegara w PIC32MM :



Uruchamiamy środowisko MPLABX-IDE. Naszym celem jest skonfigurowanie projektu do pracy z zegarem wewnętrznym RC na 24 MHz. Klikamy drugą od lewej ikonkę New Project. Wyskakuje nam okienko jak poniżej w którym klikamy tylko Next :


W kolejnym okienku dokonujemy wyboru naszego mikrokontrolera jaki mamy na płytce. A jest to PIC32MM0256GPM064.


Klikamy Next i w kolejnym okienku dokonujemy wyboru programatora. W tym miejscu musimy podłączyć kablem USB do PC naszą płytkę Curiosity z PIC32MM. Po chwili dołączony zostanie do spisu wybór zaznaczony na poniższym zdjęciu :


Zaznaczamy ten wybór i Next.
W kolejnym okienku wybieramy kompilator XC32 w najwyższej zainstalowanej wersji i klikamy Next :


Wyskoczy ostatnie okienko gdzie wpisujemy nazwę naszego projektu pic32mm_tutorial_part_2 i klikamy Finish.


Utworzyliśmy pusty projekt , który będzie podstawą do dalszego działania. Utworzony projekt zobaczymy na lewej górnej belce , mam tam kilka innych projektów ale to nas nie interesuje :


Teraz uruchomimy magiczne narzędzie MCC (Mplab Code Configurator). Ikonkę znajdziemy na górnej belce z prawej strony, ikonka koloru niebieskiego z białym napisem MCC. Po chwili ciszy wyskoczy nam okienko zatytułowane Save MCC Configuration File, klikamy Save.


Zapisany plik konfiguracyjny MyConfig.mc3 będzie dostępny w katalogu Important Files projektu jakby co.
Po chwili naszym oczom pokaże się główny widok panelu MCC i wygląda to jak poniżej :


Widzimy na pierwszym planie podane jak na tacy okienko do prostego ustawienia zegara. Jak ktoś miał do czynienia z CubeMX firmy STM i pierwszy raz zobaczył tam sekcję zegara do konfiguracji to pewnie włos mu się zjeżył na głowie. Po co się narażać na takie traumy skoro na PIC32MM mamy wszystko bezstresowo :) 
Jako standardowe źródło zegara ustawiony jest FRC Oscillator, czyli szybki generator wewnętrzny RC 8 MHz. Aby ustawić zegar wewnętrzny na nominalną wartość 24MHz musimy użyć pętli PLL. W tym celu klikamy w "ptaszka" przy napisie FRC Postcaller i wyskoczy nam zaptaszkowany napis PLL enable. Poniżej tego napisu zobaczymy dwa okienka Multipier i Divider. Ustawiamy tutaj tak : Multipier = 3:1 i Divider = 1:1 (jeśli nie używamy USB bo tu USBCLK będzie 12MHz). Jeśli ustawimy Multipier = 12:1 i Divider = 4:1 (przy tych ustawieniach można używać USB bo USBCLK = 48MHz) też otrzymamy zegar 24 MHz ale w tym przypadku zegar peryferyjny PBCLK będzie chodził nam wolniej ,w/g moich obserwacji o połowę czyli 12 MHz . Co odkryłem organoleptycznie przy okazji konfigurowania Timera . Nasze ustawienia zegara powinny wyglądać jak poniżej :


W okienku SYSCLK widzimy wartość 24 MHz i to nas informuje , że zegar systemowy zostanie ustawiony na taką właśnie wartość. Wszystkie peryferia posługują się jednym zegarem i nie trzeba ich oddzielnie konfigurować dla każdego użytego peryferium tak jak w ARM-ach. Ale jednocześnie jest możliwość prostego odpięcia praktycznie każdego peryferium od zegara tak aby drastycznie zmniejszyć pobór prądu w przypadku kiedy nam na tym szczególnie zależy.

Zegar mamy już ustawiony, teraz jeszcze tylko dwie czynności , które standardowo  robię w okienku konfiguracyjnym zegara. 

1. zmieniam ustawienie w okienku Clock Output Pin Configuration na opcję OSCO pin operates as a normal I/O. Ustawienie to zmienia funkcję pinu RA3 z wyjścia generującego zegar na zwykły pin I/O. Jeśli tego nie zrobimy to w przypadku użycia pinu RA3 będziemy niepotrzebnie się denerwować , że pin ten nie chce z nami współpracować.

2. kasuję "ptaszka" w opcji Use Secondary Oscillator, nie używam więc się niech nie pulta w ustawieniach.

Ostatecznie nasze okienko konfiguracyjne zegara powinno wyglądać jak poniżej :


Jeśli chcemy sobie zerknąć jakie ustawienia są w poszczególnych rejestrach sekcji zegara to klikamy w zakładkę Registers.
Aby nasze ustawienia przenieść automatycznie do projektu klikamy w zakładkę Generate  , która znajduje się w lewym górnym okienku opisanym jako Project Resources. Po chwili pliki konfiguracyjne wygenerowane przez MCC zostaną dodane do naszego projektu. Aby zobaczyć zmiany w projekcie zamykamy MCC klikając raz w ikonkę (odznaka policyjna z napisem MCC) na górnej belce narzędziowej. Ekran zmieni nam się jak poniżej :


O matko a gdzie nasz projekt ??? zeżarło go czy co ? Oj tam oj tam po co te nerwy. Klikamy w zakładkę Projects i naszym oczom pokaże się widok jak poniżej :


W projekcie przybyły nam katalogi MCC Generated Files i został utworzony plik main.c. Pliki konfiguracyjne są przyjazne dla oka. Jest miło ładnie i bezstresowo. Otwórzmy jeszcze sobie plik main.c :


Wszystko czytelne i gotowe do dalszej pracy. Ustawienie zegara i przygotowanie szablonu projektu trwało dosłownie chwilę no i czego chcieć więcej do szczęścia :) Od samego początku PIC 16bit i 32bit urzekły mnie prostotą i tym "czymś" czego w żadnych innych mikrokontrolerach jeszcze nie znalazłem :)


Pozdrawiam
picmajster.blog@gmail.com



Linki :





2 komentarze:

  1. To prawda że na FRC ustawienie na 96 MHz i podział na 4 powoduje że PBCLK pracuje z 12MHz, bo przy tych parametrach UART zawsze ma 2x mniejszą prędkość niż wynika z wyliczeń

    OdpowiedzUsuń
  2. Tak to jest taki niuans o istnieniu , którego trzeba sobie zdawać sprawę . Generalna zasada jeśli Divider będzie 1:1 to mamy pewność , że PBCLK będzie taktowany tak jak core. W pozostałych przypadkach MCC trochę nas tu bajeruje , że PBCLK = SYSCLK bo w rzeczywistości tak nie jest.

    OdpowiedzUsuń