I evo ga prvi projekat, neki naaaaj osnovniji startup code univerzalan za arm
Napisao sam cudo komentara, trebalo bi da je sve jasno
Dakle ko jos nije, krenite da citate The Insider's Guide To The STM32 ARM Based Microcontroller
Napisao sam cudo komentara, trebalo bi da je sve jasno
Code (c):
// Ovo nam je neophodan include posto sadrzi informacije
// o samom mikrokontroleru (adrese raznih registara i slicno)
#include "stm32f4xx.h"
//Globalne promenjljive
//posto cemo i da koristimo za brojac za pauzu
//stavljamo da bude volatile kako kompajler ne
//bi izbacio celu petlju u procesu optimizacije
//koda
volatile int i;
int main(void)
{
// Sve cetiri LEDare se na nasoj dev plocki
// nalaze na portu D,
// na pinovima 12, 13, 14 i 15
// Sada da uradimo ono sto na pic-u radimo sa:
/*
TRISDbits.TRISD12 = 0;
TRISDbits.TRISD13 = 0;
TRISDbits.TRISD14 = 0;
TRISDbits.TRISD15 = 0;
*/
// :D iliti ajmo da nasetujemo
// portove da budu GPIO i to OUTPUT
// Prvo nam treba struktura GPIO_InitTypeDef
// Ta struktura sadrzi podatke za setovanje
// GPIO perfierije na ARM-u
// Deklaracija promenjljive GPIO tipa GPIO_InitTypeDef
GPIO_InitTypeDef GPIO;
// Svaki zaseban "deo" samog mikrokontrolera moze da se
// upali / ugasi. Po default-u svi su ugaseni. Da bi
// upalio neki "delo/periferiju" treba da ukljucis
// njegov klok. Ovde sada palimo klok za port D.
// Obratite paznju da ako neki deo nema klok on ne trosi
// struju (zato su po defaultu svi ugaseni. Ako preskocimo
// ovu liniju, sve ce "delovati" da radi, ali fizicki
// sam port ce biti ugasen te u realnosti nikakvi signali
// na tom portu nece napustiti mcu
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
// Sada setujemo samo pinove na portu D da budu izlazni
// to radimo tako sto prvo popunimo GPIO_InitTypeDef strukturu
// i prosledimo je GPIO_Init funkciji.
// u varijabli GPIO_Pin GPIO_InitTypeDef strukture definisemo masku
// za pinove kojima hocemo da modifikujemo status
GPIO.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
// u varijabli GPIO_Mode GPIO_InitTypeDef strukture definisemo
// SMER
// GPIO_Mode_OUT je izlaz
// GPIO_Mode_IN je ulaz,
// GPIO_Mode_AF je "alternate function" (UART, SPI ..)
// GPIO_Mode_AIN je analogni ulaz
// GPIO_Mode_AN je analogni izlaz
// postoje (ne na ovom mcu-u) jos _in_floating za floating input,
// _ipd za input + pull down, _ipu za input + pull up,
// _out_od za output koji je open drain,
// _af_od za alternate function + open dran ..i verovatno jos neki
// koje ja nikad nisam koristio, zavisi od mcu-a do mcu-a
// sve zavisi, dakle na nekim mcu-ima se tip izlaza definise
// ovde, na ovom se definise kroz OType
GPIO.GPIO_Mode = GPIO_Mode_OUT;
// u varijabli GPIO_Otype GPIO_InitTypeDef strukture definisemo
// kog je tipa output. Na SMT32F4 se to definise kroz ovu varijablu
// a ne kroz GPIO_Mode kao na STM32F1 na primer.
// GPIO_OType_PP je PushPull izlaz (standardan)
// GPIO_OType_OD je Open Drain izlaz
// na ovom mcu-u nema trece vrste,
GPIO.GPIO_OType = GPIO_OType_PP;
// u varijabli GPIO_PuPd GPIO_InitTypeDef strukture definisemo
// push up / pull down na ovom pinu
// mogucnosti su _NOPULL za jeli "blanko", _UP i _DOWN za push up
// u pull down
GPIO.GPIO_PuPd = GPIO_PuPd_NOPULL;
// u varijabli GPIO_Speed GPIO_InitTypeDef strukture definisemo
// obratiti paznju da se ovo uvek odnosi na CEO PORT ne samo na
// odabrane pinove. Ovo definise brzinu na kojoj GPIO port prica
// sa jezgrom. Zavisno od frekvencije na kojoj radite i od mcu-a
// sa kojim radite ima raznih brzina. 50MHz je safe na skoro svim
// ARM procesorima, neki dozvoljavaju i vise (STM32F4 na discovery
// plocki radi na 100MHz ok.
// obratite paznju da veci takt znaci i veca potrosnja struje, ako
// ce port da pali i gasi ledaru jedno u sekundi 2MHz je vise nego
// dovoljno za frekvenciju gpio magistrale za taj port
GPIO.GPIO_Speed = GPIO_Speed_50MHz;
// i finalno pozovemo GPIO_Init i prosledimo port koji hocemo da
// setujemo i pointer na strukturu koju smo upravo napravili
GPIO_Init(GPIOD, &GPIO);
/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
///// GOTOVA INICIJALIZACIJA PORTA D NA KOM SU LEDARE ////////
/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
// beskonacna petlja
while(1){
// UPALIMO SVE CETIRI LEDARE
// Paljenje ledara tako sto upisemo 1 direktno u bit izlaznog
// registra (GPIO_Pin_## je samo makro koji definise vrednost
// koja ima 1 na odredjenoj lokaciji, tako je GPIO_Pin_0 = 1
// GPIO_Pin_1 = 2, GPIO_Pin_2 = 4 ...
// BSSRL je registar koji SETUJE pinove high, dakle oni koji
// dobiju keca bice setovani, a oni koji dobiju nulu NECE biti
// resetovani (spusteni low) vec ce ostati "kako su bili"
GPIOD->BSRRL = GPIO_Pin_12;
GPIOD->BSRRL = GPIO_Pin_13;
GPIOD->BSRRL = GPIO_Pin_14;
GPIOD->BSRRL = GPIO_Pin_15;
// ovo smo isto mogli da uradimo i ovako
GPIOD->BSRRL = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15 ;
// sada napravimo malu pauzu
for (i=0;i<1000000;i++);
// sada ugasimo ledare
// sve je isto samo sada koristimo registar BSRRH
// dakle oni koji dobiju keca bice setovani na low
// oni koji su na 0 ostaju kako su bili
GPIOD->BSRRH = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15 ;
// open mala pauza
for (i=0;i<1000000;i++);
}
}
// Ovo nam je neophodan include posto sadrzi informacije
// o samom mikrokontroleru (adrese raznih registara i slicno)
#include "stm32f4xx.h"
//Globalne promenjljive
//posto cemo i da koristimo za brojac za pauzu
//stavljamo da bude volatile kako kompajler ne
//bi izbacio celu petlju u procesu optimizacije
//koda
volatile int i;
int main(void)
{
// Sve cetiri LEDare se na nasoj dev plocki
// nalaze na portu D,
// na pinovima 12, 13, 14 i 15
// Sada da uradimo ono sto na pic-u radimo sa:
/*
TRISDbits.TRISD12 = 0;
TRISDbits.TRISD13 = 0;
TRISDbits.TRISD14 = 0;
TRISDbits.TRISD15 = 0;
*/
// :D iliti ajmo da nasetujemo
// portove da budu GPIO i to OUTPUT
// Prvo nam treba struktura GPIO_InitTypeDef
// Ta struktura sadrzi podatke za setovanje
// GPIO perfierije na ARM-u
// Deklaracija promenjljive GPIO tipa GPIO_InitTypeDef
GPIO_InitTypeDef GPIO;
// Svaki zaseban "deo" samog mikrokontrolera moze da se
// upali / ugasi. Po default-u svi su ugaseni. Da bi
// upalio neki "delo/periferiju" treba da ukljucis
// njegov klok. Ovde sada palimo klok za port D.
// Obratite paznju da ako neki deo nema klok on ne trosi
// struju (zato su po defaultu svi ugaseni. Ako preskocimo
// ovu liniju, sve ce "delovati" da radi, ali fizicki
// sam port ce biti ugasen te u realnosti nikakvi signali
// na tom portu nece napustiti mcu
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
// Sada setujemo samo pinove na portu D da budu izlazni
// to radimo tako sto prvo popunimo GPIO_InitTypeDef strukturu
// i prosledimo je GPIO_Init funkciji.
// u varijabli GPIO_Pin GPIO_InitTypeDef strukture definisemo masku
// za pinove kojima hocemo da modifikujemo status
GPIO.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
// u varijabli GPIO_Mode GPIO_InitTypeDef strukture definisemo
// SMER
// GPIO_Mode_OUT je izlaz
// GPIO_Mode_IN je ulaz,
// GPIO_Mode_AF je "alternate function" (UART, SPI ..)
// GPIO_Mode_AIN je analogni ulaz
// GPIO_Mode_AN je analogni izlaz
// postoje (ne na ovom mcu-u) jos _in_floating za floating input,
// _ipd za input + pull down, _ipu za input + pull up,
// _out_od za output koji je open drain,
// _af_od za alternate function + open dran ..i verovatno jos neki
// koje ja nikad nisam koristio, zavisi od mcu-a do mcu-a
// sve zavisi, dakle na nekim mcu-ima se tip izlaza definise
// ovde, na ovom se definise kroz OType
GPIO.GPIO_Mode = GPIO_Mode_OUT;
// u varijabli GPIO_Otype GPIO_InitTypeDef strukture definisemo
// kog je tipa output. Na SMT32F4 se to definise kroz ovu varijablu
// a ne kroz GPIO_Mode kao na STM32F1 na primer.
// GPIO_OType_PP je PushPull izlaz (standardan)
// GPIO_OType_OD je Open Drain izlaz
// na ovom mcu-u nema trece vrste,
GPIO.GPIO_OType = GPIO_OType_PP;
// u varijabli GPIO_PuPd GPIO_InitTypeDef strukture definisemo
// push up / pull down na ovom pinu
// mogucnosti su _NOPULL za jeli "blanko", _UP i _DOWN za push up
// u pull down
GPIO.GPIO_PuPd = GPIO_PuPd_NOPULL;
// u varijabli GPIO_Speed GPIO_InitTypeDef strukture definisemo
// obratiti paznju da se ovo uvek odnosi na CEO PORT ne samo na
// odabrane pinove. Ovo definise brzinu na kojoj GPIO port prica
// sa jezgrom. Zavisno od frekvencije na kojoj radite i od mcu-a
// sa kojim radite ima raznih brzina. 50MHz je safe na skoro svim
// ARM procesorima, neki dozvoljavaju i vise (STM32F4 na discovery
// plocki radi na 100MHz ok.
// obratite paznju da veci takt znaci i veca potrosnja struje, ako
// ce port da pali i gasi ledaru jedno u sekundi 2MHz je vise nego
// dovoljno za frekvenciju gpio magistrale za taj port
GPIO.GPIO_Speed = GPIO_Speed_50MHz;
// i finalno pozovemo GPIO_Init i prosledimo port koji hocemo da
// setujemo i pointer na strukturu koju smo upravo napravili
GPIO_Init(GPIOD, &GPIO);
/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
///// GOTOVA INICIJALIZACIJA PORTA D NA KOM SU LEDARE ////////
/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
// beskonacna petlja
while(1){
// UPALIMO SVE CETIRI LEDARE
// Paljenje ledara tako sto upisemo 1 direktno u bit izlaznog
// registra (GPIO_Pin_## je samo makro koji definise vrednost
// koja ima 1 na odredjenoj lokaciji, tako je GPIO_Pin_0 = 1
// GPIO_Pin_1 = 2, GPIO_Pin_2 = 4 ...
// BSSRL je registar koji SETUJE pinove high, dakle oni koji
// dobiju keca bice setovani, a oni koji dobiju nulu NECE biti
// resetovani (spusteni low) vec ce ostati "kako su bili"
GPIOD->BSRRL = GPIO_Pin_12;
GPIOD->BSRRL = GPIO_Pin_13;
GPIOD->BSRRL = GPIO_Pin_14;
GPIOD->BSRRL = GPIO_Pin_15;
// ovo smo isto mogli da uradimo i ovako
GPIOD->BSRRL = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15 ;
// sada napravimo malu pauzu
for (i=0;i<1000000;i++);
// sada ugasimo ledare
// sve je isto samo sada koristimo registar BSRRH
// dakle oni koji dobiju keca bice setovani na low
// oni koji su na 0 ostaju kako su bili
GPIOD->BSRRH = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15 ;
// open mala pauza
for (i=0;i<1000000;i++);
}
}
Dakle ko jos nije, krenite da citate The Insider's Guide To The STM32 ARM Based Microcontroller