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); }