STM32F407 Cortex M4 şamataları

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

z

#255
Alıntı yapılan: dombilik - 24 Ekim 2011, 09:22:33
Hocam ben kendi payıma dersleri takip ediyorum ve etmekte de zorlanıyorum.Başlangıç da C dersleri ile başlayıp temelden girileceğinden bahsedilmişti.
Ama ARM serisine yabancı olmayan ve C bilgisi iyi olan arkadaşlar bodoslama daldılar konuya..Bunu yadırgamıyorum gayet normal.Amacım eleştirmek de değil zaten.
Lakin aşağıdaki topic bomboş kaldı.
https://www.picproje.org/index.php/topic,35720.0.html
Sabırla sıranın benim gibilere gelmesini bekliyorum. :-[

Size hak veriyorum.  https://www.picproje.org/index.php?topic=35908.msg256759;topicseen#msg256759 den hızlı şekilde C ye giriş yapıp anlatımları başlatalım.

Asıl C başlığımızdaki dersler daha sonra sistematik ilerler.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

JKramer

Alıntı yapılan: bunalmis - 24 Ekim 2011, 10:05:26
O ozellik zaten var. Hic kopyalamaya calismadan paste demeyi denedinmi?
Haklısınız, panoya otomatik olarak kopyalıyormuş :).

kck87

#257
Alıntı yapılan: bunalmis - 24 Ekim 2011, 01:31:33
Şu ana kadar neler yaptık;

CPU clock kaynağını kullanmayı,
GPIO portunu I/O olarak kullanmayı,
GPIO yu alternatif fonksiyon amaçlı kullanmayı,
Timer kullanmayı,
Interrupt kullanmayı

Çok basit anlamda da olsa gördük.

Kartlarınız geldiğinde bunları bizzat deneme şansınız olacak.

Şu anda deneme yapmamız gereken DMA, UART, I2C konuları var. Aslında çok konu var.

Fakat C dersleri geride kaldı. Ayrıca kursa katılanlar konuları takip ediyorlarmı etmiyorlarmı, anlıyorlarmı anlamıyorlarmı hiç fikrim yok.

Öte yandan ARM programlamayı, registerlere kuru sayılar yükleyerek yazmak gördüğünüz gibi mümkün hatta çok kısa kodlarla işler yütülebiliyor fakat okunurluğu yok.

Bundan sonrası için nasıl yola devam edelim?

Biraz dinlenelim mi?

evet hocam biraz frene basıp C dersleri ile senkron gitmek daha iyi olacaktır diye düşünüyorum.



Alıntı yapılan: bunalmis - 22 Ekim 2011, 22:16:25
User butonuna basıldığında ledleri yakan basılmadığında ledleri söndüren program

CPU 8 Mhz Xtal OSC ile 168Mhz de koşuyor. 
AHB frekansı 168 Mhz
APB1 frekansı 42 Mhz
APB2 frekansı 84 Mhz

// Programın başı

#include "STM32F4xx.h"

void SystemInit()
{
unsigned int i;

    for (i=0;i<0x00100000;i++);          // OSC oturtma ve kurtarma rutini
    RCC->CFGR |= 0x00009400;         // AHB ve APB hizlarini max degerlere set edelim
    RCC->CR |= 0x00010000;            // HSE Xtal osc calismaya baslasin       
    while (!(RCC->CR & 0x00020000));// Xtal osc stabil hale gelsin
    RCC->PLLCFGR = 0x07405408;      // PLL katsayilarini M=8, N=336, P=2 ve Q=7 yapalim
//  RCC->PLLCFGR = 0x07402A04;     // PLL katsayilarini M=4, N=168, P=2 ve Q=7 yapalim
    RCC->CR |= 0x01000000;            // PLL calismaya baslasin  (Rehber Sayfa 95)
    while(!(RCC->CR & 0x02000000)); // Pll hazir oluncaya kadar bekle
//  FLASH->ACR = 0x00000705;        // Flash ROM icin 6 Wait state secelim ve ART yi aktif edelim (Rehber Sayfa 55)
    FLASH->ACR = 0x00000605;        // Flash ROM icin 6 Wait state secelim ve ART yi aktif edelim (Rehber Sayfa 55)
    RCC->CFGR |= 0x00000002;        // Sistem Clk u PLL uzerinden besleyelim
    while ((RCC->CFGR & 0x0000000F) != 0x0000000A); // Besleninceye kadar bekle
    RCC->AHB1ENR |= 0x0000000F;    // GPIO A,B,C,D clock'u aktif edelim
    GPIOD->MODER = 0x55000000;     // GPIOD nin 15, 14, 13, 12 pinleri cikis tanimlandi (LEDler icin)
    GPIOD->OSPEEDR= 0xFFFFFFFF;   // GPIOD nin tum cikislari en yuksek hizda kullanacagiz
}

