[ bogdan.kecman @ 29.02.2012. 04:02 ] @
I evo ga prvi projekat, neki naaaaj osnovniji startup code univerzalan za arm
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++);


     }
}
 



Dakle ko jos nije, krenite da citate The Insider's Guide To The STM32 ARM Based Microcontroller
[ bogdan.kecman @ 29.02.2012. 04:13 ] @
btw, momci i devojke, pitajte ODMA ako nesto nije jasno ... kriva ucenja mora da bude vrlo strma, ove osnovne stvari nece dugo da traju tako da odma pitajte sta nije jasno da razjasnjavamo (sto sam C, sto sve ostalo)... posto kada predjemo na malo kompleksnije stvari bice glupo ako neko pita cemu sluzi "i++" :) dakle nemo da vas je blam nego oma pitajte sta nije jasno ..
[ Odin D. @ 29.02.2012. 12:45 ] @
Odlican tutorial.

A imam i ja nesto da dodam:
Elem, neko se zalio da se upetljao prilikom skakutanja iz funkcije u funkciju tokom inicijalizacije, sto je razumljivo, s obzirom da je set-up procesora razbacan u nekoliko fajlova i vise funkcija gdje se ne zna ko koga...
Ono sto sam ja prije godinu i nesto uradio sa STM32F1... je da sam uzeo neki blinking_led primjer (cini mi se da je bio od Olimex-a), sa ST-ovom bibliotekom i onda ga potjerao u debug modu step-by-step (ne preskacuci funkcije).
Tada sam tacno pratio redosljed i trenutke upisa pojedinih vrednosti u pojedine registre i napravio listu koja je izgledala otprilike ovako:

Code:

1. ime_registra:     adresa_registra:      pripada_periferiji:        vrednost_koja_se_upisuje            Komentar
2.
3.
....

Ima tu jos i nekih cekanja, dok se clock stabilizuje i tako to...

Komentare sam napisao citajuci u datasheetu cemu koji registar sluzi.

Tada sam napokon za pola sata skontao sta se u "realnom svijetu" desava sa tim mikrokontrolerom, nakon sto sam se dva dana gubio po biblioteci pokusavajuci da uhvatim nit.
Elem, vjerovatno cu to uraditi i za STM32F4 (sad ne mogu, nisam kod kuce), ali imam pitanje za ove sto se razumiju u Atollic: prosli put kad sam to radio bio je "cisti" Eclipse i debug je startovao od samog pocetka, tj. od inicijalizacije (oscilatori, clockovi, prebacivanje na PLL...). Ovaj Atollic smandrlja to sve i zaustavi se tek kod main(), tako da je inicijalizacija vec prosla :(
Zna li neko kako se taj "preskok" do main() iskljucuje?

[ bogdan.kecman @ 29.02.2012. 13:02 ] @
Citat:
Odin D.: Zna li neko kako se taj "preskok" do main() iskljucuje?


u debug configuration imas tab "startup debug" tu je ono sto on posalje gdb-proxy-u u startu .. default je

Code:

# Set flash parallelism mode to 32, 16, or 8 bit when using STM32 F2/F4 microcontrollers
# Uncomment next line, 2=32 bit, 1=16 bit and 0=8 bit parallelism mode
#monitor flash set_parallelism_mode 2

# Load the program executable
load

# Set a breakpoint at main().
tbreak main

# Reset to known state
monitor reset

# Run to the breakpoint.
continue


mislim da ti je jasno sve :D

ako izbacis continue - on uopste nece krenuti, te nece stici do main-a vec onda odma mozes da krenes step-step.

inace pogledaj startup_stm32f4xx.s

tu ti je sav startup code :) i potpuno je identican za cortex-m3 i cortex-m4 :)
[ Odin D. @ 29.02.2012. 13:37 ] @
Fala, probacemo taj debug veceras/sutra :)

Ovaj startup_stm32f4xx.s svjedeno samo poziva SistemInit u nekom momentu, tako da se iz njega ne vide detalji sta se stvarno zbiva u tom procesu inicijalizacije.
Cortex uvijek startuje sa nekim svojim unutrasnjim oscilatorom, bez obzira kako bio konfigurisan (recimo na eksterni oscilator). To je zato da bi procesor startovao cak i ako bi eksterni oscilator bio neispravan. Onda ti u tom modu provjeris da npr. da li eksterni oscilator fercera, pa ako da - onda ga prikopcas na PLL, pa startujes PLL, pa sacekas da se zalaufa, pa provjeris da li PLL radi, pa ako da - onda prebacis jezgro na njega i vozis dalje. Medjutim, ako bilo sta od toga zakaze, ti mozes sve te oscilatore ignoristati i skociti na main() sa onim default oscilatorom... Sva ta procedura i setup se fino vidi u step-by-step debugu i sve se odigrava u obicnom C kod, ne kao ovo u ovom .s fajlu.

Naravno, sve se to moze upratiti i rucno, citajuci kod, ali od silnih isprepletenih poziva i definicija promjenjivih, konstanti i funkcija koje imaju po 15 rijeci u nazivu pogubi se co'ek...



[ bogdan.kecman @ 29.02.2012. 13:52 ] @
da, on ti je klasicno u system_stm32f4xx.c i nije tezak za ispraviti .. inace mozes da otvoris startup.s i stavis breakpoint na primer na systeminit i onda picis odatle (i ne moras da menjas onaj setup za debager)
[ Odin D. @ 29.02.2012. 14:10 ] @
Da, vidim sad da je to relativno fino skockano u system_stm32f4xx.c.
Moje prvo iskustvo sa STM32F1xx nazalost nije bilo tako "pregledno", ko zna sta sam ja bio nasao...

Citat:
bogdan.kecman: inace mozes da otvoris startup.s i stavis breakpoint na primer na systeminit i onda picis odatle (i ne moras da menjas onaj setup za debager)

Da li se onaj breakpoint u configu za debug racuna u onaj Atollicov limit u pogledu broja breakpointova za Lite verziju ili jok?
[ bogdan.kecman @ 29.02.2012. 14:14 ] @
ne :D

btw, sta je fora, ti mozes uvek da ugasis breakpoint pa da ga upalis na drugom mestu ... inace mislim da je limit na 1 breakpoint samo u gui-u .. mozes ja mislim direktno da ukljucis koliko oces breakpointa rucno u gdb-u no ne secam se dal sam probao
[ Odin D. @ 29.02.2012. 14:34 ] @
^ Ma ja kliknem kursor u kod pa lupim "Run to line". Jedan klik misem i jedan klik na tastaturu.
A jos od kako sam nabavio tastaturu sa mehanickim klikom, eeeee... :)
[ milanmeh @ 29.02.2012. 14:47 ] @
Imam jedno pitanje za gurua kecmana i jedan opšti predlog.

Pitanje je u vezi ovog parceta koda:

Code:

// 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;


Na cega se odnosi ovo push up i pull down? Da li su to interni pull up i pull down otpornici u GPIO pinu?



Sto se tice predloga, mislim da bi trebalo kontaktirati administratore da odabrane teme postave kao sticky, kako se ne bi gubile. Ili jos bolje, ako se ovi tuorijali budu pisali u obliku zasebnih tema, da dobijemo pod sobu u sobi o mikrokontrolerima pod nazivom ARM ili STM32F4. Tako bi sve teme bile na gomili i lako dostupne.

Sta mislite o ovome?
[ Odin D. @ 29.02.2012. 14:54 ] @
Citat:
milanmeh: Sta mislite o ovome?

