STM32F407 Cortex M4 şamataları

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

ErsinErce

Konuyu açmak için söylememiştim, pekiştirme amaçlıydı    :-\

Bundan sonraki konumuz ne olacak hocam?

gambit1244

Alıntı YapIcimiz disimiz bitbanding oldu bence bu konuyu kapatalim artik.
evet hocam sonuna kadar katılıyorum
birde kitler nezaman gelir acaba bilgisi olan varmı
[email]tufan_ozbek@hotmail.com[/email] Yesterday is history. Tomorrow is a mystery. Today is a gift aslında bütün mesele bu.

Andromeda

ayrı bir başlık açıyorum , "bit banding şamataları"...
" Tanrı, iradesini hakim kılmak için yeryüzündeki iyi insanları kullanır, yeryüzündeki kötü insanlar ise kendi iradelerini hakim kılmak için Tanrı'yı kullanırlar." ..." Tanrı'dan mesaj gelmiyor, biz Tanrı'ya mesaj gönderiyoruz"

MC_Skywalker

M4 MCU x86 modunda direkt olarak LCD desteklemektedir. Sadece datasheet te belirtilen pinleri kullanmalıyız. 5V toleranslı portlar mevcuttur.

mcan

#454
Alıntı yapılan: eemkutay - 06 Kasım 2011, 22:42:21
@mcan,
Profesyonel anlamda 20-30 ticari projelerim var ve otomotiv, endüstriyel, biomedikal vs. alanlarda ve sorunsuz çalışan projeler. Sense bana dandik lcd sorusu soruyorsun ve öyle değildir vs. diyorsun. Bildiğin gibi yap.
Ben aklıma takılanı okuduğum şeylerden yola çıkarak soruyorum,öyledir yada değildir demedim zaten okuduğumu doğru anladım mı anlamadım mı kontrol etmek için debugger ile gözlemlemek istedim, bu konuda yardımcı olabilirsen sevinirim.
Keilde simulator ile GPIOC üerinde bit mask ile işlem yaptığımda "General Purpose ı/o c (GPIOC )" ekranında programda biti set etmeme rağmen simulasyonda etmiyor,ancak gerçekde ediyor.

Bağlantıdaki j-tag adaptörünü alsam cortex-m4 içinde kullanabilirmiyim ,listede belirtmemişler.
http://www.ebay.com/itm/ULINK2-USB-JTAG-Emulator-ARM9-Cortex-Keil-Ulink-II-Debug-Adapter-ULINK-2-/220888291905?pt=UK_BOI_Electrical_Components_Supplies_ET&hash=item336df7da41#ht_4954wt_1039

MC_Skywalker

#455
Alıntı yapılan: mcan - 07 Kasım 2011, 19:18:21
Bağlantıdaki j-tag adaptörünü alsam cortex-m4 içinde kullanabilirmiyim ,listede belirtmemişler.
http://www.ebay.com/itm/ULINK2-USB-JTAG-Emulator-ARM9-Cortex-Keil-Ulink-II-Debug-Adapter-ULINK-2-/220888291905?pt=UK_BOI_Electrical_Components_Supplies_ET&hash=item336df7da41#ht_4954wt_1039

ULINK2 Debug Adapter Cortex M çekirdeklerini desteklemekte.
detaylar aşağıdaki klinkte mevcut. Bende de klon birtane var aldığım kartlardan birinin üzerindeki S-Link bağlantılarını ayırıp ULINK ile kullanacağım.
http://www.keil.com/ulink2/chips.asp

gambit1244

Alıntı YapULINK2 Debug Adapter Cortex M çekirdeklerini desteklemekte.
detaylar aşağıdaki klinkte mevcut. Bende de klon birtane var aldığım kartlardan birinin üzerindeki S-Link bağlantılarını ayırıp ULINK ile kullanacağım.

