STM32F407 Cortex M4 şamataları

Başlatan bunalmis, 16 Ekim 2011, 17:14:50

mcan

#120
Alıntı yapılan: bunalmis - 22 Ekim 2011, 16:45:17
mcan sanki icimden bir his bu register olaylarini sevemedigini soyluyor. Dogrumu? Hazir kutuphaneler kullanip isin bu kismindan kacmak gibi bir niyetin mi var?
:) Aksine bu register olayını ve dosyaları anlamaya çalışıyorum yanlız bazı dosyaların içinden çıkamadım,en basit karşılaştığım olay
DENEME_M3.axf: Error: L6200E: Symbol SystemInit multiply defined (by system_stm32f10x.o and clean-main.o).

kendi system_init() fonksiyonumu yazdığımda bu hatayı alıyorum, bir başka açıdan eğer kendi system_init() fonksiyonumu kullanmak için  "#include stm32f10x.h"  satırını kaldırırsam bu sefer
clean-main.c(13): error:  #20: identifier "GPIOD" is undefined
hatasını alıyorum.Acaba orjinal dosyada sytem_init() fonksiyonunun adını mı değiştirsem?Forumdan
Alıntı YapAra çalışma olarak

void SystemInit() yerine void systemInit() yada void SYstemInit() init yazın ardından F7 tuşuna basın.
Build Output penceresinde oluşan hata mesajına dikkat edin.

Ardından hatayı yokedin ve

int SystemInit()
{
}

olarak değiştirin ve tekrar F7 ile programınızı derlemeye çalışın.
Bunu okudum ancak o hatayı yok edemedim,kendi system_init() fonksiyonumun adını büyük küçük harf farkı yaratarak değiştirirsem bu sefer startup dosyası benim system_init() fonksiyonumu değil de kendi hazır fonksiyonunu kullanacak sanırım.Ben aksine her bir biti öğrenmekden yanayım pic programlarken genelde okuyup kendim değer veririm ,ancak bu arm yazmaçları bu psoc yazmaçları gibi karışık açıkcası yazmaç kısmı değil beni zorlayan programlama ile ilgili ekstra tanımlamalar ; import export , linker ,make file,weak ve bunun gibi daha önceden pek aşina olmadığım tanımlamalar .Özellikle bu startup dosyasını hiç sevmedim hangi dille yazılmış anlamadım __initial_sp yazmışlar bu nedemek mesela? ___ işaretini başa koyunca ne oluyor.Asm mi değilmi nerde belirtiyor #asm gibi bir başlangıcı yok.

z

#121
Bir kere şundan emin olalım.

Eğer Keil dersleri konusunda anlattığım şekilde Deneme adında bir klasör ve bunun içinde Deneme adında proje oluşturduysanız ve içine verdiğim örnek kodları yazdıysanız
bahsettiğiniz hataları almazsınız.

Yok eğer hazır gelen bir projeyi editleyerek bir şeyler yapıyorsanız;

Proje dosyasında genellikle main fonksiyonu ve SystemInit fonksiyonu birbirinden ayrı C dosyalarında tutulur.

Eğer böyleyse ve siz tutup main fonksiyonunun olduğu dosyaya SystemInit fonksiyonu yazarsanız projede toplam iki tane SystemInit fonksiyonu olur ve haliyle derleme aşamasında hata alırsınız.

(Deneme projesinde en tepeye #include "STM32F4xx.h" satırı ekleyerek derleyicinin program içinde yazdığımız registerleri tanımasını sağladık.)

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

mcan

#122
Ben kendi projeme system_stm32f10x.c dosyasını da eklemişim o sebeple hatayı alıyormuşum şimdi o dosyayı projeden çıkardım h dosyasını geri ekledim hata gitti,tabiki bazı yazmaçlar aynı değil o sebeple oraları değiştirmem gerekiyor şimdilik sildim yazmaçlı kısımların bir kısmını.


z

#123
Alıntı Yap......Özellikle bu startup dosyasını hiç sevmedim hangi dille yazılmış anlamadım __initial_sp yazmışlar bu nedemek mesela? ___ işaretini başa koyunca ne oluyor.Asm mi değilmi nerde belirtiyor #asm gibi bir başlangıcı yok.

Startup dosyası asm ile yazılmış ve Startup'a da girersek bu kurs bitmez. Bir dosyanın ext'i s ise asm, c ise C, h ise header anlamına geliyor.

__initial_sp, reset ardından donanımsal olarak okunup SP registerine atılan SP adresi. Bunun sayısal değerini Keil oluşturuyor.
Başında __ olan değişkenlerin değerleri derleyici tarafından tespit ediliyor.

# asm yazmaya gerek yok çünkü dosyanın uzantısı .s bu asm olduğu anlamına geliyor ve dosyanın içi asm ve derleyiciye özgü pesudo kodlardan oluşuyor.

weak ilginç bir tanımlayıcı. Eğer asm fonksiyonda bir asm label varsa buna rağmen  C dosyanızda bu labeli fonksiyon olarak tanımlarsanız asm deki tanım geçersiz kalıyor ve C deki tanım kullanılmaya başlıyor.

Örneğin C de interrupt fonksiyonlarını yazmazsanız asm dosyadaki interrupt fonksiyonlar kullanılıyor. C de interrupt fonksiyonu yazdığınızda artık asm de (startupda) yazılan fonksiyon geçersiz oluyor.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

muhittin_kaplan

Alıntı yapılan: ErsinErce - 22 Ekim 2011, 17:21:30
Pin Çıkışlarını Modüllere göre düzenleyerek yükledim, ayrıca yanlarına kullanılabilecek fonksiyon tiplerini de belirttim
eğer bir modülle çalışmak istersek bulunması kolay olsun diye,
bir de siz gözatın yanlış yazdığım bir nokta var mı bunun kontrolünü de yapmış oluruz

http://www.4shared.com/file/8MeEKyr8/STM32F4Discovery_Pinouts.html
(Not: Eğer sayfayı açamıyorsanız DNS'inizi değiştirin)
ne zamandır DNS değiştirmedim. Kullanılır Bir DNS verirmisiniz

sayment

Alıntı yapılan: muhittin_kaplan - 22 Ekim 2011, 18:31:36
ne zamandır DNS değiştirmedim. Kullanılır Bir DNS verirmisiniz
http://www.opendns.com/
208.67.222.222
208.67.220.220

ErsinErce


gambit1244

 @bunalmıs hocam iyi akşamlar öncelikle
void Delay()
{
unsigned int i;
 
     for(i=0;i<0x800000;i++); 
}


fonksiyonu kaç saniye gecikme yapıyor
0x800000 =8.388.608
kez tekrar ediyor
bir tekrarı kaç clockta yapmış oluyoruz bunlara biraz değinsek güzel olmazmı
kaç clockta bir saniye geçiyor? 168milyon clockta bir saniye geçiyor sanırım bu hızda kullandığımız için
mesela portun çıkış frekansı delay fonksiyonunun süresini etkilermi?
cok teşekkür ederim
[email]tufan_ozbek@hotmail.com[/email] Yesterday is history. Tomorrow is a mystery. Today is a gift aslında bütün mesele bu.

z

#128
Gecikme rutinlerini örnekteki gibi yazarsak rutinin ne kadar geçikme yapacağı derleyicinin optimizasyon ayarıyla değişken hale gelir. (Bu ayarlara ileride değineceğiz)

Herhangi bir optimizasyon seviyesi için bahsettiğiniz sorunun cevabı derlenen kodların asm çıktısında gizli.

Yaklaşık olarak ASM komutların hepsini 1 cycle alır ve her BX, B komutu için 3 ilave ederseniz bunu da döngü sayısı ve (168 E6)^1 ile çarparsanız yaklaşık sonucu bulursunuz. Fakat bu konulara girmek bu aşamada son derece lüzumsuz olur.

Portun I/O hızı buradaki Delay süresini etkilemez.

Kodu yazarken bir kaç deneme ardından 0x800000 değerinin flash gösterisinde güzel göründüğüe karar verdim öyle bıraktım.

Yukarıdaki koda benzer bir kaç örnek daha yaptıktan sonra timer ile tekrardan yanıp sonen led ornegı yapacağız. O zaman timera yüklenen değerden yola çıkınca çok kesin olarak geçikme süresini hesaplayabiliriz ve asm kodlara bakmamıza gerek kalmaz.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

muhittin_kaplan

Gecikme İçin SystemTick Kullanılıyor sanırım.
Hocam Ayrıca ilk Aşamada "Şunlar Şunlar Yapılmalı" (Kodlar Yazılmaya Başlarket Port Ayarlamaları gibi Osilator vs ) diye bir liste oluşturabilirmiyiz ?

ErsinErce

#130
void Delay(){
     unsigned int i;
     for(i=0;i<0x800000;i++); 
}


bu arada int olan tanım long olarak değişmesi gerekiyor, gözden kaçmış ufak bir ayrıntı

https://www.picproje.org/index.php/topic,35794.msg256473.html#msg256473

z

#131
Alıntı Yapbu arada int olan tanım long olarak değişmesi gerekiyor, gözden kaçmış ufak bir ayrıntı

Arm işlemcilerle çalışırken int 32 bit, long int 64 bit demek.

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

gambit1244

Alıntı yapılan: bunalmis - 22 Ekim 2011, 19:36:14

Arm işlemcilerle çalışırken int 32 bit, long 64 bit demek.

bu arm nin özelliğimidir yoksa 32 bit olmasının özelliğimidir
yoksa keil inmi?

bi onceki konuyu anladım hocam teşekkür ederim
timer ile çalışmaya başladıktan sonra kendi delay fonksiyonlarımızı yazacagız sanırım doğrumu anlamışım hocam
[email]tufan_ozbek@hotmail.com[/email] Yesterday is history. Tomorrow is a mystery. Today is a gift aslında bütün mesele bu.

z

int değerin 32 bit oluşunun sebebinin 32 bit işlemciyle çalışıyor olmamızdan kaynaklandığını düşünüyorum.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

muhittin_kaplan

işlemcinin kapasitesine göre mi bu Tamsayı (int) belirleniyor. Yani işlemci 16bit olsaydı int 16bit mi olurdu
Ozaman 8 bit de bir karşıtlık var.