int main()
{
    while(1)
      {
         if (GPIOA->IDR & 0x000000001) GPIOD->ODR= 0x0000F000;     // Ledler yansin
         else GPIOD->ODR= 0x00000000;     // Ledler sonsun
      }
}
// Programın sonu.

hocam burda 2tane  FLASH->ACR komutu var1tanesini kullanıyoruz, açıklama olarak ikisine de aynı şeyleri yazmışsınız ama verilen değerler farklı, bunun nedeni  RCC->PLLCFGR katsayılarına verdiğimiz değerlermidir. Yani  RCC->PLLCFGR e verdiğimiz değerlere göre FLASH->ACR değerlerimi değişiyor? bu soruyu gözüme takıldığı için soruyorum daha incelemede bulunmadım. mantıksız 1soru olabilir şimdiden özür dilerim :)
 nickim'in terör örgütünün kck yapılanması ile alakası yoktur. bazı arkadaşlarımdan butarzda duyumlar aldım.

z

Alıntı yapılan: kck87 - 24 Ekim 2011, 10:13:54

AHB1ENR : reginin 3.biti d portunun clok unu aktif ediyor. Aynen dediğiniz gibi

GPIOD->MODER : d portu 16 bacaklı, 32biti 2şerli gruplandırarak 1 port için 4 farklı durum belirlemesi yapılabiliyor, rehberde
yazana göre 01 verince çıkış olarak ayarlıyoruz, bu sebepten 0x55000000 sayısını giriyoruz. Evet

GPIOD->OSPEEDR :  aynı mantıkla 1 çıkış için 4 farklı çalışma hızı belirleyebiliyoruz 11 max hiz çalıştırmak için.
hesapladığımızda 0xFFFFFFFF değerini buluyoruz.

@bunalmıs hocam GPIOD->OSPEEDR= 0xFFFFFFFF yerine GPIOD->OSPEEDR= 0xFF000000 değerini verebilirmiyiz? nasıl olsa diğer portları kullanmıyoruz.?   Evet, kullanmadığımız için diğerlerinin hızını 00 yaparak yavaşlatabilirsiniz.

ayrıca ledleri yakmak için  GPIOD->ODR= 0x0000F000 yerine GPIOD->BSRR = 0X0000F000

ve ledleri söndürmek için  GPIOD->ODR= 0x00000000 yerine GPIOD->BSRR = 0XF0000000 komut ve değerleri kullanılabilirmi?
Aynen dediğiniz gibi.

Keilde derlerken hata verdi. kütüphanede 1 sıkıntı olabilirmi? Bunun sebebi STM32F4xx.h header dosyasını hazırlayan vatandaş
GPIOD_BSRR registerinin C tanımlamasını rehberdeki şekline göre tanımlamamış da bunu 16 lık iki parçaya bölmüş.

(ARM registerlerine 8, 16 ve 32 olarak erişilebilir.)

Bu durumda header dosyaya göre GPIOD->BSRRL = 0XF000    Ledleri yakar
GPIOD->BSRRL = 0XF000    Ledleri söndürür

kullanılabilir ise bu komutları işleme hızları farklımıdır?

Hayır hiç bir farkı olmaz.  Fakat portta bit manuplasyonu yaparken yazılımda diğer bitleri maskelemeyle vs uğraşılmayacağı için
yazılım sadeleşir dolayısı ile hızımız artar. (Mevcut örneklerde bu durum sözkonusu değil)

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

z

Alıntı yapılan: kck87 - 24 Ekim 2011, 10:56:39
Programların SystemInit fonksiyonunda 2tane  FLASH->ACR komutu var 1 tanesini kullanıyoruz, açıklama olarak ikisine de aynı şeyleri yazmışsınız ama verilen değerler farklı, bunun nedeni  RCC->PLLCFGR katsayılarına verdiğimiz değerlermidir. Yani  RCC->PLLCFGR e verdiğimiz değerlere göre FLASH->ACR değerlerimi değişiyor? bu soruyu gözüme takıldığı için soruyorum daha incelemede bulunmadım. mantıksız 1soru olabilir şimdiden özür dilerim :)

//  FLASH->ACR = 0x00000705;        // Flash ROM icin 6 Wait state secelim ve ART yi aktif edelim (Rehber Sayfa 55)
    FLASH->ACR = 0x00000605;        // Flash ROM icin 6 Wait state secelim ve ART yi aktif edelim (Rehber Sayfa 55)

Normalde olması gereken üstteki. Fakat Çipte BUG var ve bu yüzden alttakini kullanıyoruz. Bu yüzden ikisinide yazdım fakat birisinin başına // koydum.

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

kck87

Alıntı yapılan: bunalmis - 24 Ekim 2011, 12:00:37

//  FLASH->ACR = 0x00000705;        // Flash ROM icin 6 Wait state secelim ve ART yi aktif edelim (Rehber Sayfa 55)
    FLASH->ACR = 0x00000605;        // Flash ROM icin 6 Wait state secelim ve ART yi aktif edelim (Rehber Sayfa 55)

Normalde olması gereken üstteki. Fakat Çipte BUG var ve bu yüzden alttakini kullanıyoruz. Bu yüzden ikisinide yazdım fakat birisinin başına // koydum.

anladım hocam sağolun, şu BUG nedir biraz açsak yada terimler kısmında açıklasak iyi olur hocam :)
 nickim'in terör örgütünün kck yapılanması ile alakası yoktur. bazı arkadaşlarımdan butarzda duyumlar aldım.

Drexel

Bunalmis Bey,

Bu forumdaki insanlara ARM öğretmek için gösterdiğiniz azmi ve çabayı takdir ediyorum, ayrıca bunun için teşekkür ediyorum. Cortex M-4 discovery kiti elime geçer geçmez ben de sizin yazılarınızı takip etmeye başlayacağım.

Sizden bir ricam olacaktı. Yeni başlayacaklar için bir konu açıp, yeni başlayacakların hangi konuyu hangi sırayla takip etmeleri gerektiğini o konu da belirtebilirseniz sevinirim. Konularınıza şöyle bir göz ucuyla baktım, fakat yeni başlayacak biri olarak hangi konuyu takip etmekle başlayacağımı kestiremedim.

İlginiz ve alakanız için tekrar teşekkürler...

mozkan87

Arkadaşlar linkteki kodu debug etmeyi deneyebilirmisiniz. Ne yaptıysam "while (!(RCC->CR & 0x00020000)); " satırını atlatamadım. Çünki RCC->CR registerının HSERDY biti set olmuyor. System init içindeki diğer while döngüleride aynı şekilde. Onları yorum satırı yapınca sorun klamıyor ama registerlarda HSERDY, PLLRDY bitleri set edilmemiş oluyor.
http://www.4shared.com/file/Nm7cdwgu/led.html

SERRO EFE

o satırı bende debug edemedim varmıdır bi sebebi yoksa kitlemi çalışmak gerekiyo

mozkan87

Ben 2 gündür aklıma estikçe kodun o kısmıyla ilgileniyorum. Tahminime göre simülatör ile alakalı bir durum ama bunalmis hocam ben sorunsuz simülatör ile debug ettim yazmıştı. O yüzden uğraştım ama sonuç alamadım. Ve dosyaları yüklemeye karar verdim. Aynı şekilde keille birlikte gelen blinky projesinide inceledim HSERDY ve PLLRDY bitleri set olmuyor ama orada timeout koymuşlar belirli bir süre sonra o satırları atlıyor.