Koliko ja pratim ovaj forum, izgledi da se tako nesto desi postoje jedino ako se forumasenje oko STM32 "otme kontroli", tj. da se dobrano zalaufa.
Bilo je vec vise pokusaja da se otvore neki dodatni podforumi, ali izgleda da je lakse da dobijes neku vladinu agenciju za nesto, nego novi podforum :)
No vidjecemo, vjerovatno je opste misljenje odgovornih da sam optimizam nije dovoljan za otvaranje novog foruma, a vjerovatno nece biti neki problem kada se taj optimizam realizuje kroz nekoliko (ili vise) tema koje 'rade'...
[ HeYoo @ 29.02.2012. 15:03 ] @
Ima u reference manual za stm32f4 internu strukturu za svaku periferiju i za sta sluzi koji registar.
[ bogdan.kecman @ 29.02.2012. 15:11 ] @
Citat:
milanmeh

GPIO.GPIO_PuPd = GPIO_PuPd_NOPULL;
Na cega se odnosi ovo push up i pull down? Da li su to interni pull up i pull down otpornici u GPIO pinu?


Da. STM32 ima na izlazima push up i pull down otpornike. Pogledaj samo datasheet, nema na svim izlazima sve mogucnosti. Struktura je ista za sve ali ne mora da znaci da hardware postoji na svakom pinu. Ista prica i za open drain, ti mozes da setujes, ali ne mora svaki pin da ima tu mogucnost.. dakle za te stvari mora da se kontaktira uvek datasheet za odredjeni mcu

sto se tice "sticky" - ako budemo pisali - bice u vrhu, ako ne budemo, onda nema razloga ni da budu
sto se tice zasebnog foruma - sa tri teme je prerano pricati o tome, a ako preplavimo forum sa arm-om vec ce se moderatori sami dosetiti da to presele u novu forum :)
[ lazar00 @ 29.02.2012. 22:32 ] @
Nije mi jasno na sta se odnosi ovaj gore kod? Da li je ovo header file?
I zasto nema istih komandi kao sto su u one u atollicu ? o.O
takodje mi nije jasno
Code:
GPIO_InitTypeDef  GPIO;

zar se u c-u ne definisu tipovi na sledeci nacin

Code:
typedef short   SMALLINT 

-------------------------------------------------------------------------------------
Code:
 GPIO.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;

sta rade ovi separatori "|" ?
Pitanje jeste glupo,ali meni je ovo skroz konfuzno.

p.s. zasto se ova inicjalizacija razlikuje od one u blink primeru sto smo radili sa LEDarama?
skroz sam pogubljen,ne znam da l' sam pos'o il' sam dos'o. :/

[Ovu poruku je menjao lazar00 dana 29.02.2012. u 23:52 GMT+1]
[ Odin D. @ 29.02.2012. 23:03 ] @
^ Jel to Laslo izlapio il' je Bolonja dotukla skolstvo po propisu :)

Kao sto je vec pomenuto na komsijskoj temi, downloaduj ovu biblioteku:
http://www.st.com/internet/com.../stm32f4_dsp_stdperiph_lib.zip
a u njoj imas .chm fajl u kom je odgovor na ova gore pitanja u vezi biblioteckih tipova i struktura.

Ako neko zna neki dobar tutorial za C (ja se odavno za to nisam interesovao, pa ne znam sta je u trendu), bilo bi dobro da na njega skrene paznju kolegama kojima je potrebna pomoc sa C-om. Mozda ne bi bilo lose da se otvori tema "Embedded C", pa da se tamo malo "pogura" C jezik...
[ lazar00 @ 29.02.2012. 23:11 ] @
Mislim da je Laslo i dalje dobar,a problem je do mene. Citam ovaj datasheet,ja iz njega razumem samo onaj sadrzaj,ostalo kako uzmem da citam,ili mi je nepoznat termin ili veze nemam kako to radi. mislim da sam u velikom problemu !
[ HeYoo @ 29.02.2012. 23:12 ] @
@lazar
Drugacije je jer je ono bio cisto test za atollic. Sustinske razlike nema sem u oznakama. Tamo su se koristile macro-i napravljeni bas za discovery plocicu i njene led,a ovde se mogu primeniti na bilo koji io pin.

| je oznaka za binarnu logicku operaciju ili. Ako je x=0001 ,a y=0100 onda je x|y jednako 0101
To je samo jedan od nacin kako da se upise vise bita u neki registar.

http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B
[ lazar00 @ 29.02.2012. 23:31 ] @
ok,setio sam se bitskih i logickih operatora.
da li ce ovo da radi ako ubacim sada umesto postojeceg koda u kontroleru?
[ Odin D. @ 29.02.2012. 23:40 ] @
Citat:
lazar00: Citam ovaj datasheet,ja iz njega razumem samo onaj sadrzaj,ostalo kako uzmem da citam,ili mi je nepoznat termin ili veze nemam kako to radi. mislim da sam u velikom problemu !

Polako polako, samo bez panike.
Ako nisi ranije radio ni sa jednim mikrokontrolerom, normalno je da ne mozes mnogo toga u startu razumjeti, a pogotovo kod ovog mikrokontrolera kod koga je kolicina informacija prilicno velika i razbacana po vise dokumenata.

Za pocetak, obnovi malo C, pogotovo pointere (pokazivace), strukture, tipove, definisanje tipova, #include direktivu, .h fajlove... (standardne biblioteke za PC mozes slobodno da preskocis, samo pici cisti C). A onda malo prouci onu gore pomenutu .chm dokumentaciju za STM biblioteku.

Za par dana kad se to slegne, pricacemo malo i o datasheetovima i onome sta u njima pise, ali sada prvo C.


PS
Sta se zbiva sa preostalih 20-tak ljudi, kako ide?
[ HeYoo @ 29.02.2012. 23:41 ] @
Radice ali je poenta skontati otprilike potrebne korake kako bi podesili neku periferiju pre samog koriscenja. Cak i GPIO ima dosta nacina na koji moze da se ponasa.
Mnogo mogucnosti -> mnogo podesavanja pre same upotrebe :D
Za neki drugi problem bi mozda bilo potrebno podesiti na drugi nacin i onda pre svega prelistas dokumentaciju i pronadjes sta te interesuje.
[ goran_68 @ 01.03.2012. 00:07 ] @
Ja sam se zabo oko SysTick primera jer sam hteo da u Bogdanov kod umesto one for petlje dodam Delay(); Radi to ali ne blinka u odgovarajucem ritmu. Ocigledno da je problem sa podesavanjem oscilatora.
[ goran_68 @ 01.03.2012. 00:37 ] @
Nasao:
Clock configuration tool
i AN3988
Pa ako pomogne, javljam.
[ New Village DC @ 01.03.2012. 01:35 ] @
Odlicno uputstvo, bacio sam pogleda na brzinu i imacu par pitanja, ali cu ih postaviti sutra kad sve pogledam detaljnije.

Svidja mi se ovakav nacin predstavljanja koda, sa sve komentarima. Nama pocetnicima ce te cake i objasnjenja mnogo znaciti, tako da: komentarisite sto vise.
[ bogdan.kecman @ 01.03.2012. 07:02 ] @
Citat:
lazar00: Nije mi jasno na sta se odnosi ovaj gore kod? Da li je ovo header file?


ne, to je sadrzaj "main.c"


Citat:
lazar00:I zasto nema istih komandi kao sto su u one u atollicu ? o.O


