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