Napisao sam cudo komentara, trebalo bi da je sve jasno
// 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