cini mi se da je odin vec odgovorio, dakle ono je bilo samo proba da li atollic radi ili ne, ovde pricamo o globalno arm kontrolerima, ovako se setuje na svakom, atollic ima posebnu biblioteku koja direktno pristupa ovim ledarama i direktno pristupa dugmetu, ali to necemo koristiti posto nema svrhe mnogo za ucenje :)

Citat:
lazar00:takodje mi nije jasno
Code:
GPIO_InitTypeDef  GPIO;

zar se u c-u ne definisu tipovi na sledeci nacin

Code:
typedef short   SMALLINT 




typedef short smallint - kreira novi tip podataka koji se zove smallint a koji je u stvari shor
GPIO_InitTypeDef GPIO kreira varijablu GPIO koja je tipa GPIO_InitTypeDef



Citat:
lazar00:
Code:
 GPIO.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;

sta rade ovi separatori "|" ?
Pitanje jeste glupo,ali meni je ovo skroz konfuzno.


to su binarlni operatori, prostudiraj binarne operatore u C-u posto se to mnoooooooooooogo koristi u radu sa mikrokontrolerima, bez toga mozes samo da pevas borbene :D
http://www.cprogramming.com/tutorial/bitwise_operators.html

Citat:
lazar00:p.s. zasto se ova inicjalizacija razlikuje od one u blink primeru sto smo radili sa LEDarama?
skroz sam pogubljen,ne znam da l' sam pos'o il' sam dos'o. :/


ignorisi onaj source, on je samo test da li sve radi
[ bogdan.kecman @ 01.03.2012. 07:04 ] @
Citat:
New Village DC: Odlicno uputstvo, bacio sam pogleda na brzinu i imacu par pitanja, ali cu ih postaviti sutra kad sve pogledam detaljnije.

Svidja mi se ovakav nacin predstavljanja koda, sa sve komentarima. Nama pocetnicima ce te cake i objasnjenja mnogo znaciti, tako da: komentarisite sto vise.


bice komentara u stvari sve manje i manje ... pitajte sta nije jasno, u ovom primeru sta je izkomentarisano, ja takve stvari vise necu komentarisati ... na primer vise nikad necu komentarisati zasto je nesto volatile, ili sta koji property GPIO_InitTypeDef radi i zasto ga postavljam na koju vrednost..
[ tomam @ 01.03.2012. 07:27 ] @
Ima u reference manual za stm32f4 internu strukturu za svaku periferiju i za sta sluzi koji registar.

Moje misljenje da bi kad se referencirate na neki dokument , bilo dobro dati link (ne samo naziv dokumenta) , zbog pocetnika (ljudi koji se ne snalaze nabolje)

Pozdrav
DINO smo poceli BRAVO za Odina bogdan.kecman .......
[ vos @ 01.03.2012. 07:45 ] @
Evo samo da primetim u originalnom Bogdanovom kodu da je mozda bolje umesto ovoga:

GPIOD->BSRRL = GPIO_Pin_12;

koristiti funkciju koja postoji u STM biblioteci:

GPIO_SetBits(GPIOD, GPIO_Pin_12)
GPIO_ResetBits(GPIOD, GPIO_Pin_12)

ili

GPIO_WriteBit(GPIOD, GPIO_Pin_12, Bit_SET) // umesto Bit_SET moze i Bit_RESET koji setuje pin na 0

Ove funkcije ustvari rade bas ono sto je Bogdan naveo (setuju vrednosti registrima BSRRL i BSRRH). Naravno i ovde su moguce | operacije za istovremeno setovanje vrednosti vise bitova.
[ the_tosic @ 01.03.2012. 09:54 ] @
Slazem se i meni je nekako logicnije (mada kontam da su iskusniji ljudi navikli onako sa upisom u registar).

Citat:
Odin D.:PS
Sta se zbiva sa preostalih 20-tak ljudi, kako ide?


Sa C-om dobro stojim, ovo sam presao kad sam nabavio discovery, td cekam sledeci korak :).
[ bogdan.kecman @ 01.03.2012. 10:24 ] @
prvo da prodjemo kako se stvari rade "direktno" ... te neke osnovne .. a onda polako ukljucujemo biblioteke (cmsis, rcc, gpio...)
[ _str_ @ 01.03.2012. 15:10 ] @
Za probu sam koristio Keil 4.23, ST-link USBdriver za xp, a za generisanje 'system_stm32f4xx.c' fajla Clock configuration tool.
Debug radi normalno, dok direktan flash nesto steka. Evo i primera kako izgleda:
Code:
//******************************************//
//               LED  on/off                //
//******************************************//


#include "system_stm32f4xx.c"
#include "stdio.h"


//------------------------------------------------------------------
// Funkcija 'pauza_ms(x)' je kalibrisana za SYSCLK 168MHz i otuda 'i=33333'
// Za sporije jezgro smanjiti vrednost 'i'
void pauza_ms(vu32 wtf)
{
    vu16 i;
    while(wtf--)
    {
        for(i=33333;i>0;i--);
    }
}


//-----------------------------------------------------------------------
// Funcija 'LED_on(x)' ukljucuje LED_1 | LED_2 | LED_3 ili LED_4, gde je 
// 'x' broj LEDiode, ako je vrednost 'x' nula onda se ukjucuju sve cetiri 

void LED_on(u8 led_sw)
{
     switch(led_sw)
    {
         case 0:
            GPIO_SetBits(GPIOD, GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15);
        break;

         case 1:
            GPIO_SetBits(GPIOD, GPIO_Pin_12);
        break;

         case 2:
            GPIO_SetBits(GPIOD, GPIO_Pin_13);
        break;

         case 3:
            GPIO_SetBits(GPIOD, GPIO_Pin_14);
        break;

         case 4:
            GPIO_SetBits(GPIOD, GPIO_Pin_15);
        break;


        default:
        break;
    }
}

//------------------------------------------------------------------------
// Funcija 'LED_off(x)' iskljucuje LED_1 | LED_2 | LED_3 ili LED_4, gde je 
// 'x' broj LEDiode, ako je vrednost 'x' nula onda se iskjucuju sve cetiri 

void LED_off(u8 led_sw)
{
     switch(led_sw)
    {
         case 0:
            GPIO_ResetBits(GPIOD, GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15);
        break;

         case 1:
            GPIO_ResetBits(GPIOD, GPIO_Pin_12);
        break;

         case 2:
            GPIO_ResetBits(GPIOD, GPIO_Pin_13);
        break;

         case 3:
            GPIO_ResetBits(GPIOD, GPIO_Pin_14);
        break;

         case 4:
            GPIO_ResetBits(GPIOD, GPIO_Pin_15);
        break;


        default:
        break;
    }
}

//-------------------------------------------------------
// Konfigurisanje LED-ova...

void LED_Config()
{
     // 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_2MHz;

     // i finalno pozovemo GPIO_Init i prosledimo port koji hocemo da
     // setujemo i pointer na strukturu koju smo upravo napravili
    GPIO_Init(GPIOD, &GPIO);    
}







//-------------------------------------------------------
// Pocetak 'glavnog programa'...

int main(void)
{
    LED_Config();
    
    while(1)
    {
        u8 u,i;
        for(i=10;i>0;i--)
         {
            for(u=4;u>0;u--)
            {
                LED_on(u);
                pauza_ms(20);
                LED_off(u);
                pauza_ms(15);
            }        
        }

        LED_on(0);
        for(i=8;i>0;i--)
        {
            LED_off(4);
            pauza_ms(50);

            LED_off(1);
            LED_on(4);
            pauza_ms(50);

            LED_off(2);
            LED_on(1);
            pauza_ms(50);

            LED_off(3);
            LED_on(2);
            pauza_ms(50);

//            LED_off(4);
            LED_on(3);
        }

        LED_off(0);

    }     
}


