STM32F407 Cortex M4 şamataları

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

muhittin_kaplan

Anladığım Kadarıyla
Iser0 ve Iser1 adında iki adet reg var. ve bu reg la int. ayarlanıyor.
bu ayarlama ise  8.1.2 Interrupt and exception vectors başlığında verilmiş.

fryrmnd

hocam rehber 195. sayfada başlıyor. interrupt and exception vectors (9.1.3). cortex m3 programming manualda da 120. sayfa tablo 41.

mesala timer 7 için 9.1.3 den bakınca 55. sırada oluğu gözüküyor.  tablo 41 den da hesaplarsak ISER[ 1 ] de 23. bite(32 bit( ISER[ 0 ]) + 23 bit=>55) denk geliyor(ISER[ 1 ]=0x00800000)

muhittin_kaplan

GPIOC yi giriş olarak tanımlayıp
GPIOC->MODER = 0x00000000;     // 
    GPIOC->OSPEEDR= 0x22222222;   // 

Keil den Debug a baktığımda
herhangi bir giriş olmamasına ragmen neden anlamsız degerler alıyor

ErsinErce

pinler boşta ise normal, pullup ve ya pulldown ile değer sabitlenmeli

muhittin_kaplan

peki bunu yazılımla yapabiliyormuyuz ?
(cevabı sanki evet gibi)

ErsinErce

28.dakika da Bil Herd sebebini güzel bir şekilde anlatıyor bir gözatın


dahili pulluplar mevcut bunları aktif edebilirsiniz ama pulldown var mı emin değilim datasheet'e bakmak lazım

muhittin_kaplan


muhittin_kaplan

#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 
}


int main()
{
	SystemInit();
    while(1)
   {
   int a;
	 	GPIOD->ODR= 0x0000F000;
		for (a=0;a<0x0000FFFF;a++);
	 	GPIOD->ODR= 0x00000000; 
		for (a=0;a<0x0000FFFF;a++);
   } 
}

// Programın sonudur.


Aslında Programda yapmak istediğim ardı ardına Usarttan bilgi göndermekti. Ardı ardına giden bilgiyi pc de yerlerine koymak istemiştim.
bunu sağlamak için 8bitlik datanın önüne bir preamble bilgi koyacaktım. neyse yapamadım. geri geri giderken yazığım programda buraya kadar döndüm.
yukardaki programda debugda çalışıyor ama normal çalışmada for larda çakılıyor.
sebebi nedir.

Klein

Program çakılmıyor. Döngü hızı yüksek olduğu için ledlerin yanıp söndüğünü göremiyorsun o kadar.
for (a=0;a<0x00FFFFFF;a++); şeklinde düzeltirsen çalıştığını göreceksin.


fryrmnd

Alıntı yapılan: Klein - 13 Ocak 2012, 21:15:21
Program çakılmıyor. Döngü hızı yüksek olduğu için ledlerin yanıp söndüğünü göremiyorsun o kadar.
for (a=0;a<0x00FFFFFF;a++); şeklinde düzeltirsen çalıştığını göreceksin.

+1.

160Mhz de çalışsa. pic gibi 4 saykılda çalışsa(sanırım öyle değil) . FFFF e kadar 1.5 ms de sayar.
FFFFFF 0.5sn kadar yapıcak sanırım.

muhittin_kaplan

peki bu usart3 den byte byte bilgi gönderirken gönderilen bilgiler arasında nekadar beklemeliyim? yada alıp işlem yaptığını nereden anlarım ?

muhittin_kaplan

Alıntı yapılan: fryrmnd - 13 Ocak 2012, 21:25:39
+1.

160Mhz de çalışsa. pic gibi 4 saykılda çalışsa(sanırım öyle değil) . FFFF e kadar 1.5 ms de sayar.
FFFFFF 0.5sn kadar yapıcak sanırım.
O hesap assembly için geçerli for- komutu için kaç ass. komut yazdığına bakmak gerek. MIPS nin ne olduğunu bilmek, ayrıca yanlışım varsa düzeltin  arm da (8051 de öyleydi) bütün assm komutlar 1 komut saykılında çalışmıyor

fryrmnd

haklısınız hocam. ben komutları tam olarak ne  kaç sakılda işlediğini bilmediğimi belirttim. ama klein hocamın yazdığı gibi FFFF çok kısa olucaktır arm ler için sanırım.

z

Pipeline mekanizmasi bozulmadigi surece komutlarin cogu 1 yada 2 cycle da calisiyor. Branch tipi komutlar kullanilirsa hersey allak bullak oluyor.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Klein

Bölme yok. ama  bir döngü için 4 komut gerektiği için yine 4-5 civarında bir değer  bölünmüş oluyor. (BLT kaç cycle sürüyor bilmiyorum. Dokümanda 1+P yazıyor. P için 1-3 aralığında olabilir diyor. )   yaklaşık 0.5 saniyede bir flash yapıyor.

eğer for döngüsü   for (a=0xFFFFFF;a;a--); şeklinde yazılsaydı  her döngü 1cycle daha kısa sürecekti.

;;;32             for (a=0xFFFFFF;a;a--);
0000a0  f06f437f          MVN      r3,#0xff000000
0000a4  e001              B        |L1.170|
                  |L1.166|
0000a6  f1a30301          SUB      r3,r3,#1
                  |L1.170|
0000aa  2b00              CMP      r3,#0
0000ac  d1fb              BNE      |L1.166|

;;;33             for (a=0;a<0x00ffFFFF;a++);
0000ae  bf00              NOP      
0000b0  e001              B        |L1.182|
                  |L1.178|
0000b2  f1030301          ADD      r3,r3,#1
                  |L1.182|
0000b6  f06f407f          MVN      r0,#0xff000000
0000ba  4283              CMP      r3,r0
0000bc  dbf9              BLT      |L1.178|