Stm32f407 discovery ve mikroc ile vga

Başlatan since1990, 04 Mayıs 2014, 17:27:57

since1990

Arkadaşlar merhaba, stm32f4 discovery kit ile vga sürmeye çalişiyorum. Osiloskopumda var, 40ns lik timer interruptu oluşturup her bir interrupt için hsync ve vsynci ayarlamak istiyorum ama 40 ns lik interruptun içerisinde bir pini toggle yaptığımda osciloskopta 400ns görüyorum bir periyodu. Tmeri timer calculator ile ayarlıyorum uzun süreli(us) interruptlarda sıkıntı yok.
hata nerde sizce tada Tavsiye edeceğiniz başka bir  yöntem var mı mikroc vga için yada başka bir compilier?
"Dinlenmemek üzere yola çıkanlar asla yorulmazlar. Türk gençliği, gayeye, idealizme durmadan ve yorulmadan yürüyecektir. Bütün ümidim gençliktedir." Mustafa Kemal Atatürk

LukeSkywalker

İlgili pini 100MHz hızına aldınız mı?

since1990

#2
hayir, bu arada timer 2 yi kullaniyorum. ilgili pni nasil 100 mhz yapabilirim?

mesaj birleştirme:: 04 Mayıs 2014, 17:40:13

su anda mikro c ile arm programlama kitabina bakiyorum
gpiod_ospeedr kaydedicisi ile galiba?
"Dinlenmemek üzere yola çıkanlar asla yorulmazlar. Türk gençliği, gayeye, idealizme durmadan ve yorulmadan yürüyecektir. Bütün ümidim gençliktedir." Mustafa Kemal Atatürk

LukeSkywalker

Evet o register. Fakat mikroc gpio kutuphanesini de kullanabilirsiniz. Siz registeri yine de bilin.

since1990

#4
Hız:168 mhz ye ayarlı kitaptakine göre ayarladım. Bu özelliklere göre timer calculatorle 40ns hesapladım ama Yine periyodum 200ns.
void InitTimer2(){
  RCC_APB1ENR.TIM2EN = 1;
  TIM2_CR1.CEN = 0;
  TIM2_PSC = 0;
  TIM2_ARR = 6;
  NVIC_IntEnable(IVT_INT_TIM2);
  TIM2_DIER.UIE = 1;
  TIM2_CR1.CEN = 1;
}

void Timer2_interrupt() iv IVT_INT_TIM2 {
   TIM2_SR.UIF= 0;
   GPIOC_ODR.B15=~GPIOC_ODR.B15;
}


void main() {

  GPIO_Digital_Output(&GPIOE_BASE, _GPIO_PINMASK_ALL);  // Enable digital output on PORTE
 // GPIO_Digital_Output(&GPIOC_BASE, _GPIO_PINMASK_ALL);  // Enable digital output on PORTC
  GPIO_CONFIG(&GPIOC_BASE, _GPIO_PINMASK_15 , _GPIO_CFG_MODE_OUTPUT|_GPIO_CFG_SPEED_100MHZ);  //

  
  GPIOE_ODR = 0;
  GPIOH_ODR = 0;
  GPIOC_ODR = 0;
  
  InitTimer2();


  while(1)  {}
  }




mesaj birleştirme:: 04 Mayıs 2014, 20:14:06

Bu portu tersleme işlemimi acaba uzun sürdüğü için periyot uzun görünüyor?
"Dinlenmemek üzere yola çıkanlar asla yorulmazlar. Türk gençliği, gayeye, idealizme durmadan ve yorulmadan yürüyecektir. Bütün ümidim gençliktedir." Mustafa Kemal Atatürk

LukeSkywalker

#5
Yanlış hesap yaptırıyorsunuz timer calculatöre.
void InitTimer2(){
  RCC_APB1ENR.TIM2EN = 1;
  TIM2_CR1.CEN = 0;
  TIM2_PSC = 0;
  TIM2_ARR = 2;
  NVIC_IntEnable(IVT_INT_TIM2);
  TIM2_DIER.UIE = 1;
  TIM2_CR1.CEN = 1;
}


mesaj birleştirme:: 04 Mayıs 2014, 20:32:37

