[KURS] Aplikacje DSP na przykładzie mikrokontrolerów C2000 firmy Texas Instruments inicjalizacja systemowa procesora serii Piccolo F2802x, część 3
23. Zobacz deklarację funkcji WDOG_disable. Przyciśnij klawisz Ctrl i najedź kursorem na nazwę funkcji WDOG_disable. Gdy nazwa jest podkreślona kliknij na nią lewym klawiszem myszy.
Deklaracja funkcji WDOG_disable jest zamieszczona w pliku wdog.h
//! \brief Disables the watchdog (WDOG) timer //! \param[in] wdogHandle The watchdog (WDOG) timer object handle void WDOG_disable(WDOG_Handle wdogHandle);
24. Przejdź do linii (74) kodu w pliku głównym z wywołaniem funkcji WDOG_disable. Kliknij kilka razy na przycisk pracy krokowej Step Over na pasku narzędziowym okna Debug. 25. Kliknij na przycisk pracy krokowej Step Into na pasku narzędziowym okna Debug.
Definicja funkcji WDOG_disable jest zamieszczona w pliku wdog.c
void WDOG_disable(WDOG_Handle wdogHandle) { WDOG_Obj *wdog = (WDOG_Obj *)wdogHandle; uint16_t regValue = wdog->WDCR; // set the bits regValue |= WDOG_WDCR_WDDIS_BITS; ENABLE_PROTECTED_REGISTER_WRITE_MODE; // store the result wdog->WDCR = regValue | WDOG_WDCR_WRITE_ENABLE; DISABLE_PROTECTED_REGISTER_WRITE_MODE; return; } // end of WDOG_disable() function
Wykonanie funkcji WDOG_disable powoduje wpisanie jedynki do bitu WDDIS(WDCR[6]) czyli zablokowanie działania modułu CPU Watchdog. Opis rejestrów jest zamieszczony w tablicy 1. Można to zobaczyć w oknie Registers po rozwinięciu zestawu rejestrów SYSCTRL (rysunek 19).
Rys. 19. Ustawienie na jedynkę bitu WDDIS(WDCR[6]) po wywołaniu funkcji WDOG_disable z biblioteki driverlib
26. Kliknij kilka razy na przycisk pracy krokowej Step Over aż wykonanie powróci do pliku głównego.
Inicjowanie układu generacji zegara systemowego
Układy procesorowe serii Piccolo F2802x posiadają dwa wewnętrzne oscylatory (INTOSC1 i INTOSC2), wewnętrzny oscylator dla zewnętrznego kwarcu oraz moduł PLL [5, 14]. Blok dostarcza sygnały zegarowe dla rdzenia układu procesorowego oraz sterowanie dla modułu LPM (obniżonej mocy), modułu CPU Watchdog, NMI Watchdog i CPU Timer2 (rysunek 20). Oscylatory wewnętrzne INTOSC1 i INTOSC2 nie wymagają elementów zewnętrznych.
Rys. 20. Sposoby generowania sygnału zegarowego dla układów procesorowych serii Piccolo F2802x [11]
Są cztery sposoby generowania sygnału zegarowego OSCCLK dla układów procesorowych serii Piccolo F2802x [14]:
- Oscylator wewnętrzny INTOSC1 (10MHz): Pozwala na dostarczenie zegara dla modułu CPU Watchdog, rdzenia i licznika CPU TIMER2.
- Oscylator wewnętrzny INTOSC2 (10MHz): Pozwala na dostarczenie zegara dla modułu CPU Watchdog, rdzenia i licznika CPU TIMER2.
- Oscylator dla zewnętrznego rezonatora kwarcowego: Układ wewnętrznego oscylatora układów procesorowych serii Piccolo F2802x umożliwia generację sygnału zegarowego OSCCLK z zastosowaniem zewnętrznego rezonatora kwarcowego. Jest on dołączany do wyprowadzenia X1 oraz X2 układu procesorowego. Wyprowadzenia X1 i X2 są dostępne tylko w większej obudowie.
- Zewnętrzny sygnał zegarowy dołączony do wejścia XCLKIN. Wejście XCLKIN jest multipleksowane pomiędzy wyprowadzeniami GPIO19 lub GPIO38 układu procesorowego.
Deklaracje dla obsługi układu generacji zegara systemowego znajdują się w pliku nagłówkowym clk.h w ścieżce C:\TI\controlSUITE\device_support\f2802x\v210\f2802x_common\include
Funkcje biblioteczne obsługi układu generacji zegara systemowego znajdują się z pliku źródłowym clk.c w ścieżce C:\TI\controlSUITE\device_support\f2802x\v210\f2802x_common\source
Struktura CLK_Obj opisu układu generacji zegara systemowego obejmuje wszystkie rejestry sterujące tego modułu układów procesorowych serii Piccolo F2802x (patrz tab.1).
Wskazanie na strukturę CLK_Obj (jako nowy typ) jest zdefiniowane w pliku clk.h
typedef struct CLK_Obj *CLK_Handle;
Następnie jest definiowana zmienna myCLK typu CLK_Handle określająca główny wskazanie (handle) na strukturę dla układu generacji zegara systemowego
CPU_Handle myCpu;
Funkcja CLK_init realizuje inicjowanie zmiennej myCLK. Deklaracja funkcji CLK_init jest zamieszczona w pliku clk.h. Każda funkcja obsługi układu generacji zegara systemowego wymaga podania wskazania na strukturę opisu CLK_Obj jako pierwszy argument wywołania. Następne argumenty zależą od realizowanej funkcjonalności.
Linia wywołania funkcji CLK_setOscSrc w programie głównym projektu wygląda następująco
//Select the internal oscillator 1 as the clock source CLK_setOscSrc(myClk, CLK_OscSrc_Internal);
Definicja wartości wyliczanych dla drugiego argumentu jest zdefiniowana w pliku clk.h
//! \brief Enumeration to define the clock oscillator source typedef enum { CLK_OscSrc_Internal=(0 << 0), //!< Denotes an internal oscillator source CLK_OscSrc_External=(1 << 0) //!< Denotes an external oscillator source } CLK_OscSrc_e;
Wykonanie funkcji CLK_setOscSrc z agrumentem CLK_OscSrc_Internal powoduje wybranie oscylatora wewnętrznego INTOSC1 (10MHz) jako źródło sygnału zegarowego OSCCLK.
Układ generacji sygnałów zegarowych, po włączeniu zasilania układu procesorowego serii Piccolo F2802x lub wykonaniu sprzętowej operacji RESET, jest domyślnie konfigurowany następująco (rysunek 21):
- Sygnał na wejście PLL jest podawany z generatora wewnętrznego INTOSC1 (10MHz)
- Układ PLL jest wyłączony
- Dzielnik układu PLL jest ustawiony na dział przez 4 co oznacza, że systemowy sygnał zegarowy SYSCLKOUT jest ustawiony na 2.5MHz
- Dzielnik podziału sygnału wyjściowego XCLKOUT jest ustawiony na dział przez 4.
- Sygnał wyjściowy XCLKOUT nie jest podawany na wyprowadzenie układu procesorowego
Linia wywołania funkcji CLK_setOscSrc w programie nic nie zmienia, bo i tak domyślnie jest wybrany oscylator wewnętrzny INTOSC1.
Rys. 21. Generowanie systemowego sygnału zegarowego SYSCLKOUT oraz sygnału XCLKOUT układów procesorowych serii Piccolo F2802x [5]. Zacienione pola wskazują ustawienia domyślne
Linia wywołania funkcji PLL_setup w programie głównym projektu wygląda następująco
// Setup the PLL for x12 /2 which will yield 60Mhz = 10Mhz * 12 / 2 PLL_setup(myPll, PLL_Multiplier_12, PLL_DivideSelect_ClkIn_by_2);
Funkcja PLL_setup realizuje inicjowanie modułu PLL. Deklaracja funkcji PLL_setup jest zamieszczona w pliku pll .h
//! \brief Sets the phase lock loop (PLL) divider and multiplier //! \param[in] pllHandle The phase lock loop (PLL) object handle //! \param[in] clkMult The clock multiplier value //! \param[in] divSelect The divide select value void PLL_setup(PLL_Handle pllHandle, const PLL_Multiplier_e clkMult, const PLL_DivideSelect_e divSelect);
Wykonanie funkcji PLL_setup powoduje ustawienie mnożnika modułu PLL na 12 i podzielnika na 2. W rezultacie sygnał zegarowy OSCCLK=10MHz jest daje systemowy sygnał zegarowy SYSCLKOUT=60MHz.