z

#265
Hemen kontrol deyim. Acaba simülatörden ST-Link'e geçmeyi mi unutttum. Normalde simulatör, donanımı simüle etmez. Etmesi için varsa bu özelliğinin seçilmesi lazım.

Edit: Muhtemelen Debugger ST-Link de kaldı. Simulatör de o satırlar geçilmiyor. (Kusura bakmayın)

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

mozkan87

Anlaşılmıştır hocam bu kısımları kitler ulaşınca hem tekrar hem de kontrol amaçlı bakmamız gerekecek. Teşekkürler. Bu arada blinky projesini incelerken yapılan port tanımları oldukça okunaklı  geldi portların takibi açısından.

ErsinErce

bunalmis hocam ST nin kendi örneklerinde simülatör PLL kısmını direk geçiyor,
arada ne fark diye baktığımda başlangıçta şu ayarlamalar yapılıyor
System_Init bu şekilde başlıyor system_stm32f4xx.c içinde

  /* Reset the RCC clock configuration to the default reset state ------------*/
  /* Set HSION bit */
  RCC->CR |= (uint32_t)0x00000001;

  /* Reset CFGR register */
  RCC->CFGR = 0x00000000;

  /* Reset HSEON, CSSON and PLLON bits */
  RCC->CR &= (uint32_t)0xFEF6FFFF;

  /* Reset PLLCFGR register */
  RCC->PLLCFGR = 0x24003010;

  /* Reset HSEBYP bit */
  RCC->CR &= (uint32_t)0xFFFBFFFF;

  /* Disable all interrupts */
  RCC->CIR = 0x00000000;

  ==================================== Buradan sonrası aynı

  RCC->CR |= ((uint32_t)RCC_CR_HSEON);
 
  /* Wait till HSE is ready and if Time out is reached exit */
  do
  {
    HSEStatus = RCC->CR & RCC_CR_HSERDY;
    StartUpCounter++;
  } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));

mozkan87

Evet bu kodu inceledim. Burada timeout var o nedenle geçiyor.

z

Bu durumu üstü kapalı olarak dersler başlığında yazmış lakin yazdığım açıklamayı ben de beğenmemiştim.

Şöyle demiştim.

Alıntı YapSystemInit kodları, basit yazılsa ne olur karmaşık yazılsa ne olur?

Bu sorunun cevabını bilmeniz çok önemli. Çünkü cevabı, yazım şeklinde tercih yapmanızı, dolayısıylada sizin ARM hayatınızı şekillendirecektir.

Reset işlemi ardından çipin ne kadar registeri varsa hepsi tabiri yerindeyse fabrikasyon değerlerini alır.

SystemInit kodlarınızı bu varsayımla yazarsanız, daha açık ifadeyle, kodlarınız, sadece reset işleminden çıkılır çıkılmaz çalıştırılacak, daha sonra çalıştırılmayacak varsaysayımı ile yazarsanız yazılım sade olacaktır. Çünkü tüm registerler bilinen değerlere sahiptir. Size, Rehber dokumandaki register anlatımlarına göre registerlerin bitlerini set yada reset etme işi kalır.

Fakat bu şekilde yazacağınız kodları, gelişigüzel bir safhada çağırmaya kalktığınızda işlemcinin yada donanımın çakılması sorununu yaşayabilirsiniz.

Bu sorunun çözümü daha dikkatli yazım şeklini gerektirir. Daha önceden değer almış registerler donanım çalışırken bir anda ilk değerlere döndürülemez kademeli olarak döndürülmelidir. Bu tip registerlere en güzel örnek clock ayarlamalarının yapıldığı registerlerdir.

(Son konuya ait açıklamayı ben de beğenmedim. Bir ara tekrardan ele alacağım. Fakat şimdilik böyle kalsın)

Bunu tartışmak bugüne nasipmiş.

Tartışalım. Neden biz daha basit kodlar yazdık?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com