RGB ledin vilkutus
Tämä esimerkki pohjautuu StellarisWaren mukana tulleeseen hello -esimerkkiin. Lisätietoa tällä sivulla käsitellyistä API-kutsuista sekä muista asioista löytyy dokumentista Stellaris Peripheral Driver Library - User's Guide.
Hello -esimerkissä on yksinkertainen ohjelma, joka tulostaa sarjaporttiin rimpsun "Hello, World! " ja jää sen jälkeen vilkuttelemaan sinistä lediä. Seuraavassa aluksi muutamalla sanalla StellarisWaresta.
StellarisWaren API- ja ROM-funktiot
Monissa stellaris-mikrokontrollereissa osa "laiteajureista" on ohjelmoitu mikrokontrollerin ROM-muistiin. Tällä on etunsa siinä, että ohjelmoijan käyttössä on enemmän flash-muistia ja ns. "laiteajurit" ovat varmasti suurelta osin moitteettomia. Tämän lisäksi on käytössä StellarisWaren tarjoamat API-funktiot (joita toki ROM-funktiotkin ovat), joilla bittejä saadaan naksuteltua.
ROM-funktiot, kuten muutkin StellarisWaren API:t kätkevät sisäänsä käytännössä mikrokontrollerin ja CPU:n rekisterien nypläämisen. Näin ollen ohjelmoijan ei tarvitse välittää siitä, mihin rekisteriin ja mitä kirjoitetaan. Esimerkiksi porttibittien asettaminen lähdöksi ja "1"-tilaan tapahtuu näin:
"Perinteinen", rekistereitä nypläämällä toteutettu tapa asettaa Portti A:n ensimmäinen bitti "1"-tilaan:
PADIR = 0x01;
// Rekisteriin PAOUT kirjoitetaan 0x01 -> BIT0 = 1
PAOUT = 0x01;
Stellariswaren ja ROM-funktioiden avulla tehdään sama asia näin:
ROM_GPIOPinTypeGPIOOutput(GPIO_PORTA_BASE, GPIO_PIN_0);
// kutsutaan API-funktiota porttibitin asettamiseksi
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_0, GPIO_PIN_0);
Yllä olevassa esimerkissä huomataan, kuinka osa "laiteajureista" sijaitsee ROM-muistissa ja StellarisWare tarjoaa lisää funktioita ohjelmoijan käyttöön.
Funktioiden avulla saadaan porttibittien naksuttelun lisäksi alustettua eri laitteita haluttuun tilaan (esimerkiksi SPI/I2C-väylät, UART, DMA, ADC, DAC jne.), eikä näiden rekistereitä tarvitse välttämättä laisinkaan tuntea. Tietenkin tarvitaan esimerkkejä, joiden avulla saadaan osviittaa siihen, mitä pitäisi kirjoittaa ja missä kohtaa. Lopputuloksena on nopeampi sovelluskehitys eikä ohjelmoijan tarvitse "uhrata" resurssejaan mikrokontrollerin rekistereihin tutustumiseen - joka toki on mukavaa puuhaa sekin.
Näiden funktioiden käyttämisestä löytyy lisää tietoa, kuten edellä mainittu, dokumentista Stellaris Peripheral Driver Library - User's Guide.
Hello -esimerkkikoodi
Kun hello -esimerkin avaa, niin sieltä paljastuu aluksi useita oudon näköisiä funktioita. En lähde tässä jokaista funktiota kuitenkaan erittelemään, sillä näiden funktioiden tarkoitus ja käyttäminen selviää käyttöoppaasta (siis juurikin tuosta Stellaris Peripheral Driver Library User Guide:sta).
Koodista muokkasin sen verran pois, että sarjaporttiin tulostaminen on kokonaan unohdettu ja että kaikki ledit oikeasti sammutetaan ja vain vihreää ja sinistä lediä vilkutetaan. Alla muokattu hello-esimerkin main.c-tiedoston koodi:
{
// Set the clocking to run directly from the crystal.
ROM_SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ | SYSCTL_OSC_MAIN);// Enable the GPIO port that is used for the on-board RGB LED.
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
// Enable the GPIO pins for the LEDs.
ROM_GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3);
// Turn off all RGB LEDs
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3, 0);
while(1)
{
// Turn off all LEDs and then turn on the BLUE LED.
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2 | GPIO_PIN_3, 0);
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, GPIO_PIN_2);
// Delay
DummyDelay();
// Turn off all LEDs and then turn on the GREEN LED.
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2 | GPIO_PIN_3, 0);
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_3, GPIO_PIN_3);
// Delay
DummyDelay();
}
}
void DummyDelay()
{
SysCtlDelay(SysCtlClockGet() / 10 / 3);
}
Koodi "kaikessa yksinkertaisuudessaan" oli siis tässä. Koodin kun lataa Launchpadille, niin LED alkaa vilkuttelemaan kahta väriä: