Fórum témák

» Több friss téma
Cikkek » STM32 Discovery Kit programozása
STM32 Discovery Kit programozása
Szerző: lolhun1988, idő: Feb 5, 2011, Olvasva: 23895, Oldal olvasási idő: kb. 3 perc
Lapozás: OK   5 / 5

LED villogtatása függvények nélkül

     A célunk az, hogy megtanuljunk LED-et villogtatni, mindenféle előre megírt függvény nélkül. Kezdjünk is bele, nem pocsékolom a betűket, lényegre törő leszek és megpróbálok mindent leírni, érthető módon.

Előkészületek

     Ahhoz, hogy ezt megtegyük, szükségünk lesz két dokumentumra. Az egyik a Discovery Kit használati útmutatója, a másik pedig a mikrokontroller referencia használati útmutatója.

Discovery Kit használati útmutatója: USER_MANUAL.pdf

MCU referencia használati útmutatója: UCONT_REF_MAN.pdf

Aki programozott már mikrovezérlőket, tudja, hogy a beállításokat regiszterekben kell eltárolni. Meg kell adnunk például, hogy egy láb kimenet, vagy bemenet legyen, és azon belül is, hogyan viselkedjen.

Mi kell ahhoz, hogy villogjunk?

     Nos a boldogsághoz elő kell vennünk a Kit használati útmutatóját, és meg kell néznünk, melyik port melyik kivezetésére van kötve mondjuk a kék LED (mert azt a színt szeretem ). Ezt az infót a 18. pdf oldalon találjuk a rajz jobb oldalán, ahol látjuk, hogy a kék LED a PC8-asra van kötve (LD4).

Miután ez megvan, meg kell nyitnunk a referencia használati utasítást. Az STM esetén a be- és kimeneteket GPIO-knak (General-purpose I/O-knak) nevezik.

Minden GPIO-t programozhatunk a következő funkciókra:

  •  Input floating 
  •  Input pull-up
  •  Input-pull-down
  •  Analog
  •  Output open-drain
  •  Output push-pull
  •  Alternate function push-pull
  •  Alternate function open-drain

Mivel a LED-ünk a C porton van, ezért meg kell keresnünk azt a regisztert, amiben be tudjuk állítani a port funkcióját. Ezt a regisztert port konfigurációs regiszternek hívjuk (Port configuration register). Minden porthoz tartozik kettő, például a C porthoz a GPIOC_CRL és GPIOC_CRH tartozik.  A 111. és 112. oldalon találjuk a leírást. Két részre van osztva: van egy úgynevezett Low és egy High (CRL és CRH) részre. Ez azért van így, mert minden GPIO-t négy bittel konfigurálunk. Egy porthoz 16 GPIO tartozik így az 16×4 = 64 bit kell, és így két ,32-bites regiszterben tudjuk azokat konfigurálni. Egy dolgot majdnem elfelejtettem: Van egy regiszter, amit periféria órajel engedélyező regiszternek hívnak (APB2 peripheral clock enable register). Ebben be kell állítanunk egy bitet, hogy engedélyezzük az órajelet a C portra. Így tudjuk majd változtatni a port értékét. Erről a regiszterről a leírást a 91. pdf oldalon találunk.

GPIOx_CRL port konfigurációs regiszter

GPIOx_CRH port konfigurációs regiszter

RCC_APB2ENR Periféria órajel engedélyező regiszter

A program írása

     A fent leírtak alapján járunk el. Be kell állítanunk az RCC_APB2 regiszterben a periféria órajel engedélyezőjét a C portra, továbbá be kell állítanunk a PC8-as GPIO-t, hogy kimenet legyen. A 103. pdf oldalon láthatjuk hogyan kell. A GPIO-t a mi esetünkben push-pull funkciójúra kell programozni, és mondjuk a max. output sebességet válasszuk 10 MHz-nek. Láthatjuk a táblázatok alapján, hogy a PC8-ashoz tartozó konfiguráció a következő: A PC8-ast a GPIOC_CRH regiszteren keresztül tudjuk konfigurálni.

Port bit konfigurációs táblázat

Tehát a nyolcadik bithez tartozó konfigurációs biteket kell beállítanunk. A CNF két bitből áll, mindkét bitjét a táblázatból kiolvasva tudjuk, hogyan kell konfigurálni. A MODE szintén két bitből áll, megadhatjuk vele kimeneti mód esetén, hogy milyen max. kimeneti sebessége legyen az adott GPIO-nak. Úgy kell feltöltenünk ezeket a konfigurációs biteket, ahogyan ebben a táblázatban látjátok.

CNF8[1] 0
CNF8[0] 0
MODE8[1] 0
MODE8[0] 1

A GPIO értékét is tudnunk kell változtatni. Ezt a port beállító és törlő regiszter segítségével fogjuk megtenni. (Port bit set/reset register). A 113. pdf oldalon találunk róla leírást. Ebből a regiszterből a 8-as és 24-es bitre lesz szükségünk. Ha a 8-as bitbe egyest írunk, akkor egyesbe állítjuk a PC8 értékét, ha a 24-es bitbe írunk egyest, akkor pedig töröljük. Most már neki is állhatunk megírni a programot! (BS=Bit set, BR=Bit reset értelemszerűen a BS8 a nyolcadik bitet a portból beállítja a BR8 pedig törli.)

Port bit set és reset regiszter

---------------

A main fájl:

  1. /* Includes */
  2. #include <stddef.h> //Ezeket kell includeolnunk a projekt megvalósításához
  3. #include "stm32f10x.h"
  4. void delay(void); //Delay függvény, hogy lássuk a villogást
  5. int main(void){
  6.      RCC->APB2ENR |= (1<<4);
  7.      /* A periféria órajel engedélyezése a C portra a negyedik bitbe kell írnunk egy egyest
  8.         az RCC_APB2ENR regiszterbe. pdf 91. oldal*/
  9.      GPIOC->CRH = 0x00000001;
  10.       /* A GPIOC_CRH konfigurációs regiszter nulladik bitjébe írok egy egyest pdf 112. oldal
  11.       így konfiguráltam a CNF és MODE biteket a PC8-as porthoz*/
  12.      while(1){
  13.           GPIOC->BSRR = (1<<8);
  14.           /*BIT SET ÉS RESET regiszterbe írok a 8. bitbe egy egyest (PC8 SET)*/
  15.           delay();
  16.           GPIOC->BSRR = (1<<24);
  17.           /*BIT SET ÉS RESET regiszterbe írok a 24. bitbe egy egyest (PC8 RESET)*/
  18.           delay();
  19.      }
  20. }
  21. void delay(void)
  22. {
  23.      int i = 100000;
  24.      while (i-- > 0) {
  25.           asm("nop");//Optimalizálás nélküli fordítás
  26.      }
  27. }

---------------

Miután végeztünk a main fájl megírásával, felprogramozhatjuk a mikrovezérlőnket, és láthatjuk, ahogyan villog. Ezt szerettem volna megosztani veletek első körben. Remélem hasznos volt a cikk, és nem untátok halálra magatokat az olvasása közben! A következő cikk a digitális bemenet kezeléséről lesz, megtanuljuk használni a panelon lévő User nyomógombot. A későbbiekben pedig a jelenlegi projektem az RTC (Real-Time Clock) felélesztését fogom ismertetni veletek.

Következő: »»   5 / 5
Értékeléshez bejelentkezés szükséges!
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem