STM32F407 Cortex M4 şamataları

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

z

Alıntı yapılan: memo333 - 03 Kasım 2011, 10:12:09
.....Ki başka bir konuda şu: bahsettiğiniz pinler ilk açılışta "jtag/swd" pinleri. bunları remap yapmadan i/o olarak kullanamazsınız.

Bununla ilgili bilgiyi nerede okudunuz.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

memo333

Alıntı yapılan: bunalmis - 03 Kasım 2011, 12:02:37

Bununla ilgili bilgiyi nerede okudunuz.

f1lere dayanan tecrübelerimden. JTAG uyumlu pinleri direk olarak I/O kullanamazsınız. JTAG Disable yapmanız gerekir.
Gömülü Linux Notları --> http://linuxedu.xyz/

z

eemkutayın sorusuna cevap olacak çok genel amaçlı programa örneği zaten https://www.picproje.org/index.php/topic,36040.msg258436.html#msg258436

linkinde vermişim.

Eğer çevrebirimleri için kullanmak istersek aşağıdaki programı kullanabilirsiniz. Fakat bu kodu önermiyorum.

Eğer ağırlıklı bitbanding işlemleri yapacağınız uygulama varsa her bir biti aynen header dosyalarda tanımlar gibi tek tek aşağıdaki bağıntı gereği tanımlayıp değer atamalasınız. Ancak bu durumda bitbanding işlemlerde hız avantajı yakalarsınız.

Bu uygulamalar özel olarak karşınıza çıkar. (Kriptoloji bunlardan birisi)

Ykarılarda bir yerlerde uzun uzun tartışmaya neden olan 3 clk da mı yoksa 1 clk da mı bitbanding olacak konusuna kısaca dönersek;

Birbirine komşuluk mesafesi  -1024.... +16384 bit olan tüm bitleri peş peşe olmak kaydıyla 1 cycle da 1 yada 0 olarak değiştirebilirsiniz.
Bunu da başka bitbanding donanımını kullanmadan daha başka hiç bir kodlama ile yapamazsınız.

Ancak C derleyicinizin sizin bu amacınızı iyi anlaması gerekir. (Keil Speed Level3 optimizasyonu bunun üstesinden geliyor)
Eğer anlayamıyorsa bu durumda asm yazıma yönelinebilir.

eemkutayın istediği Bitbanding doğasına aykırı kod örneği aşağıda.

unsigned short* Bit_Adr(int Wadr,char BitNum)
{
      return((unsigned short*)(0x42000000 + ((Wadr - 0x40000000)<<5) + (BitNum<<2)));

int main()
{
unsigned short* P;       A=0;
     P=Bit_Adr((int)&GPIOD->ODR,2); // GPIOD nin 2 nolu bitinin adresini öğren gel
    *P=1;
   


eemkutay ve Gerbaydan yazmalarını rica ettiğim programları başlığa koyarlarsa, bitbanding için yapacağım özel kodlama zaten yukarıdaki tartışmaya da son noktayı vuracak nitelikte olacaktır.

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

z

Alıntı yapılan: memo333 - 03 Kasım 2011, 13:27:06
f1lere dayanan tecrübelerimden. JTAG uyumlu pinleri direk olarak I/O kullanamazsınız. JTAG Disable yapmanız gerekir.

Okumak istiyorum fakat bahsettiğiniz uyarıyı göremedim.

SWD (A14 ve A13) pinlerini moder den I/O yapmama engel olan hiç bir uyarı göremedim çünkü.

ModerA registerinin tek özelliği reset ardından 0x00000000 değil 0xA8000000 değere sahip olması.

Bunun da anlamı Reset ardından hiç bir tanımlama yapmasanız bile A15 A14 A13 alternatif fonksiyon demektir.

Yazdığım Katil kodların yaptığı şey ise derhal GPIO da 10 bit hariç diğerlerini inp yapmak.


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

memo333

Alıntı yapılan: bunalmis - 03 Kasım 2011, 13:38:56

Okumak istiyorum fakat bahsettiğiniz uyarıyı göremedim.

SWD (A14 ve A13) pinlerini moder den I/O yapmama engel olan hiç bir uyarı göremedim çünkü.

ModerA registerinin tek özelliği reset ardından 0x00000000 değil 0xA8000000 değere sahip olması.

Bunun da anlamı Reset ardından hiç bir tanımlama yapmasanız bile A15 A14 A13 alternatif fonksiyon demektir.

Yazdığım Katil kodların yaptığı şey ise derhal GPIO da 10 bit hariç diğerlerini inp yapmak.

Haklısınız. F4lerde durum biraz değişmiş

F1lerde JTAG pinlerini kullanmak için;

    /* Disable the Serial Wire Jtag Debug Port SWJ-DP */
    GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);


demek gerekirdi.

F4lerin örneklerinde ve fonksiyonlarında bu durum değişmiş, yukarıdaki fonksiyon olmadan direk I/O olarak atanabiliyor.

O zaman sizin başınıza şu geldi. Bir şekilde sizin katil kod işi bozdu. Sizde BOOT0'ı set edip ST-Link reseti verince Bootloader devreye girdi ve pinler normal konumlarına döndü. Sizde kodu yükleyebildiniz.
Gömülü Linux Notları --> http://linuxedu.xyz/

memo333

#380
Çok dağıttım konuyu toplayayım.

F1lerde

* Her bir pin Default olarak I/O idi. Siz Alternatif Fonksiyonlardan (AF) birini seçerek donanımları ilgili pinler üzerinde çalıştırıyordunuz.(Örneğin SPI) (Bu durum F4lerde de değişmedi.)

* Bazı donanımları default olarak atandıkları pinlerden başka pin takımına taşınabiliyordu. Buna REMAP Denirdi. (örneğin usart pinlerini porta 11-12den portb 13-14e taşınması).

Ayrıca F1 datasheetlerine bakarsanız, JTAG pinlerinin Alternatif Fonksiyon olarak değil, Default olarak tanımlandığını görürsünüz. JTAG pinlerini I/O olarak kullanabilmek için REMAP edilmesi gerekiyordu.

F4lerde

*Remap olayı bayağı bir azaltılmış. Hikmetini bilmiyorum.

*JTAG pinleri sadece alternatif fonksiyon olarak atanmış. Yani AF değerlerini silerseniz I/O olarak kullanabilirsiniz. REMAP'e gerek yok.
Gömülü Linux Notları --> http://linuxedu.xyz/

z

Alıntı yapılan: memo333 - 03 Kasım 2011, 14:11:11
....*JTAG pinleri sadece alternatif fonksiyon olarak atanmış. Yani AF değerlerini silerseniz I/O olarak kullanabilirsiniz. REMAP'e gerek yok.

AF yi silmeniz gerek yok. Zaten AF registerlerin reset değerleri default olarak 0.
Bu durumda MODER den o pinleri AF özelliğinden çıkartmak sistemi çökertmeye yetiyor.

Neyse, bu durum başınıza gelirse sorun yok. Nasıl kurtulabileceğinizi yukarıda açıkladım.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

memo333

Belkide JTAG Pinlerini kilitlemek ileride oluşacak hataları engelleyebilir.

Birde Bülent Hocam GPIO->BSRR kayıtçısı ile GPIO üzerinde atomik işlem yapılabiliyor. Bitbanding sizce bu konuda gereksiz kalmıyor mu?
Gömülü Linux Notları --> http://linuxedu.xyz/

z

#383
Adamlar bitbanding özelliğini program yazarı arada sırada bir biti set reset etsin diye koymamışlar.

Bizler 8 16 yada 22 bit verilerle çalışıyoruz.

Peki uygulamanız Ramdaki değişkenleri 1 bitlik veri olarak ele almayı gerektiriyorsa ne yapacaksınız.

Ramda her bir bit için 8 bitlik char tanımlayıp değişkenin her bir bitini gerektikçe test eder (gerekirse kaydırır) kullanırım derseniz çok zaman kaybedersiniz.

İşte bitbanding ramın her bir bitini sizin kullanımınıza açıyor.

Öte yandan BSRR registeri sadece GPIOx_ODR ile erişilen bitlere bit bazında erişim sağlıyor. Bitbanding modunda tüm peripheral registerlere bit bazında erişim sağlıyorsunuz.

Bitbanding de n. bit ile m. biti derhal AND OR XOR + / - * gibi işlmelere tabii tutabilirsiniz.

Aynı işlemi birde char değişkende yapmayı denesene. Ne kadar uzun kodlar oluşur ve anlamsız zaman kaybı olur.

Bitbanding = 1 bitlik memory mimarisi üzerinde bitlerin set reset işlemleri.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

memo333

Diger Registerlar konusunda kesinlikle haklısınız.

Sadece pin aç/kapa üzerinde BSRR de var ona da değiniliebilir.
Gömülü Linux Notları --> http://linuxedu.xyz/

mcan

Peki bit banding kullanmadan bu yazida gecen olayi nasil asabiliriz? Alternatifi nedir?

Alıntı YapTake the USART for example. The CTS flag goes high and an interrupt handler as part of its job, wants to reset the flag. Don't ask me why, it just does. Meantime, you just received a byte and the RXNE flag is set to indicate that there is data waiting. But the CTS handler is in the middle of a read-modify-write cycle. It has read the status register and is in the process of clearing the CTS flag. When it writes the result back, the RXNE flag will be cleared and the arrival of the character could go un-noticed.

OK, so I just invented all that. the point is, the peripheral registers may need care in setting and clearing bits and the safest way to do that in both cases is through bit-banding. Why? because the changes are atomic. That is, they happen to single bits in on cycle and cannot be interrupted. Thus, there will never be an occasion where you read a bit which can be modified by some other code before you get to write it back out.

Read more: http://www.micromouseonline.com/2010/07/14/bit-banding-in-the-stm32/#ixzz1ceoPzAls

Sanirim bu bitbanding hizli yazmakdan ziyade daha baska bir amaclara hizmet ediyor ornekdeki gibi... peki bint band region olmayan kontrolor yokmu,en azindan cortex mimarisi bunu zorunlumu kiliyor?

Klein

Konuyu dağıtmadan minik bir istekte bulunacağım.
İşlmcinin komut setini bulamıyorum. Refsheet , datasheeet vs.. hepsini karıştırdım ama bulamadım. Linki var mı?


z

#388
@mcan

Read modify write yapmaz read write yaparsın. Yada read modify ORR write yaparsın. 
rc_w0 a dikkat et. 1 yazarsan bir şeycik olmaz.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

mcan

#389
Alıntı yapılan: bunalmis - 03 Kasım 2011, 18:36:31
@mcan

Read modify write yapmaz read write yaparsın. Yada read modify ORR write yaparsın. 
rc_w0 a dikkat et. 1 yazarsan bir şeycik olmaz.
Ama bitbanding disindaki metodlarda mask kullanmiyormuyuz? Mecbur oku degistir yaz yolunu secmezmiyiz?Ben zaten anlamadim bu atomic yani bolunemez erisimi, anladigim su bitbanding yaparken islemin kendisinin masking `e (oku, degistir, yaz) gore hizli olmasinin yaninda ,bit banding  bitmeden interrupta bile girmiyor.Anladigim, adam diyorki rxe bitini 0 yazarak sifirlamak istiyoruz, bunun icin kopmle registeri okuyoruz ,sonra or and gerekli olan operator ile degistiryoruz ,biz bu degisim isini yaparken cts biti 1 oluyor, sonra bizim degisen yazmaci geri usartsr ye yaziyoruz biz okumaya basladigimizda cts 0 oldugundan geri yazarken de ona dokumadigimizdan yazim tamamlaninca arada 1 olan cts islem sonunda sifir oluyor.Bit banding bunun onune geciyor olarak anladim

rc_w0 a dikkat et. 1 yazarsan bir şeycik olmaz. Bu sekilde aciklama getirilmis bitlere 1 yazip sonra yeniden okursak 1 mi okuruz yoksa eskiden ne varsa onu mu okuruz?Kartta deneyecem usenmem gecince :)