Evo i 'system_stm32f4xx.c', podesavanja su vidljiva u tablici u okviru istog fajla.
[ elaki @ 01.03.2012. 21:18 ] @
Pitanja u vezi startup koda sa pocetka teme:

1.
Napravili smo promenljivu GPIO (koja je tipa GPIO_InitTypeDef), dodelili smo vrednosti njenim clanovima
i treba da pozovemo funkciju za inicijalizaciju GPIO_Init kojoj prosledjujemo port i pointer na GPIO strukturu.
To se jasno vidi i iz stm32f4xx_gpio.c:

00175 /**
00176 * @brief Initializes the GPIOx peripheral according to the specified parameters in the GPIO_InitStruct.
00177 * @param GPIOx: where x can be (A..I) to select the GPIO peripheral.
00178 * @param GPIO_InitStruct: pointer to a GPIO_InitTypeDef structure that contains
00179 * the configuration information for the specified GPIO peripheral.
00180 * @retval None
00181 */
00182 void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
.
.

Ovde me zbunjuju ove zvezdice. Sta one znace? Citajuci o C-u video sam da je zvezdica "indirection operator"
i u primerima stoji ispred promenljive - bez razmaka, i drugo, u opisu ovde stoji da je samo drugi parametar
ove funkcije pointer a zvezdica se nalazi kod oba?

2.
Da smo hteli, npr. na istom portu da definisemo nekoliko pinova koji bi bili ulazni, da li bi onda trebalo da
definisemo novu promenljivu (isto tipa GPIO_InitTypeDef), dodelimo vrednost njenim clanovima u skladu sa svrhom
(ulazi) i ponovo pozovemo GPIO_Init. Sta se tada desava sa clanom nove strukture koji definise klok - posto
se klok odnosi na ceo port, da li se on izostavlja ili se vodi racuna da bude isti kao u prethodnoj strukturi?
[ HeYoo @ 01.03.2012. 22:59 ] @
Meni pre lici da je ovo prvo macro pointera
#define GPIOD ((GPIO_TypeDef *) GPIOD_BASE)
a ovo da je klasicna promenljiva
GPIO_InitTypeDef GPIO;

void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
ocekuje adrese za parametre pa zato &GPIO

GPIOSpeed je ovako komentarisan:

GPIOSpeed_TypeDef GPIO_Speed; /*!< Specifies the speed for the selected pins.
This parameter can be a value of @ref GPIOSpeed_TypeDef */

Koliko vidim u dokumentaciji svaki port ima 32bitni OSPEEDR registar koji prlagodjava izlaze tj tranzistore da mogu da isprate odredjene brzine (rise i fall time)



[Ovu poruku je menjao HeYoo dana 02.03.2012. u 01:05 GMT+1]
[ bogdan.kecman @ 02.03.2012. 06:50 ] @
Citat:
elaki:

1.
Napravili smo promenljivu GPIO (koja je tipa GPIO_InitTypeDef), dodelili smo vrednosti njenim clanovima
i treba da pozovemo funkciju za inicijalizaciju GPIO_Init kojoj prosledjujemo port i pointer na GPIO strukturu.
To se jasno vidi i iz stm32f4xx_gpio.c:

00175 /**
00176 * @brief Initializes the GPIOx peripheral according to the specified parameters in the GPIO_InitStruct.
00177 * @param GPIOx: where x can be (A..I) to select the GPIO peripheral.
00178 * @param GPIO_InitStruct: pointer to a GPIO_InitTypeDef structure that contains
00179 * the configuration information for the specified GPIO peripheral.
00180 * @retval None
00181 */
00182 void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
.
.

Ovde me zbunjuju ove zvezdice. Sta one znace? Citajuci o C-u video sam da je zvezdica "indirection operator"
i u primerima stoji ispred promenljive - bez razmaka, i drugo, u opisu ovde stoji da je samo drugi parametar
ove funkcije pointer a zvezdica se nalazi kod oba?


koje zvezdice ?

Sve izmedju /* i */ je komentar, ako mislis na te zvezdice samo su deo komentara

ako mislis na GPIO_TypeDef* GPIOx zvezdicu, to znaci da se prosledjuje pointer na strukturu GPIO_TypeDef a ne kopija strukture. Dakle kada zoves GPIO_Init to mozes da uradis ovako:

Code:

GPIO_TypeDef struktura;

struktura.nesto = x;
struktura.nestodrugo = y;
...

GPIO_Init(&struktura .. 


vidis ovde pre struktura & to znaci da fuknciji saljemo adresu na kojoj se nalazi struktura a ne kopiju strukture.

druga mogucnost je sledeca:


Code:

GPIO_TypeDef * pointernastrukturu;

//e sad posto pointer na strukturu ne kreira objekat u memoriji
// vec je samo pointer na memorisku lokaciju onda nam treba
// da kreiramo objekat, tj rezervisemo mesto za njega u ram-u

pointernastrukturu = (GPIO_TypeDef *) malloc( sizeof (GPIO_TypeDef) );

// dakle malloc je rezervisao onoliko bajtova koliko je velika 
// struktura GPIO_TypeDef i pointer na tu memorisku lokaciju
// ja smesten u nasu varijablu pointernastrukturu 


// obrati paznju da se sada clanovima strukture pristupa sa -> a ne sa .
// posto je pointernastrukturu pointer a ne struktura
pointernastrukturu->nesto = x;
pointernastrukturu->nestodrugo = y;
...

// i finalno mozemo da prosledimo taj pointer GPIO_Init funkciji
GPIO_Init(pointernastrukturu .. 


jasno?



Citat:
elaki
2.
Da smo hteli, npr. na istom portu da definisemo nekoliko pinova koji bi bili ulazni, da li bi onda trebalo da
definisemo novu promenljivu (isto tipa GPIO_InitTypeDef), dodelimo vrednost njenim clanovima u skladu sa svrhom
(ulazi) i ponovo pozovemo GPIO_Init. Sta se tada desava sa clanom nove strukture koji definise klok - posto
se klok odnosi na ceo port, da li se on izostavlja ili se vodi racuna da bude isti kao u prethodnoj strukturi?


NE :) moze da se koristi ista varijabla
sta je fora, ne mozemo istovremeno da definisemo i ulazne i izlazne pinove ali je sledeca stvar skroz ok:

Code:

    GPIO_InitTypeDef GPIO;

    // definisemo 12-15 kao output
    GPIO.GPIO_Pin=GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
    GPIO.GPIO_Mode=GPIO_Mode_OUT;
    GPIO.GPIO_OType=GPIO_OType_PP;
    GPIO.GPIO_PuPd=GPIO_PuPd_NOPULL;
    GPIO.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOD, &GPIO);    

    // definisemo 5 i 6 kao input
    // ostale clanove (npr speed) ne moramo da setujemo ponovo
    // posto su vec setovani malopre, posto koristimo istu varijablu
    GPIO.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_6;
    GPIO.GPIO_Mode=GPIO_Mode_IN;
    GPIO_Init(GPIOD, &GPIO);    


[ Odin D. @ 02.03.2012. 12:36 ] @
Implementing Multiple Breakpoints with Atollic Lite
http://www.stm32challenge.com/node/124

Code:

Implementing Multiple Breakpoints with Atollic Lite
 
1. Create a software break function (in your main program) and set the single hardware breakpoint within.
 
void Break(int Number) {
    volatile int Temp;
    Temp = Number;  <------ set a single hardware breakpoint here!
}
 
 
2. Place a Function Prototype in any source file that will use the Break() function
// debug function to allow multiple breakpoints
void Break(int);
 
3.  Place the Break function before the line you wish to break.
     Increment the Break Number parameter each time you insert the Break() function.
 
    /* Start the scheduler. */
Break(1);
vTaskStartScheduler();
 
void vButtonLedtInitialise( void ) { GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
Break(2);
GPIO_Init( GPIOC, &GPIO_InitStructure );
 
4. Build the Program and run the Debugger. You will hardware break within the common Break() function as shown below.
    The Break number can be inspected by "hovering" the cursor over it.
    The "Step Out Of" command will place you at the desired line of code you wish to debug.
 
void Break(int Number)
{
volatile int Temp;
Temp = Number;    <---------- hardware will break here, current value of Number will help identify which source line caused the break.
}
 
Admittedly not as convenient as double-clicking on a source line to set a breakpoint, but it will get the job done.
 
Cheers,
Jim Lynch


[Ovu poruku je menjao Odin D. dana 02.03.2012. u 16:05 GMT+1]
[ tomam @ 02.03.2012. 14:45 ] @
Samo da dodam

// komentar do kraja linije

/* pocetak komentara


u vise linija



*/ kraj komentara

znaci pred porocesor to ignorise
[ elaki @ 02.03.2012. 17:42 ] @
Kad sam se usudio da postavljam pitanja o pointerima i strukturama to u najmanju ruku podrazumeva da sam savladao komentare... :)
salu na stranu, funkcija GPIO_Init trazi dva parametra: GPIO_TypeDef* GPIOx i GPIO_InitTypeDef* GPIO_InitStruct (to su te dve zvezdice)
kada je pozivamo, u nasem primeru joj prosledjujemo: GPIOD i &GPIO. Ako prethodno navedene zvezdice oznacavaju da funkciji treba dati pointere a mi koristimo & samo u drugom parametru (&GPIO), da li to znaci da je GPIOD po prirodi stvari pointer?
To je bila sustina prvog dela mog prethodnog pitanja. Odgovor na drugi deo mi je jasan.
[ elektrostudio @ 02.03.2012. 21:19 ] @
@ODIN - ostatak (20-tak) verovatno prati kao i ja koliko vreme dopusta... ukoliko zapne negde javljam se. Do sada je sve ok i razumljivo (bar za mene). +++ za Bogdana i komentare u okviru koda. Nek svi nauce da je jedan od najvaznijih elemenata programiranja komentar . Necu da zurim sa nekim stvarima, doci ce na red (dok se ostali prikljuce).
@elaki - jeste, GPIOD je zapravo adresa GPIOD_BASE sto je zapravo AHB1PERIPH_BASE+0x0C00 sto se vidi iz stm32f4xx.h
a kako je base 0x4002 0000 + 0x0C00 adresa je 0x4002 0C00 sto je zapravo GPIOD - strana 50 RefManual32F4



[Ovu poruku je menjao elektrostudio dana 02.03.2012. u 23:05 GMT+1]
[ elaki @ 02.03.2012. 22:19 ] @
evo, sad sam nasao:
#define GPIOD ((GPIO_TypeDef *) GPIOD_BASE)
u stm32f4xx.h
[ Odin D. @ 02.03.2012. 22:47 ] @
Najlakse je da te stvari procesljas u onom .chm helpu koji dolazi iz biblioteke.
Koriscenjem search-a, polazeci od GPIOD, pa u rikverc, dobijes za 20 sekundi ovo:

search: GPIOD
#define GPIOD ((GPIO_TypeDef *) GPIOD_BASE)

zatitim search: GPIOD_BASE
#define GPIOD_BASE (AHB1PERIPH_BASE + 0x0C00)

zatim search: AHB1PERIPH_BASE
#define AHB1PERIPH_BASE (PERIPH_BASE + 0x00020000)

zatim search: PERIPH_BASE
#define PERIPH_BASE ((uint32_t)0x40000000)

Odnosno, GPIOD je pokazivac ciji je sadrzaj adresa 0x40000000 + 0x00020000 + 0x0C00 = 0x40020C00 :)
[ bogdan.kecman @ 03.03.2012. 06:11 ] @
da se nadovezem na "lakse" :D

ako stavis pointer misa iznad nekog tipa, vrednosti etc etc, atollic ce ti prikazati sta je to ako je u pitanju neki define ili neki typedef, takodje ako stavis pointer pacova iznad neke funkcije ako je funkcija pisana ok dobices ceo onaj blok komentara iznad funkcije koja je opisuje

dalje, kada kliknes na neki tip, varijablu, konstantu, funkciju ... desnim tasterom pacova, imas opcije "jump to declaration", "jump to implementation" i slicno ... to ce te baciti direkt na .h i .c fajl koji obradjuju to na sta si klikno

i raja, DATASHEET, bez toga se ne mrda nigde, ja neke mikrokontrolere koristim intenzivno 5-6 godina i opet dok programiram na levom monitoru, na desnom imam otvoren datasheet!!! pre 25 godina kada sam ja pocinjao da se igram sa mikrokontrolerima bio je extra problem posto je max sto si mogao da imas kao hobista trideseta kopija tog datasheet-a na papiru gde se pola stvari ne vidi, pa si morao da listas 200 strana da nadjes sta ti treba... tada je bilo normalno da svi koriste "jedan" (citaj 6811 ili 8051 i kasnije 16f84) mikrokontroler posto za nejga imaju datasheet, sada sa ctrl+f nalazis u datasheet-u sta god ti treba za koju sekundy, tu su errata, primeri ... iskoristite to, dakle prvo se ceo datasheet procita "po dijagonali" onda se tokom rada non stop baca pogled na datasheet ... u 99% slucajeva ako nesto nije jasno - odgovor je u datasheet-u :D
[ Odin D. @ 03.03.2012. 10:04 ] @
Biblioteke mogu imati gresaka (a najcesce i imaju), i dokumentacija za biblioteke takodje.
Prema_tome -> Datasheet;
[ mradomir @ 04.03.2012. 16:19 ] @
Citat:
Odin D.: Biblioteke mogu imati gresaka (a najcesce i imaju), i dokumentacija za biblioteke takodje.
Prema_tome -> Datasheet;

Lično sam pročitao stotine datasheet-ova, ali ovo počinje polako da me nervira.
Već dva dana pokušavam da upotrebim funkciju za debug: ITM_SendChar
Ona bi trebala da pošalje karakter na Port 0, koji se vidi u Atollic-u u Debug prozoru - dole desno, SWV Console.
Code:
static __INLINE uint32_t ITM_SendChar (uint32_t ch)
{
  if ((CoreDebug->DEMCR & CoreDebug_DEMCR_TRCENA_Msk)  &&      /* Trace enabled */
      (ITM->TCR & ITM_TCR_ITMENA_Msk)                  &&      /* ITM enabled */
      (ITM->TER & (1UL << 0)        )                    )     /* ITM Port #0 enabled */
  {
    while (ITM->PORT[0].u32 == 0);
    ITM->PORT[0].u8 = (uint8_t) ch;
  }
  return (ch);
}

