STM32F407 Cortex M4 şamataları

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

z

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

muhittin_kaplan

Şimdi Hocam;
#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 5 Wait state secelim ve ART yi aktif edelim (Rehber Sayfa 55)
    FLASH->ACR = 0x00000605;        // Flash ROM icin 5 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 
}
 
void TIM7_IRQHandler()
{
volatile short i;
static char LedFlag=0;
 
    TIM7->SR=0;                              // Timer Int Flagy 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 =4200;             // Prescaler değerimiz 8000, Count frekansimiz = fCK_PSC / (Yuklenen Deger + 1) = 84000000 / (8000) = 2000 Hz
    TIM7->ARR =1;                // Counter, Decimal 0 olunca basa donsun 10khz 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


Kodu ile Lojik Analizer ile (PD13) ölçüm aldığımda 5Khz görüyorum (Her led Toggle da iki kez kesmeye giriyor). Budan Dolayı 10Khz olduğunu görüyorum.
Böylelikle BUS hattının 84 de çalıştığını anlıyorum.
Konu Kapanmıştır Teşekkür ederim.

Klein

;;;12         d=GPIOD->ODR & 0xFF00;
000002  4bad              LDR      r3,|L1.696|
000004  681b              LDR      r3,[r3,#0]
000006  f403427f          AND      r2,r3,#0xff00


Yukarıdaki assembly kod parçacığını biri açıklayabilir mi. Arm assembly söz dizimi biraz kafamı karıştırdı.

İlk satırda r3 registerine GPIOD->ODR  değerini attı. Bu tamam.
2. satırda  r3'ün alt 16 bitine 0 değeri attı // sanırım yanlış yorumluyorum.
3. satırda r3 ile 0xff00 değerini and yapıp sonucu r2 ( d için kullanılan register)  registerine attı.

Eğer 2. satırı yanlış anladıysam  bir sorun yok. Ama yanlış anlamadıysam 2. satır anlamsız duruyor.

Klein

#723
Tamam şimdi oturdu.
LDR |r3,L1.696| ile pointerin gösterdiği adresin içeriğini aldığını düşünmüştüm. İş orada karıştı.

Cortex çekirdeğinde r0....rn kaydedicileri özdeş mi?. ben istediğim operasyonu istediğim registerde yapabiliyor muyum? Kısıtlamalar neler?

cortex assembly söz dizimi  için aşağıdakiler doğru mudur?

x , | ... | şeklinde bir yazım adresler üzerinde işlem
x, [ ... ] adresin gösterdiği içerik üzerinde
x, .... doğrudan içerik üzerinde işlem yapar.

Klein

Hocam! doğru anlayıp anlamadığımı test içn aşağıdaki kodu orumlayacağım.
;;;13         CNTR++;
00000a  4bac              LDR      r3,|L1.700|
00000c  881b              LDRH     r3,[r3,#0]  ; CNTR
00000e  f1030301          ADD      r3,r3,#1
000012  4caa              LDR      r4,|L1.700|
000014  8023              STRH     r3,[r4,#0]
;;;14         if(CNTR>=255)
000016  4623              MOV      r3,r4
000018  881b              LDRH     r3,[r3,#0]  ; CNTR
00001a  2bff              CMP      r3,#0xff
00001c  db19              BLT      |L1.82|
;;;16             CNTR=0;
00001e  f04f0300          MOV      r3,#0
000022  8023              STRH     r3,[r4,#0]

LDR      r3,|L1.700|  r3'e CNTR değişkeninin adresini al.
LDRH     r3,[r3,#0] r3'e  r3'te gösterilen adresteki verinin 16 bitlik kısmını al.
eğer biz CNTR değil de bir sonraki 16 bitlik değişkenin içeriğini almak isteseydik  LDRH     r3,[r3,#2] yapacaktık sanırım. verdiğimiz offset değerleri byte cinsinden anladığım kadarıyla.

ADD      r3,r3,#1 r3'e 1 ekle yine r3'e at.
LDR      r4,|L1.700| r4'e L1.700 deki (CNTR değişkeni) adresini r4'e yükle.
STRH     r3,[r4,#0] r3'te bulunan verinin 16 bitini r4+0 ile gösterilen adrese(CNTR) 16 bit olarak at. burada işlemin yönü ters.
MOV      r3,r4 r4'ün içeriğini r3'e aktar. artık r3 içeriği CNTR değişkeninin adresi.
LDRH     r3,[r3,#0] r3+0 adresindeki (CNTR) içeriği yine r3'e yükle.
CMP      r3,#0xff r3 0xff den büyükse bir satır atla. burada sadece büyük kontrolü yapılıyor sanırım. Komut setinde CME gibi eşitlik kontrolü yapan bir komut göremedim. CMN küçükse CMP de büyükse diye yorumluyorum.
BLT      |L1.82| programı L1.82 etiketli adrese gönderiyor. Ama komut setinde BLT komutunu bulamadım
MOV      r3,#0  r3' içeriğini 0 yap
STRH     r3,[r4,#0] r4'ün göstrdiği adrese r3 içeriğini 16 bit olarak yaz.


Cortex komut kümesini detaylı açıklayan bir doküman bulamadım. bulduklarımın tamamı sadece komut kümesini vermiş. Aaa açıklamalar yok.




z

CMP compare demek.

Komutların pek çoğunun sonuna şart ekleri getirebilirsin. Mesela B Branch iken BLT küçükse Branch yap demek.

ADD topla  iken ADDLT  küçükse topla gibi...
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Klein

#726
Hocam CMP'nin compare olduğunu biliyorum ama karşılaştırmanın neye göre yapıldığını anlamadım.
komut setinde CMP ve CMN var.  CMP büyükse CMN de  küçükse karşılaştırması yapıyor sanıyorum. Peki Eşitlik karşılaştırmasını ne yapıyor?

kumutların çoşuna şart eki getirebiliyor demişsiniz. CMP ve CMN bunlara dahil mi.
Eğer öyle ise CMP ve CMN ile ilgili teorim çöktü. 
bu durmda CMP pozitif sayılar için eşitlik CMPL pozitif sayılar için küçüktür CMPH de pozitif sayılar için büyüktür kontrolü mü yapar?

z

Öyle düşünme.

CMP R1,R2
BEQ L1

R1 ve R2 yi karşılaştır eğer eşitse L1 e git.

CMN  ARM işlemcilere özel bir karşılaştırma şekli. 

CMP  R1,R2      Çıkartma yapıp sonuca bakarken
CMN  R1,R2      Toplama yapıp sonuca bakar.

CMP ile karşılaştırırsın daha sonra büyük, küçük, eşit, için şart ekleri getirirsin.

Mesela R1 ile R2 eşitse R3 ve R4 ü toplamak için

CMP R1,R2
ADDEQ R3,R4

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

Klein

Tamamdır hocam bu kısım da anlaşıldı.
Halen cortex-m4 assembler manual bulamadım. Bulan, bilen, gören duyan varsa buraya bildirmeleri rica olunur :)

Saruman

Arkadaşlar bakıyorum da çok hızlı gidiyorsunuz ben daha kartı elime alamadım sınavların yoğunluğundan.Darısı başıma...

muhittin_kaplan

NVIC->ISER[1] = 0X00800000;


Hocalarım Bu NVIC in Registerler bilgilerine nereden ulaşabilirim.
ISER i nereden buldunuzda neden 0X00800000 yaptınız. (Elimdek 32F100 de var beraber karşılaştırarak gidiyorum.)

mozkan87

Alıntı yapılan: silvercopper - 12 Ocak 2012, 13:29:48
Arkadaşlar bakıyorum da çok hızlı gidiyorsunuz ben daha kartı elime alamadım sınavların yoğunluğundan.Darısı başıma...

+1

z

Alıntı yapılan: muhittin_kaplan - 12 Ocak 2012, 14:26:25
NVIC->ISER[1] = 0X00800000;


Hocalarım Bu NVIC in Registerler bilgilerine nereden ulaşabilirim.
ISER i nereden buldunuzda neden 0X00800000 yaptınız. (Elimdek 32F100 de var beraber karşılaştırarak gidiyorum.)

Bunu daha önce konuşmuştuk. NVIC ARM çekirdeğine ait bir birim. Dolayısı ile bunu ARM çekirdeğini anlatan dokmanlardan bakacaksın.
Hatta şamatalar başlığında linki de verilmişti.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

muhittin_kaplan


muhittin_kaplan

tüm aramalarıma rağmen ISER de bu kesmelerin hangi bitlere karşılık gerldiğini bulamadım.