Jak rozblikad LED diodu pomocí QuickStartu

Posted by Petr Hapal on 24 January 2013 | 0 Comments

Tags: , , , ,

Instalaci CodeWarrioru a konfiguraci QuickStartu jsem probíral v minulém příspěvku. Nyní bych chtěl popsat jak jednoduše pracovat s GPIO a rozblikat LED diodu. Používám MC56F8006DEMO kit od Freescale a také tato ukázka bude pomocí něj vytvořena. Pokud používáte jiný kit nebo aplikaci, zvolte prosím správný typ procesoru a používejte korektní GPIO port. Začněme založením nového projektu. Spusťte CodeWarrior, klikněte na File -> New... a v dialogu zvolte DSP56800E Quick Start r2.x Stationary (pokud zde takové stationary nemáte, pak vaše instalace neproběhla správně). Vyplňte název projektu a umístění projektu (viz. obrázek níže).

Dialog nového projektu

Po kliknutí na OK se zobrazí dialog volby procesoru. Zvolte odpovídající procesor a klikněte na OK (já mám MC56F8006DEMO kit).

Dialog volby procesoru

Zobrazí se výchozí strom projektu. Klikněte a otevřete main.c. Výchozí nastavení JTAGu je USB TAP takže v případě, že máte LPT JTAG, změňte si nastavení v předvolbách targetu. (popisoval jsem v jednom v předchozích příspěvků).

Výchozí strom projektu, main.c

QuickStart je sada driverů, funkcí a maker, které vám napomohou krychlému startu bez nutnosti hluboké znalosti platformy. Obsahuje grafický konfigurační nástroj, který umožňuje rychlé nastavení periferií pomocí myši. Podívejme se na kus souboru main.c:

 

    /* initialize SYS module - initialize system clock, power management, ... */

    ioctl(SYS, SYS_INIT, NULL);

    /* configure COP module  - initialize watchdog */

    ioctl(COP, COP_INIT, NULL);

    /* configure all GPIO modules - initialize GPIO module */

    ioctl(GPIO, GPIO_INIT_ALL, NULL);

    /* initialize interrupt controller and enable interrupts */

    ioctl(WINTC, WINTC_INIT, NULL);

    archEnableInt();

    /* initialize SYS module - initialize system clock, power management, ... */
    ioctl(SYS, SYS_INIT, NULL);
    /* configure COP module  - initialize watchdog */
    ioctl(COP, COP_INIT, NULL);
    /* configure all GPIO modules - initialize GPIO module */
    ioctl(GPIO, GPIO_INIT_ALL, NULL);
    /* initialize interrupt controller and enable interrupts */
    ioctl(WINTC, WINTC_INIT, NULL);
    archEnableInt();

ioctl znamená rozšířeně "I/O control" a jedná se o ovládací makro pro konfiguraci modulu. Prvním parametrem je název modulu, druhým je příkaz a posledním jsou data. Kompletní dokumentaci naleznete v manuálu QuickStartu (viz. odkazy ke stažení na konci). Naše aplikace nastaví systémový modul, watchdog, GPIO a interrupt controller (řadič přerušení). Pokud by jste chtěli používat další periferie (např. SCI) musíte přidat např. další ioctl(SCI, SCI_INIT, NULL);. Podívejme se nyní do dokumentace od MC56F8006DEMO kitu. Ze schématu je patrné, že 6 LED diod se nachází na PA0/PWM0 až PA5/PWM5. Stiskněte Ctrl+F12 (nebo jinou klávesovou zkratku, kterou jste zvolili během nastavování QuickStartu). Zobrazí se grafický konfigurační nástroj (pokud ne, potom je vaše instalace chybná).

Grafický konfigurační nástroj

MC56F8006 má mnoho vnitřních periferií vyvedených ven. Má ovšem pouze pouzdro QFP48. Každý pin má tedy vícenásobnou funkcionalitu (sdílenou). Kliknutím na chekboxy v grafickém náhledu obvodu můžete zvolit, která periferie bude vyvedena ven/dovnitř pouzdra. Nyní klikněte na GPIO_A v levém stromu periferií a zatrhněte jej, aby došlo k jeho povolení. Nakonfigurujeme GPIO port.

Grafický konfigurační nástroj - nastavení GPIO_A

Nastavte Direction na Output (pin se chová jako výstupní) pro piny 0 až 5. Nyní upravíme zdrojový kód následovně:

 

/* Software delay function */

void delay()

{

long i;

for (i = 0; i < 1000000; i++)

{

asm(nop); // Do nothing instruction

}

}

 

void main (void) 

{

 

    /* initialize SYS module */

    ioctl(SYS, SYS_INIT, NULL);

    /* configure COP module */

    ioctl(COP, COP_INIT, NULL);

    /* configure all GPIO modules */

    ioctl(GPIO, GPIO_INIT_ALL, NULL);

    /* initialize interrupt controller and enable interrupts */

    ioctl(WINTC, WINTC_INIT, NULL);

    archEnableInt();

 

    while(1)

    {

    /* set bit3 to 5 to log. L */

    ioctl(GPIO_A, GPIO_CLEAR_PIN, BIT_3 | BIT_4 | BIT_5);

    /* set bit0 to 2 to log. H */

    ioctl(GPIO_A, GPIO_SET_PIN, BIT_0 | BIT_1 | BIT_2);

    delay();

    /* set bit3 to 5 to log. H */

    ioctl(GPIO_A, GPIO_SET_PIN, BIT_3 | BIT_4 | BIT_5);

    /* set bit0 to 2 to log. L */

    ioctl(GPIO_A, GPIO_CLEAR_PIN, BIT_0 | BIT_1 | BIT_2);

    delay();

     

         /* feed the watchdog periodically */

         ioctl(COP, COP_CLEAR_COUNTER, NULL);

    }

}

Věřím, že není nutno komentáře - je zde softwarová funkce zpoždění delay() a měníme výstupní logickou úroveň pinů pomocí funkcí GPIO_CLEAR_PIN a GPIO_SET_PIN.

Připojte USB kabel ke kitu jakožto napájení. Není nutné instalovat ovladaře. Připojte JTAG adaptér.

Freescale MC56F8006DEMO kit

Nyní můžete sestavit aplikaci stisknutím F7 a nahrát a ladit pomocí F5. Aplikace se zastaví na začátku funkce main() po úspěšném naflashování. Aplikaci můžete spustit pomocí F5 nebo krokovat přes/do pomocí F10/F11. Hotovo! Sestavili jste vaši první aplikaci pro platformu 56800/E.

DSP56800E_Quick_Start_Users_Manual.pdf

MC56F8006DEMO_UserGuide.pdf

project.zip

Zaslat komentář

Komentáře

Nikdo na této stránce ještě nepřidal komentář.

RSS kanál pro komentáře na této stránce | RSS kanál pro všechny komentáře