Registri ITM->TCR i ITM->TER nisu dobro konfigurisani, pa ne prolazi gornji if.
Sve sam prelistao, ali objašnjenje pomenutih registara je prilično siromašno, da ne kažem nikakvo.
Pokušao sam da upisujem u njih, ali ni to ne prolazi.
PS
Mislim da je debug osnovna stvar i da ide u inicijalizaciju, odnosno ovu temu.
[ bogdan.kecman @ 04.03.2012. 17:11 ] @
Serial Wire Viewer je real time tracer i nije podrzan uopste u LITE verziji... Vidis da za oba podrzana interface-a ima samo SWD i JTAG u ponudi, nema SWV. Obrati takodje paznju da ST-Link v2 (koji je na STM32F4DISCOVERY ploci) podrzava SWV (dok ST-Link V1 koji je na starijim plocama ne podrzava SWV).

Dakle, u ovoj fraj verziji - nista od swv-a

Inace sto se samog koda tice, koliko se ja secam (a nemam neko extenzivno iskustvno sa SWV) je da ti ne setujes DEMCR i TRCENA rucno vec kada je jezgro u debug modu ono samo setuje te flegove, iliti flegovi su read only, ti samo proveravas dal je debager zakacen ili ne
[ mradomir @ 04.03.2012. 18:00 ] @
Ja sam razumeo da nije podržan samo printf.
Ako debuger postavlja ove bitove, onda si u pravu da ne može sa Atollic lite.
Ostaju dve opcije, da sa UART-a vučemo na još jedan USB port ili čekamo Coocox (treba da bude za desetak dana).
Inače je zgodnije pratiti izvršavanje softvera preko printf, nego u debug-u gledati sadržaj registara i promenljivih.
[ bogdan.kecman @ 04.03.2012. 18:16 ] @
svasta nije podrzano u lite verziji ...
[ Žerajić @ 24.01.2013. 10:30 ] @
Ima li neko primjer projekta u kome stm32 komunicira preko spi s nekim senzorom ili sl.?
[ mikikg @ 20.08.2013. 23:44 ] @
Malo samo da podignem temu sa dna posto ce biti tu verovatno jos nekih pitanja sa moje strane :)

Za pocetak da li moze neko da preporuci neku pouzdanu ready-for-use biblioteku/source za klasican 2x16 LCD, sa 8 ili 4 data linije?

Sto se mene tice ja bih se vratio da se igram sa onim TI Piccolo, al' ne vredi treba da pomognem kolegi da osposobi neku konkretnu spravu sa STM32F4 Discovery modulom ... Oboje smo pocetnici na toj platformi ... Za sad sam poterao osnovno, inicijalizaciju i tajmere pa ajd da pitam za ovaj 2x16 LCD, mora da ima to negde gotovo da ne pisem sad bas ceo drajver ispocetka.
[ bogdan.kecman @ 20.08.2013. 23:51 ] @
ja koristim istu biblioteku za lcd vec 10 godina i radi super, lagano se
preradi za svaki mcu koji sam do sada probao..
(http://sourceforge.net/p/arhimed-sid/code/36/tree/SID/SID_GEN4.X/ lcd.c
i lcd.h)
[ mikikg @ 26.08.2013. 09:16 ] @
Ovaj code za display jos nisam pokrenuo, cekam ostale neke HW komponente da to sklopim i probam ...

Nego, kako moze da se koristi kod SMT32F4 flash memorija za smestanje i citanje korisnickih podataka?
Dakle slican princip kao sto je bio kod PIC sa korisnickim EEPROM, nesto gledajuci dokumentaciju mislim da je moguce ali ne znam kako konkretno to uraditi u SW. Treba mi recimo 64 x 8 bajtova ili 32 reci da cuvam.
[ bogdan.kecman @ 26.08.2013. 09:23 ] @
jeste moguce ali ne tako jednostavno kao eeprom :D
moras prvo da odvojis taj deo flash-a linker skriptom (da ne bi tamo
slucajno kompajler smestio neki kod), dakle napravis neki data segment u
linker skriptu, tu oznacis pocetak i duzinu segmenta i to je to. onda po
tom delu pises i isti citas kao klasican flash (imas u datasheet-u kako,
nije bas preterano jednostavno, ja sam kopirao kod iz nekog bootloadera
to kako pise i cita flash)

btw mogli bi za F4 da pravimo seriju topic-a sa imenom "STM32F4 - stagod" na primer "STM32F4 - 16x2 lcd drajver", "STM32F4 - citanje i pisanje po flash-u" i slicno kako bi lakse nalazi stvari kada nam sutra zafale, ovako vec imamo u "inicijalizaciji" brdo stvari koje sa inicijalizacijom nemaju veze
[ mikikg @ 26.08.2013. 09:28 ] @
Super, znaci moze ...

Jel imas neki primer za citanje i pisanje jedne lokacije?

Aha, vidim tvoj update ... Pa ok, ajd startovacu temu za ovaj Flash ...
http://www.elitesecurity.org/t...-STMF-citanje-pisanje-po-flash
[ mikikg @ 26.08.2013. 09:51 ] @
A jos jedno pitanje, i pored silnih izlaza za Discovery plocici meni fale izlazi :), jel moze da se skinu onih nekoliko "kockica" (codec, mems, mic) i da se oslobodi jos pinova?
Treba mi po mogucstvu vezanih 32 izlaza (dva cela porta) + jos jedno 10-ak I/O za druge neke periferije. Sve ce da budu klasicni I/O nema seriskih port ili slicno, dakle staticni 32bitni izlaz i ostalo za LCD/KB.

Pitam samo da nema neka "kvaka" oko toga slucajno ili mozda moze nekako elegantnije da se odkace ove periferije bez skidanja IC-ova :)

Malo mi je gusto sa vremenom izvrsavanja nekih interupt rutina pa gledam da mi izlazni port bude ono sto se kaze "native", da upisem dva bajta direktno i sto je brze moguce. Nekakva djunta od masine je u pitanju, barata sa cca 30kW i mora da mi bude sinhronizovana sa mrezom pa mi je taj interapt bas knap (10us) jer treba da "gadjam" poluperiodu u hiljaditi deo ugla/vremena.

[Ovu poruku je menjao mikikg dana 26.08.2013. u 11:07 GMT+1]
[ bogdan.kecman @ 26.08.2013. 11:23 ] @
skidanje ic-ova bi bilo super jednostavno :D ... no svi ti icovi ako se
dobro secam imaju CS tako da ako su CS-ovi van tih portova koji ti
trebaju samo disableujes icove i resen problem
[ mikikg @ 29.08.2013. 04:15 ] @
Jedno pitanje u vezi klokovanja sporih periferija, radim na drajveru za LCD 2x16, odprilike sam sve napravio ali tu imam jedan mali problemcic, mislim nije toliko to ni bitno ali da pitam generalno kako to moze inace da se resi.

Dakle stari problem, MCU je brebrz za periferiju koju sam vezao, tamo se barata sa milisekundama. Medutim moj program ima interapte. Ja sam ustelovao sa praznim petljama vremena potrebna za ovaj LCD ali naravno kada sam ukljucio interapte ta sva vremena su se razdesila tj postala su dosta duza sto je naravno za ocekivati jer se trosi vreme u interaptu a ovo oko LCD je u glavnoj petlji.

Kako da osmislim logiku da ipak nekako zadrzim konstantne pauze (ili potreban clock) za tu sporu periferiju?
Kao sto rekoh nije mi to strasno, radice sporije LCD ali me ipak interesuje kako to moze da se resi jer ce mi zatrebati sigurno za neku X periferiju kada budem vezivao.
Olaksavajuca okolnost mi je sto mi je interapt rutina fiksne vremenske duzine (uvek isti broj ciklusa/komandi se izvrsava) ali sta ako se to menja, ne mogu onda da prostim tamo nekim faktorom korekcije te pauze resim.

