Produkty Novinky Články Návody Kontakty

Inicializace mikrokontroléru

Funkce sysclk_init() se postará o nastavení hodinového signálu procesoru na 50 MHz. Jako zdroj signálu je zvolen 6 MHz krystal, který je k mikrokontroléru připojen.
Přesně podle postupu, který je popsán v datasheetu mikrokontroléru LM3S800, provedem následující kroky
  • odpojit PLL obvod a děličku systémových hodin nastavením bitu BYPASS a nulováním bitu USESYSDIV v registru RCC
  • nastavit hodnotu krystalu XTAL a zvolit oscilátor OSCSRC, nulovat bity PWRDN a OEN v registru RCC
  • nastavit hodnotu děličky hodin SYSDIV a povolit děličku nastavením bitu USESYSDIV v registru RCC (výstup obvodu PLL má vždy frekvekci 200 MHz, zvolená hodnota SYSDIV ji dělí čtyřmi, výsledná frekvence je 50 MHz)
  • počkat, dokud není PLL stabilizován, tzn. dokud není nastaven PLLRIS bit v registru RIS
  • povolit výstup z PLL obvodu nulováním bitu BYPASS v registru RCC
Zde je potřeba zmínit poznámku, která je uvedena v datasheetu mikrokontroléru LM3S800 a platí pro všechny obvody řady Stellaris
  • pokud vynulujete bit BYPASS dříve než je obvod PLL stabilizován, může dojít ke zničení mikrokontroléru.
​
void sysclk_init(void)
{
        /* Settings for 6 MHz crystal and 50 MHz System clock */
        /* Set BYPASS bit and clear USESYSDIV bit in SYSCTL_RCC register */
        MM_REG(SYSCTL_RCC) = (MM_REG(SYSCTL_RCC) & ~(RCC_USESYSDIV)) | RCC_BYPASS ;
​
        /* Clear PWRDN and OEN bits and
         * set OSCSRC and XTAL values in SYSCTL_RCC register     */
        MM_REG(SYSCTL_RCC) = (MM_REG(SYSCTL_RCC) & ~(RCC_PWRDN) & ~(RCC_OEN) &
                                ~(RCC_OSCSRC_M) & ~(RCC_XTAL_M)) |
                                (RCC_OSCSRC_MAIN | RCC_XTAL_6MHZ); 
​
        /* Set SYSDIV value and USESYSDIV bit in SYSCTL_RCC register */
        MM_REG(SYSCTL_RCC) = (MM_REG(SYSCTL_RCC) & ~(RCC_SYSDIV_M)) |
                                (RCC_SYSDIV_4 | RCC_USESYSDIV); 
​
        /* Wait until PLLRIS in SYSCTL_RIS register is set */
        while ((MM_REG(SYSCTL_RIS) & RIS_PLLRIS) == 0);
​
        /* Enable PLL by clearing BYPASS in SYSCTL_RCC register */
        MM_REG(SYSCTL_RCC) = MM_REG(SYSCTL_RCC) & ~(RCC_BYPASS);
}
​
Abychom mohli ovládat LEDku, kterou máme připojenou na pin 5 GPIO portu A, musíme port nastavit. Symboly GPIO_ jsou definovány v hlavičkovém souboru lm3s800.h.
  • Nastavením bitu 0 (RCGC2_GPIOA) v registru RCGC2 zapneme obvody portu A
  • Zápisem hodnoty 0x20 (GPIO_PIN_5) do registru GPIO_O_DIR nastavíme pin 5 jako výstupní
  • Zápisem hodnoty 0x20 (GPIO_PIN_5) do registru GPIO_O_DEN nastavíme pin 5 jako digitální IO
​
void gpio_init(void)
{
        /* Enable PORTA clock */
        MM_REG(SYSCTL_RCGC2) |= (RCGC2_GPIOA);
​
        /* Wait a moment until peripheral is initialized
         * otherwise expect bus fault error */
        short_delay(50);
​
        /* Configure GPIO PA.5 as output */
        MM_REG(GPIO_PORTA_BASE + GPIO_O_DIR) |= (GPIO_PIN_5);
        MM_REG(GPIO_PORTA_BASE + GPIO_O_DEN) |= (GPIO_PIN_5); 
}
​