ulink in st link e gore avantajı kart uzerinde debug yapabilmekmi?
tam olarak farkı nedir acaba
cünkü ben stm32f100 kitimde debug yapabiliyorum avantajı nedir kafam karıştı,
birde bu ulink üzerinde 10 15 kablo baglantısı var bunlar neden bukadar fazla
[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

STM32F kartimizda JTAG pinleri yok. Sadece SWD yapabiliriz buna ait donanim da zaten kart uzerinde mevcut.

JTAG ile de SWD ile de donanimsal olarak debug islemleri yapiyorsun. Ilk baslarda sadece JTAG vardi. Sonradan SWD eklendi diye biliyorum.

JTAG JTAG kurulusunun denetiminde SWD ise ARM firmasinin.

SWD nin tel sayisi acisindan avantaji var bunun disinda birinin digerine gore ne ustunlugu var bilmiyorum.

SWD JTAG'a kiyasla yavas olabilir.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

CLR

Alıntı yapılan: bunalmis - 07 Kasım 2011, 00:48:51
@Ersinerce,

Sorun context saving islemi değil.

Interrupt rutini ile ana program ayni donanimin registerine erisiyorsa, ana program da bu donanimin registeri uzerinde yazilimsal olarak bit manuplasyonu yapiyorsa
bu durumda ana program, donanim registerine erismeden once interruptlari yasaklamali, isi bitince de interruptlara izin vermelidir.
Aksi takdirde hata olusabilir.

Ornegin ana program portun 0. bitine 1 yazmak istedi. Portu okudugunda portun 0 oldugunu ogrendi. (Prta dogrudan 1 yazamaz yazarsa tum ust bitler silinir)
Bu esnada da int geldi. porttan okudugu deger registerde ve donanim bunu sakladi.
Int rutinine gecildi.
Int rutini de portun 1. bitini 1 yapmak istesin.
Portu okudugunda 0 gorur. 1. bitini set eder 2 eder ve bunu porta yazar.
Interrupt rutininden ciktik ana programa donduk.
Ana program porttan okudugu degeri biliyor neydi 0.
Bunun 0. bitini 1 yapti ve porta yazdi. Su anda portta 1 yazili.

Halbuki portta 3 olmaliydi.

Eger int yasaklamasi yapilsaydi, ana program porta 1 yazacakti, interrupta izin verildiginde int gelecek ve 1. biti set edecekti
bu da portun 3 degerini almasi anlamina gelecekti.

Bunalmış, yokluğumda iyice sallamışsın, birincisi volatile kelimesini öğren ikincisi IDR ve ODR registerleri ne iş yapar onları öğren. Sanki tek register varmış gibi anlatmışsın ve portun type'ı volatile değilmiş gibi anlatmışsın.
Maskelersen de bişey olmaz, çünkü pratik olarak milyonlarca denenmiştir. Ben tüm register yapılarını daha öncede bahsettiğim gibi pointer structer yaptım ve istediğim bite erişebiliyorum. İstediğimi set edip reset yapıyorum. Her kartta bir tane stm32 içeren 10 ayrı kartla can bus ağı kurdum ve rastgele can interruptları geliyor ve çok sık şekilde, hiç bir sorun olmuyor olmazda. Çünkü portlar volatiledır ve maskeleme yapsanda bu işlemler Rx registerlerinde saklanır bunlar int. içine girdiğinde saklanır. Bu esnada porttan okusanda veya int içinde okuyup yazsanda eğer bit bazında test ediyorsan hiç bir sorun olmaz. 
Knowledge and Experience are Power

z

Yazdığım sorunu hiç anlamamış sırf cevap vermiş olmak için üfürmüşsün.

Hernekadar alıntı yaptığın yazımda port ifadesi kullanmış olsam da sözkonusu sorun sadece I/O portlar için değil registerlerin sülalesi için geçerli. Bu nedenle ODR ve IDR yi senden öğrenecek değilim. Volatile ile sorun arasında alaka kurman da çok ilginç.



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

CLR

Alıntı yapılan: bunalmis - 08 Kasım 2011, 17:09:50
Yazdığım sorunu hiç anlamamış sırf cevap vermiş olmak için üfürmüşsün.

Hernekadar alıntı yaptığın yazımda port ifadesi kullanmış olsam da sözkonusu sorun sadece I/O portlar için değil registerlerin sülalesi için geçerli. Bu nedenle ODR ve IDR yi senden öğrenecek değilim. Volatile ile sorun arasında alaka kurman da çok ilginç.

Ne dediğimi anlamamışsın ki ne alaka diyorsun, seninle uğraşarak zamanımı çarçur ediyorum. Sen şamatalarına devam et.
Knowledge and Experience are Power

mcan

#461
Arkadaşlar denemek isteyenler için
Alıntı Yap#include "STM32F10x.h"


#define BIT_LEVEL_SRAM(a,b) ((SRAM_BB_BASE + (a-SRAM_BASE)*32 + (b*4)))
#define BIT_LEVEL_PERI(a,b) ((PERIPH_BB_BASE + (a-PERIPH_BASE)*32 + (b*4)))
#define   RCC_APB2ENR   (RCC_BASE+0x018)

#define GPIO_C_ENABLE *((volatile unsigned int *)(BIT_LEVEL_PERI(RCC_APB2ENR,4)))

void delay(unsigned int);
//static int ih;
int zg,ipb,ii,i;

typedef struct CFM_{
   char   Mode0 : 2;
   char    Conf0 :   2;
} Pin_Setup;

Pin_Setup PortC_setup __attribute__((at(GPIOC_BASE+0x0C)));


typedef struct {
  int Pin0 : 1;
  int Pin1 : 1;
  int Pin2 : 1;
  int Pin3 : 1;
  int Pin4 : 1;
  int Pin5 : 1;
  int Pin6 : 1;
  int Pin7 : 1;
  int Pin8 : 1;
  int Pin9 : 1;
} BitBanding __attribute__((bitband));

BitBanding PortC __attribute__((at(GPIOC_BASE+0x0C)));

typedef struct {
  int Pin0 : 1;
  int Pin1 : 1;
  int Pin2 : 1;
  int Pin3 : 1;
  int Pin4 : 1;
  int Pin5 : 1;
  int Pin6 : 1;
  int Pin7 : 1;
  int Pin8 : 1;
  int Pin9 : 1;
} BitMask;

BitMask portc __attribute__((at(GPIOC_BASE+0x0C)));

void EXTI0_IRQHandler(void)
{   

   GPIOC->ODR |= 0x100; //pin8 set edildi
   while(EXTI->PR)
   {
      EXTI->PR  = 0x0;
   }
}

void TIM7_IRQHandler(void)
{   
   PortC.Pin5 = !PortC.Pin5;
   GPIOC->ODR |= 0x200;
   while(TIM7->SR)
   {
      TIM7->SR  = 0x0;
   }
   
}


void SystemInit (void)
{
   delay(0x880000);
   GPIO_C_ENABLE = 1 ;
   //RCC->APB2ENR |= 0x00000016;    // GPIOD donanımının clock sinyalini uygulayalım
    GPIOC->CRL = 0x37333334;     // GPIOD nin 15, 14, 13, 12 pinleri cikis tanimlandi (Ledler bu pinlerde)
   GPIOC->CRH = 0x33333333;

   RCC->CR |= 0x0010000;               // HSE ON
   RCC->CFGR = 0x001D0000;               // PLL ayarla
   RCC->CR  |= 0x001000000;            // PLL aç
   FLASH->ACR =  0x32;               // Flash gecikme ayarı
   RCC->CFGR = 0x001D0702;               // SİNYAL KAYNAĞI PLL    APB1 HCLK/16

   EXTI->IMR = 1;
   EXTI->EMR = 1;
   EXTI->FTSR = 1;
   NVIC->ISER[0] = 0x40;
   RCC->APB1ENR |= 0x00000020;          //Timer7 ye clock verelim
   TIM7->DIER = 0x1;
   TIM7->PSC = 0x1FF;                 //182=B6  182*5= H393
   TIM7->ARR = 0xFFFF;
   TIM7->CR1  = 0x85;
   NVIC->ISER[1] = 0x00800000;        // NVIC de Timer 7 interrupta izin verelim

}
                                                                                 
void delay(unsigned int i)
{   unsigned int z;
    for(z=0;z<i;z++);
   
}

int main()
{
    while(1)
   {
    GPIOC->ODR |= 0x200; // pin9 set ediliyor.
    PortC.Pin5 = 1;
    delay(0x40000);
     GPIOC->ODR = 0x00;     // Ledler sonsun
    delay(0x40000);
   }
}

Bu kodu alın (cortex m3 için)keil de derleyin,simulator ve debugger'ı açın  resimde gösterdiğim adıma ok gelince yine resimdeki iki kutucuğu işaretleyip interrupt oluşmasını sağlayın,
[IMG]http://img217.imageshack.us/img217/3350/debugv.jpg[/img]

Uploaded with ImageShack.us

İnterruptu bitirip ana programa geri dönün.... Şimdi sadece pin 9 set edilmiş olucak oysa ki interrup içinde pin 8 i set etmiştik.
Anlatılmaya çalışılan bu, interrupt içinde set edilen pinler ana programa dönünce planlanan gibi kalmıyorlar.
@Eemkutay burada bir uygulama hatası varmı? Simulator ü yeni kullanmaya başladım, donanımsal debugger yok o sebeple gerçek kart üzerinde deneyemedim.

gambit1244

merhaba arkadaşlar sıkıcı tartışmalar ve bayram dolayısıyla ara verdigim calısmalara sogutmadan tekrardan başladım

hedefim suana kadar yazılmış tüm programların kıl tüy yününü debug penceresinden görebilmek!

buraya kadar güzel fakat takıldıgım yerler var yardımcı olursanız cok sevinirim..

çalıştığım kod bu!

Timer 7 ve interrupt kullanarak yanıp sönen led programı
 
// Programın başı
 
#include "STM32F4xx.h"
 
void SystemInit()
{
//  Yukarıdaki örnek programdaki kodların aynısı
}
 
void TIM7_IRQHandler()
{
volatile short i;
static char LedFlag=0;
 
    TIM7->SR=0;                                        // Timer Int Flagý silelim 
    LedFlag=(LedFlag+1)&1;
    if (LedFlag) GPIOD->ODR= 0x0000F000;     // Ledler yansin
    else GPIOD->ODR= 0x00000000;              // Ledler sonsun
} 

int main()
{
    RCC->APB1ENR|=0x00000020;         // Timer7 CLK'u aktif edelim (84 Mhz)
    TIM7->CR1=0x0080;                      // Otomatik Reload
    TIM7->PSC =42000;                      // Prescaler deðerimiz 42000, Count frekansimiz = fCK_PSC / (Yuklenen Deger + 1) 84E6 / (42000) = 2000 Hz
    TIM7->ARR =1000;                        // Counter, Decimal 1000 olunca basa donsun 0.5 sn demek
    TIM7->DIER=0x0001;                     // Update Int enable
    NVIC->ISER[1] = 0X00800000;        // NVIC de Timer 7 interrupta izin verelim
    TIM7->CR1|=0x0001;                    // Counter Enable
    
   while(1)
      {
      } 
}
// Programin sonu



sormak istedigim ise ben bütün registerleri kontrol etmek istedim gerçekten içlerine istedigimiz deger yazılıyormu diye sağ tıklayıp add to watch1 dedim hepsine
sonra programı adım adım işledim o satırlara kadar
fakat hiçbir register değer almadı hepsinde <cannot evaluate> diyor :S

mesela ben burda ledin yanıp sondugu anları hangi değeri "add to watch 1" diyerek izleyebilirim bunu anlayamadım
GPIOD->ODR= 0x0000F000; satırında--  "GPIOD"  "ODR" diye watch ettim ama degerler gelmedi :(
yardımcı olursanız cok mutlu olurum
saygılar.
[email]tufan_ozbek@hotmail.com[/email] Yesterday is history. Tomorrow is a mystery. Today is a gift aslında bütün mesele bu.

Seckin ALAN

kitler ne zaman geliyor heyecanla bekliyorum :)
Kar taneleri ne güzel anlatıyor, birbirlerine zarar vermeden de yol almanın mümkün olduğunu.. Mevlana

omereliusuk

Alıntı yapılan: eemkutay - 08 Kasım 2011, 17:40:39
Ne dediğimi anlamamışsın ki ne alaka diyorsun, seninle uğraşarak zamanımı çarçur ediyorum. Sen şamatalarına devam et.
@eemkutay
lütfen burada bir şeyler öğrenmeye çalışıyoruz. eğer illa ben daha iyi biliyorum diyorsanız siz de ayrı bir hattan devam edin.
bunalmış hocamı yaptığı işten soğutmayın.
bizim zamanımız da en az sizinki kadar değerli. teşekkürler