APB prescaler değeriniz 1 değilse APB bus hızlarını 2 ile çarpmanız lazım. APB1'in (timer 2 apb1'den beslenir) maks frekansı 42MHz olduğuna göre ve siz APB prescaler değerini 1'den farklı seçtiyseniz 84MHz eder. Tmer calculatmrde buna göre hesap yapacaksınız.
Edit: TIM2_ARR değeri 2 olacak

since1990

Hocam tekrar baktım, yok en az 200ns oluyor periyot. Dediğim gibi sadece Toggle komutunun işlem süresi ile alakalı olabilir mi?
Discovery üzerindeki 8mhz yi kaldırıp 25 mhz kullandım. Load Schemeden de 25 to 150 mhz yi seçtim.
Sadece
while(1)  {GPIOC_ODR.B15=~GPIOC_ODR.B15;}

ana programa bu kodu yazdım periyodu:262ns oluyor. Anlayamıyorum hatam nerede
"Dinlenmemek üzere yola çıkanlar asla yorulmazlar. Türk gençliği, gayeye, idealizme durmadan ve yorulmadan yürüyecektir. Bütün ümidim gençliktedir." Mustafa Kemal Atatürk

LukeSkywalker


since1990

Sizin verdiğiniz kodu kullanamadım fakat,
while(1)  {GPIOC_ODR.B15 = 1;
  GPIOC_ODR.B15 = 0;}

BU şekilde iken 142ns yeye düşüyor.
"Dinlenmemek üzere yola çıkanlar asla yorulmazlar. Türk gençliği, gayeye, idealizme durmadan ve yorulmadan yürüyecektir. Bütün ümidim gençliktedir." Mustafa Kemal Atatürk

LukeSkywalker

while(1)
 {
  GPIOC_BSRR=0x00008000;
  GPIOC_BSRR=0x80000000;
 }

since1990

106 ns :D Git gide düşüyor. Asm bilen bi abimiz de asm olarak yazsa bence en kısa o sürer ?
"Dinlenmemek üzere yola çıkanlar asla yorulmazlar. Türk gençliği, gayeye, idealizme durmadan ve yorulmadan yürüyecektir. Bütün ümidim gençliktedir." Mustafa Kemal Atatürk

Ramiz

Bunu hobby amaclimi yapiyorsunuz? yoksa bir urun tasarliyorsunuz ve stm32f407 ile vga yi hallederim gozuylemi bakiyorsunuz?

Eger ikincisi ise, mcular bu tarz islere uygun degildirler. Bu isi yapan ic ler yada Fpga kullanmaniz gerekir.

Sevgiler.
Electrical & Electronics Engineering -> Step one

since1990

Açıkçası bu kadar gelişmiş bir işlemcinini bu işi kotarması gerektiğini düşündüm, millet yapmış bende yaparım heralde dedim.
Ayrıca yaptığım sistemlerde lcd ekranlar yerine vga portundan monitör sürmek daha cool olur dedim. :yani hobi ve geleceğe dönük bir proje gibi
"Dinlenmemek üzere yola çıkanlar asla yorulmazlar. Türk gençliği, gayeye, idealizme durmadan ve yorulmadan yürüyecektir. Bütün ümidim gençliktedir." Mustafa Kemal Atatürk

Ramiz

Mcularda vga donanimi yapilmadigi surece, mcu nuz ne kadar hizli calisirsa calalissin, standart verimi alamazsiniz. Gerekli pixel cozunurlugune ve renk paleti cozunurlugune ulasmaniz neredeyse imkansizdir. Ayrica 640x480 artik eski kalmis bir cozunurluk. Eger bu ugrasilarinizin gelecrk vaadetmesini istiyorsaniz, size tavsiyem, ucuz yollu fpga leri arastirin, vhdl ogrenin, vga kismini fpga il, ekran bilgileri ve kontrolu kisiminlarinida mcu ile halledin. Lise sondayken bende mcu ile ekrana adimi yazdirmistim. Simdi dusunuyorumda, hobby nin otesinde bir hareket degilmis :)

Electrical & Electronics Engineering -> Step one

speak48

git bi framebuffer li mcu al
yoksa o deve bu hendeği atlayamaz