Da stavim nekako (kako) LCD rutine u neki drugi sporiji interapt?

Nadam se da razumete sta pitam jer ste se sigurno susretali sa tim problemima :)

@bodan.kecman Iskoristio sam onu tvoju LCD rutinu, prepakovao malo u ovaj STM32 fazon i evo je radi :)
Kada je malo budem uoblicio i skocako, postavicu ovde, zatrebace nekome. Napisao sam je tako da pinovi mogu da se vezu na bilo koje pinove / portove, mogu da budu razbacani po portovima ...



[Ovu poruku je menjao mikikg dana 29.08.2013. u 07:12 GMT+1]
[ goran_68 @ 29.08.2013. 07:27 ] @
Možda da pogledaš Sys Tick primer. Tu su Delay funkcije odrađene preko SysTick prekida. On se definiše na recimo 1ms pa preko njega ide sve ostalo što zavisi od vremena.
[ bogdan.kecman @ 29.08.2013. 09:30 ] @
samo tako sto ces tajmig da resis preko interapta, svi drugi nacini ne
garantuju ... ja npr imam u glavnom systick nesto tipa

if (globalna_volatile_delay_varijabla) globalna_volatile_delay_varijabla--;

i onda gde mi treba delay imam nesto tipa

globalna_volatile_delay_varijabla = 100; while
(globalna_volatile_delay_varijabla);

tako ti je uvek delay isto dugacak
[ mikikg @ 31.08.2013. 11:41 ] @
U vezi tajmera, ne zavrsava mi posao taj tajmer od 1ms, presporo mi to. U LCD rutinama imam potrebe za dosta manjim deley od toga, tako da nema veze, icicu sa prostim praznim petljama.

Nego napravio sam ove sve bitne funkcije za LCD:

void LCD_Init_pins (void);
void LCD_Display_init (void);
void LCD_send_nibble( unsigned char n );
void LCD_send_byte( unsigned char address, unsigned char n );
void LCD_send_string (volatile char *s);
void LCD_goto_home (void);
void LCD_clear_all (void);
void LCD_cursor_control (int cursor_on_off, int blinking_on_off);
void LCD_cursor_left(int no);
void LCD_cursor_right(int no);
void LCD_goto_home_line1 (void);
void LCD_goto_home_line2 (void);

To radi bas fino i brzo. Recimo 5 karaktera (npr neki brojac) moze skoro 1000 puta u sekundi da osvezi, sto mu dodje negde oko 100 puta u sekundi za ceo 2x16 niz. To je extra, moze VU metar da se napravi ;)

Evo u prilogu biblioteka. Bacite pogled i dajte sugestije ako vidite nesto sto moze da se unapredi ili koriguje ...

Koristi se dakle vrlo prosto, npr:

Code:
    LCD_Init_pins();
    LCD_Display_init();
    
    LCD_cursor_control (1, 0);

    LCD_send_string("Init complete!");

    LCD_goto_home_line2();

        int yy;
        char dizi[10];
        
        for (yy=10000; yy<=99999; yy++) {
            
            sprintf(dizi,"%d",yy);
            
            LCD_send_string(dizi);
            
            LCD_cursor_left(5);
        }


[Ovu poruku je menjao mikikg dana 31.08.2013. u 12:51 GMT+1]
[ bogdan.kecman @ 31.08.2013. 11:55 ] @
systick ne pinga na milisekundu, to je svima beskorisno :D, mozes da ga
teras u begahercima bez problema
http://infocenter.arm.com/help...arm.doc.dui0471c/BABCDGII.html
[ mikikg @ 31.08.2013. 12:08 ] @
Ahaaa, nisam znao to.
Pa ok, i onako sam ove delay funkcije napravio "diskretno" pa mogu da se lako preprave (predpostavio sam da ce u nekom trenutku da se pojavi resenje ;).
[ bogdan.kecman @ 31.08.2013. 12:50 ] @
nisam stigao da pogledam lib ali ako se ja secam jedini delay je za
strobe EN-a a to je tipa nekoliko nop-ova tako da ne znam uopste cemu
delay tu :D osim ako si implementirao bez busy flag-a ...

systick se konfigurise sa "na koliko taktova", moze da koristi system
klok a moze da koristi neki drugi zavisi od mcu-a do mcu-a (negde ne
mzoes da biras i uvek je sistemski) tako da ako stavis
configure_systick(1) imaces interapt na 100+MHz tj na koliko ti vec radi
mcu, neces doduse moci da radis nista drugo ali :D tako da namestis mcu
da systick radi koliko cesto ti treba, idealan je za task switching i
slcne fore kada koristis rtos na primer.. ako ne koristis rtos, nema
nista bolje za delay od njega :D
[ mikikg @ 31.08.2013. 12:57 ] @
Pa implementirao sam bez busy flaga, zato samo morao "napamet" da pravim delay a i nisam vezao te linije.
U nekoj sledecoj verziju ovih LCD funkcija cu napraviti sa proverom busy flaga.

Jos uvek je ovo nova platforma za mene pa sad gledam da to proguram da uopste radi pa cu kasnije sa optimizacijom da se bavim.
Posto mi to proradilo sad idem na ADC ;)
[ bogdan.kecman @ 31.08.2013. 13:31 ] @
zgodno je da lib ume "i ovako i onako", ja sam imao neku kolicinu nekih
picova koje sam koristio za i2c slave drajver za lcd u projektima,
zalemim lcd direkt na tu plocicu sa picom i odatle idu 2 zice za i2c i 2
zice za napajanje i to je to, imam lcd i par tastera, bez problema mogu
namestim device i skinem lcd "dok radi" i ostavim device da sljaka bez
lcd-a, sutra ako mi treba zabodem nazad lcd presetujem sta treba,
otkacim opet .. ima negde taj slave lcd drajver na netu stavio sam ga ja
u public domain .. no sad se razmisljam ima za nesto tipa par centi
nekih mcu-a, da vidim da napravim neki koliko toliko univerzalni za
oled, tft i 16x2 da radi istu stvar, no nesto sam sa vremenom .. u
svakom slucaju to ti je super stvar, skines smaranje oko ispisa sa
glavnom mcu-a i na i2c bus vezes i lcd i par tastera i sta ti treba od
senzora, real time clock, neki eeprom..
[ goran_68 @ 31.08.2013. 19:32 ] @
Kako si Bogdane radio čitanje stanja tastera kod tog lcd slave-a? Zanima me jer ja imam sličnu stvar urađenu za 7-segmentni displej ali bez tastera. Kod mene je on vezan na UART MCU ali isto mu dođe i za I2C. Mrzelo me da se zezam za tastere jer mislim da bi onda trebalo da rade u nekom multimaster modu a to mi se ne sviđa baš. U suprotnom bi taj slave sa tasterima i LCD-om trebalo da se proziva stalno da bi imao trenutna stanja tastera na glavnom MCU. Ili ti imaš neko treće rešenje? Nije baš u vezi sa temom ali...
[ bogdan.kecman @ 31.08.2013. 20:35 ] @
pa mnogo jednostavno, "interapt" pin koji moze da se odvede na master plocu pa mozes da biras dal ces da "stalno prozivas" ili ces da citas taj interapt pin .. ja sam iskreno te tastere iskoristio samo u jednom projektu, u svim ostalima sam koristio samo lcd .. to je klasican nacin, tako radi i i2c extender cip

