Az első projekt létrehozása
A fejezet tartalma:- Projekt megnyitása
- Új projekt létrehozásának lépései
- A projekt testreszabása
- A projekt lefordítása és futtatása
- A rendszer órajelének beállítása
Projekt megnyitása
A projekteket a benne található .uvprojx kiterjesztésű állomány kapcsolja egységbe. Windows Intézőben vagy Total Commanderben ennek az állománynak a megnyitása elindítja a Keil MDK5 fejlesztői rendszert, és automatikusan megnyitja az adott projektet.A projekt megnyitásának másik módja az, hogy elindítjuk a a Keil MDK5 fejlesztői rendszert, majd a Project menü Open Project menüpontjában betallózzuk a projekt .uvprojx kiterjesztésű állományát.
Új projekt létrehozásának lépései
A projekt helyének és nevének megadása
A Projekt menü New µVision Project menüpontjának kiválasztásával kezdeményezhetjük új projekt létrehozását. Célszerű minden projektnek külön mappát nyitni, hogy az állományok ne keveredjenek össze, ezért a felbukkanó dialógus ablakban tallózzunk be egy üres mappát, vagy hozzunk létre egy újat, majd adjuk meg a projekt nevét (ez lesz az .uvprojx kiterjesztésű állomány neve), majd kattintsunk a Mentés gombra!Az alábbi példában mi az új mappának a nem túl fantáziadús Project01 nevet, magának a projektnek pedig a project01 nevet adtuk.
A target eszköz kiválasztása
A Select Device dialógus ablakban ki kell választanunk azt a mikrovezérlőt, amelyre a programot készítjük. Esetünkben (FRDM-KL25Z kártya) az NXP gyártó KL2x típuscsaládjának MKL25Z128xxx4 tagját kell választanunk. A kiválasztás után kattintsunk az OK gombra!A futtató környezet konfigurálása
A következő lépésben a projekt varázsló futtatói környezetnek nevezett (Run-Time Environment, röviden RTE) támogatói modulok becsatolását teszi lehetővé. Jelöljük be a CMSIS Core, valamint a Device Startup komponenseket, majd kattintsunk az OK gombra! A + jelekre kattintva lehet kibontani a listát...Megjegyzések:
- A CMSIS (Cortex Microcontroller Software Interface Standard) egy gyártófüggetlen absztrakciós réteg a Cortex-M mikrovezérlők számára. A CMSIS koncepció azt a célt szolgálja, hogy a különböző fejlesztőktől származó szoftver komponenseket kombinálni lehessen. Ennek egyik komponense a CMSIS-CORE, ami szabványos alkalmazásprogramozási felületet nyújt (API) a Cortex-M processzormaghoz és a rendszerperifériákhoz (Systick, NVIC).
- A Device Startup komponens
implementálja
a kiválasztott mikrovezérlőhöz tartozó indító kódot (a
vektor tábla feltöltése, a SystemInit()
és a SystemCoreClockUpdate()
függvények
definíciója). Mielőtt a main()
függvény meghívásra kerülne, lefut a SystemInit()
függvény, amely többek között beállítja az alapértelmezett
(vagy a system_MKL25Z4.h
állomány
módosításával általunk választott) órajel frekvenciát. Az MDK v5.20 az MKL25Z128xxx4
mikrovezérlő esetén alapértelmezetten belső oszcillátorral
20.97152
MHz-es órajelet állít be. Ha viszont a projektünkben
módosítjuk az
említett system_MKL25Z4.h
állományt, akkor egyszerű módon választhatunk az előre
definiált
beállítások között (definiálnunk kell 0 - 4 közötti értékkel
a CLOCK_DEFINE
makrót).
A projekt testreszabása
Igény szerinti átnevezések
A fenti lépések után a Project ablakban meg kell jelennie az új projektnek. Ízlés szerint átnevezhető a target és a forrásfájlok gyűjtőjének neve, de ez a projekt működését nem befolyásolja. Az átnevezés úgy történik, mint a Windows Intézőben: két lassú kattintás után szerkeszthetővé válik a név. Az alábbi példában mi FRDM névre kereszteltük át a targetet és "Source files" névre a Source group 1-et.Forrásfájl(ok) hozzáadása a projekthez
A projektünkben még nincs definiálva a main() függvény, tehát legalább egy forrásállománnyal bővítenünk kell a projektet. Kattintsunk jobb gombbal a Project ablakban a Source files névre, s a felbukkanó menüben válasszuk az Add new item to Group 'Source files' menüpontot! A felbukkanó ablakban válasszuk a C File (.c) opciót, s adjunk nevet az új állománynak (pl. main.c)!Ha a main.c állománynév megjelent a Project ablakban, akkor dupla kattintással nyissuk meg és másoljuk bele az alábbi listában olvasható szöveget.
Az majd a következő fejezet témája lesz, hogy hogyan működik ez a program. Most elég annyit tudnunk róla, hogy a kártyán a zöld LED-et villogtatja (kb. 0.5 s BE, majd 0.5 s KI). A mintaprogram egyébként Mazidi et al.: Freescale ARM Cortex-M Embedded Programming Using C Language c. könyvéből való (Program2_1).
1. lista: A Project01/main.c program listája
/* Project01/main.c
* Toggling LED in C using registers by addresses
* This program toggles green LED for 0.5 second ON and 0.5 second OFF.
* The green LED is connected to PTB19.
* The LEDs are active low ('0' turns ON the LED).
*
* This is a slightly modified version of the example code "Program2_1.txt"
* from the book of Mazidi et. al.: "Freescale ARM Cortex-M Embedded Programming
* Using C Language"
* http://www.microdigitaled.com/ARM/Freescale_ARM/Code/Ver1/Chapter2/Program2_1.txt
*
* Cycle count was modified in function DelayMs() since default setting of the CPU clock
* is 20 MHz in case of Keil MDK5 v5.20 RTE library (see in file system_MKL25Z4.h)
*/
/* System Integration Module System Clock Gating Control Register 5*/
#define SIM_SCGC5 (*((volatile unsigned int*)0x40048038))
/* Port B Pin Control Register 19*/
#define PORTB_PCR19 (*((volatile unsigned int*)0x4004A04C))
/* Port B Data Direction Register */
#define GPIOB_PDDR (*((volatile unsigned int*)0x400FF054))
/* Port B Data Output Register */
#define GPIOB_PDOR (*((volatile unsigned int*)0x400FF040))
void delayMs(int n);
int main (void) {
SIM_SCGC5 |= 0x400; /* enable clock to Port B */
PORTB_PCR19 = 0x100; /* make PTB19 pin as GPIO (See Table 2-4) */
GPIOB_PDDR |= 0x80000; /* make PTB19 as output pin */
while (1) {
GPIOB_PDOR &= ~0x80000; /* turn on green LED */
delayMs(500);
GPIOB_PDOR |= 0x80000; /* turn off green LED */
delayMs(500);
}
}
/* Delay n milliseconds
* The CPU clock is set to 20.97152 MHz in SystemInit() by default.
*/
void delayMs(int n) {
int i;
int j;
for(i = 0 ; i < n; i++)
for (j = 0; j < 3500; j++) {}
Konfiguráljuk a projektet!
Mielőtt lefordítanánk a beírt programot, ellenőrizzük és szükség esetén módosítsuk a projekt opciókat! Az előző oldalon már bemutatott programozó/hibavadász konfigurálásán kívül ellenőriznünk kell a target mikrovezérlőre vonatkozó beállításokat is.- Nyissuk meg ehhez a Project menü Options for Target 'xxxx' menüpontját (gyorsbillentyű: Alt + F7), vagy kattintsunk az Options for Target gombra az MDK5 Eszköztárában!
- A Device lapon az MKL25Z128xxx4 mikrovezérlő legyen kiválasztva!
- A Target lapon Az alábbi beállítások kellenek:
Xtal
(MHz): 8 (ez a kvarckristály frekvenciája)
ROM1 Start: 0x0 Size: 0x20000 (Flash ROM kezdő címe és mérete)
IRAM1 Start: 0x1FFFF000 Size: 0x4000 (RAM kezdőcíme és mérete)
ROM1 Start: 0x0 Size: 0x20000 (Flash ROM kezdő címe és mérete)
IRAM1 Start: 0x1FFFF000 Size: 0x4000 (RAM kezdőcíme és mérete)
- A Debug lapon a legördülő listából a CMSIS-DAP debuggert válasszuk ki! Mielőtt tovább lépnénk, csatlakoztassuk a FRDM-KL25Z kártyát a számítógéphez, majd kattintsunk a Settings gombra az előzőekben említett legördülő lista mellett!
- A felbukkanó dialógus ablak bal felső sarkában a legördülő listán
válasszuk ki az MBED CMSIS-DAP
eszközt és kattintsunk az OK
gombra!
- Kattintsunk a Debug fül
melletti Utilities fülre, majd
tegyünk pipát a Use Debug Driver
felirat elé és kattintsunk az OK
gombra!
A projekt lefordítása és futtatása
A projekt lefordításához válasszuk ki a Projekt menü Rebuild all target files menüpontját, vagy egyszerűen kattintsunk a gombra! Sikeres fordítás (0 Error, 0 Warning) esetén az alábbi üzenet jelenik meg:A program letöltéséhez a Keil MDK5 eszköztárában kattintsunk a LOAD feliratú gombra!
Ha szükséges, a programletöltés után nyomjuk meg a FRDM-KL25Z kártya RESET gombját a letöltött program futtatásához (nem mindig indul el automatikusan)!
Az 1. listán látható program a zöld LED-et villogtatja (kb. 0.5 s BE, majd 0.5 s KI).
A rendszer órajelének beállítása
Ahogy föntebb "A futtatói környezet konfigurálása"című szakaszban írtuk, új projekt létrehozásakor az alapértelmezett CPU órajel 20 MHz lesz. Ha a mikrovezérlőt maximális sebességgel szeretnénk futtatni, akkor nyissuk meg a system_MKL25Z4.h állományt és valahol, még a #ifdef CLOCK_SETUP sor előtt szúrjuk be az alábbi definíciót!#define CLOCK_SETUP 1
Ennek hatására a feltételes fordítási direktívák az előre definiált
órajel konfigurációk közül most már nem az alapértelmezett nullás
sorszámú, hanem az 1-es sorszámú beállítást iktatják be a programunkba,
ami 48 MHz-es CPU frekvenciát, a periféria buszon pedig 24 MHz-es
órajelet konfigurál. Ha azt akarjuk, hogy a programunk időzítései ne változzanak meg, akkor a delayMs() függvényt is hozzá kell igazítanunk a megváltozott órajelhez. Több várakozó ciklust kell beiktatnunk, ezért a korábbi 3500 helyett írjunk 8195-öt! A módosított függvény listája lentebb látható.
2. lista: A módosított delayMs() függvény listája
/* Delay n milliseconds
* Now the CPU clock is set to 48 MHz in SystemInit().
*/
void delayMs(int n) {
int i;
int j;
for(i = 0 ; i < n; i++)
for (j = 0; j < 8195; j++) {}