btw, evo ga post moj o tome: http://www.electro-tech-online...ontroller-using-pic16f690.html (znaci 2008 sam to pravio), tu su i neki sorsovi (ja nemam druge, otisli u void pre koji mesec), osnovno sto sam pravio taj post je sto sam napravio i2c slave sa bitbangom (softwerski) da moze da se koristi i na mcu-u koji nema hardwerski i2c modul, cak podrzava i clock stretchin (ako se dobro secam to sam pisao u mikroC-u ali nije problem prebaciti u bilo koji drugi c)

[ goran_68 @ 31.08.2013. 21:39 ] @
Moja prva varijanta takvog slave-a je takođe bio softverski I2C za Atmelov neki AVR. Davno je rađen i greškom je obrisan. Posle sam to uradio za PIC i UART. Mislim da je takva spravica jako korisna jer može da posluži i za debug. Možda dodam i tasturu onako kako si opisao.
[ mikikg @ 01.09.2013. 13:57 ] @
Ma da svi smo pravili te I2C LCD/KB sa PIC-ovima pre XX godina, jos sa 84-kom, nego ko da to sad buta ovde sa SMT32 kad ima 50-90 slobodnih I/O :)

Inace poterao sam ADC, radi bas fino. Dakle bez ulaznog filtera/bufera, bukvalno jedan redni otpornik i na promenljivi izvor (1-3V), meri ovaj STM32F4 napon samo tako!
Malo sam se "manijacio" pa sam ujednacavao 4096 puta izmerenu vrednost (imam u glavnoj petlji ciklusa na pretek, a DC napon merim), hehe kako drzi to fino i stabilno i najbitnije precizno :)
Poredim sa SANWA unimerom, ma tu je tacno izmereni napon!
Interna referenca je tacno 3.000V, i koliko sam skontao ulazi u A/D su Hi-Z sto je jako fina stvar, nije Low-Z koji bi se ocekivao za tako brze A/D.

Nego naleteo sam na jedan ozbiljan problem sa KEIL MDK IDE, puca HW FPU podrska!!! :(
Ne znam sto, svasta sam probao, na jednoj liniji gde baratam sa FP brojevima, najprostiji neki iskaz, ma nece, pljas i samo ode u exception rutinu ...
Lici mi na SW bug. Kada u podesavanju za projekat iskljucim HW FPU to prolazi.
Jel imao neko slicne probleme?

Mislim za sad mi nije problem, ali imacu kasnije verovatno i neku trigonometriju pa se brinem da mi SW FP matematika ne bude prespora. Ne znam sta da radim oko toga.
[ bogdan.kecman @ 01.09.2013. 16:26 ] @
nisam imao sa keil-om problem sa hw fpu, doduse pobajata verzija ...
koju si verziju probao?
[ mikikg @ 02.09.2013. 01:45 ] @
Probao sam sa nekom od zadnjih, pre par meseci skinuta, V4.71.2.0.

Evo ovde slican problem koji datira vise od godinu dana unazad, ne znam sta je tu resenje ...
https://my.st.com/public/STe2e...BE638E0F&currentviews=1962
[ bogdan.kecman @ 02.09.2013. 02:30 ] @
resenje ti je ovo iz prvog posta, da upalis FPU u startup_stm32f4xx.s izgleda da startup_stm32f4xx.s koji dolazi uz discovery nema upaljen fpu
[ mikikg @ 02.09.2013. 02:55 ] @
Da, u pravu si, treba ovo da se doda u startup_stm32f4xx.s ispod __main da bi proradio HW FPU.
Code:

                 ;FPU settings
                 LDR     R0, =0xE000ED88           ; Enable CP10,CP11
                 LDR     R1,[R0]
                 ORR     R1,R1,#(0xF << 20)
                 STR     R1,[R0]


[ bogdan.kecman @ 02.09.2013. 03:08 ] @
takodje obrati paznju da likovi pisu da u keilovom original startapu to
vec postoji (Tj on ga stavi ili ne zavisno od toga sta ti odaberes u
projektu, da li oces ili ne hw fpu) dok ovi startapi koji dolaze uz
discovery nemaju to .. tako sam ja bar skonto sta tamo pise :D nisam
stigao da probam
[ mikikg @ 02.09.2013. 03:14 ] @
Tako nesto, nije ni bitno, u fajlu nisam imao to a bez toga nece da radi FP uopste.
Sad je tek proradio floating point co-procesor.
[ Odin D. @ 02.09.2013. 04:54 ] @
Cuo sam da Em::Blocks radi sa STM discovery plocama, tj. sa ST-Linkom (izmedju ostalog) out of the box, a on bi trebalo da ima neke "Special libraries for the cortex family (with and without fpu/softfp etc)", kako tamo kazu.
Nisam licno probao, a ako neko ima volje nek proba, pa nek javi :)
[ bogdan.kecman @ 02.09.2013. 04:55 ] @
baci neki link :D
[ Odin D. @ 02.09.2013. 06:05 ] @
http://www.emblocks.org/web/
[ mikikg @ 07.09.2013. 14:55 ] @
Jos malo sam se igrao sa ADC kod ovog kontrolera ...

Dodavanjem LM385Z2.5 (2.5V referenca) paralelno sa C23 elektrolitom / tantalom na plocici sam dobio fantasticno merenje napona!
Dakle to meri u trecu decimalu tako tacno, npr 2.000V tj u 1mV ;)

Samo mora da se ujednacava merenje >256x, konkretno meni je 2048x, jeste to uzasno sporo ali za tu preciznost neminovno.
Ili tako sa ujednacavanjem ili staviti "tvrd" buffer / OP sa LPF filterom ispred ADC ulaza kako bi se smanjilo potreban broj ujednacavanja (problem sa shumom).

Bez ove reference to prilicno sheta jer se menja napon od 3.3V na plocici, zavisi od opterecenje / potrosnje pa to dosta utice na merenje.

Takodje je vrlo bitno gde se "masa" sa plocice izvuce za ulazni signal, mora direktno sa onog header konektora gde pise GND, ostale mase imaju po 20mV razlike!
[ mijatovic_86 @ 01.11.2013. 08:47 ] @
Pozdrav narode, fina tema o STM32 cortexima, pa reko da priupitam, da li je neko spustao FreeRtos na ove STMove ploce, i implementirao onaj njihov free UDP stack i webserver ?

http://www.freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_UDP/Download_FreeRTOS_Plus_UDP.shtml

Meni je u planu tako nesto da odradim, stim sto moram da sacekam da mi stigne ethernet modul, e sad
treba to da testiram i na STM32F4DISCOVERY(Cortex M4) i na STM32VLDiscovery (Cortex M3) plocicama.
Koliko sam video M4 ploca ima podrsku za MII i vec predvidjene portove na koje moze da se kaci ETH PHY, a ovaj slabiji nisam nasao da to moze, tacnije kontroler na ploci bi trebalo da ima i on podrsku na MII, ali nema izvode ?
Pitam zato sto bih uzeo jedan modul koji bi premestao i tamo i vamo, a recimo ako uzmem MII modul npr DP83848 EHT modul, ne znam da li bih mogao da ga zakacim na M3, a sa druge strane ako uzmem ENC28J60 EHT modul onda se ogranicavam na 10Mb/s.

Pretpostavljam da na kraju mora da se ide sa ENC28J60 koji radi preko SPI interfejsa, pa moze da radi na obe ploce, ili imate neku drugu ideju ?

[ goran_68 @ 01.11.2013. 11:49 ] @
Ovaj na STM32VLDiscovery nema MII. Dakle, ne možeš da radiš sa DP83848 na obe Discovery ploče.