STM32F4x Çalışmalarım

Başlatan Mucit23, 02 Aralık 2013, 00:01:25

Mucit23

Arkadaşlar Merhaba

Elimde OV9655 Kamera bordu var. Bunu STM32F407 nin DCMI modülüne bağlamaya çalışıyorum.
Kameranın 2x10 header bağlantıları aşağıdaki gibi.

Dikkat ederseniz Data bacakları 2. bitten itibaren başlıyor. Bildiğim kadarıyla kamera max 10 bit haberleşiyor. Acaba buradaki bağlantıya göre 10 bit formatında datalar sola dayalı olarakmı geliyor? Yani Y2 pini D0, Y9 pini D7 olarak almam gerekiyor değilmi?



Mucit23

Merhaba,

Daha öncede sormuştum fakat net bir cevap alamadım.

Keilde Ana programa eklediğim kütüphanelerdeki tanımlı olan bir değişkeni main programında da kullanmak istiyorum.

Örneğin DMA ile ADC okuması yapıyorum. ADC değerini DMA ile ADC kütüphanesindeki bir değişkene aktarıyorum. Şuan ADC değerini main programına almak için bir fonksiyon yazıp değişken değerini fonksiyondan geri yolluyorum.

Bu dediğim işlemi nasıl yaparım.

mistek

#77
extern Degisken ile.

Mesela ADC dosyasındaki değişken

uint16_t ADC olsun.

main.c içerisinde

extern uint16_t ADC; demeniz yeterli.
boş işlerin adamı ---- OHM Kanunu: I = V/R ---- Güç Formülü: P = V*I = I^2*R = V^2/R

Mucit23

Evet, istediğim buydu, Teşekkürler..

Mucit23

Stm32f4X de delay fonksiyonu ile us bazında gecikme yaptıran oldumu? Stm32F10x için systick.c ve systick.h kütüphanelerim vardı onda kolay oluyordu. Stm32f4'de ise systick örneğindeki yapıyı kullanıyordum fakat farkettimki düzgün çalışmıyor. Yani 1ms yerine 3.120 ms gecikme yapıyordu. Bende SysTick_Config fonksiyonuna gönderdiğim parametreyi 1000 yerine 3119 yaparak çözdüm.

Bundan daha düşük gecikmeleri SysTick ile nasıl yaparım?


mistek

SystemTick her clock darbesiyle 24bitten geri sayar. LOAD resisterındaki değere gelince kesme üretir.

delay.h
#ifndef DELAY_H_
#define DELAY_H_

#include <stm32f10x.h>

extern volatile uint32_t tick;

extern void delay_ms(uint32_t value);
extern void delay_us(uint32_t value);
extern uint32_t yuzmicrosec(void);
extern void SystemTick_init(uint32_t freq);
extern void SysTick_Handler(void);


#endif // DELAY_H_


delay.c
#include <stm32f10x.h>
#include <delay.h>

volatile uint32_t tick=0;

void delay_yuz_us(uint32_t delay_value)
{
   uint32_t currentTicks;
     currentTicks = tick;
     while ((tick - currentTicks) < delay_value);
   
}


void delay_ms(uint32_t delay_value)
{
     uint32_t currentTicks;
     currentTicks = tick;
     while ((tick - currentTicks) < 10 * delay_value);
}

uint32_t yuzmicrosec(void)
{
   uint32_t sonzaman;

   sonzaman=tick;
   return sonzaman;   
}

void SystemTick_init(uint32_t freq)
{
		if( freq > 0x00FFFFFF ){
				freq = 0x00FFFFFF;
		}
	
   SysTick -> LOAD = freq;
   SysTick -> VAL  = 0;
   SysTick -> CTRL &=~(1 << 16);
   SysTick -> CTRL |= 7;  
}

void SysTick_Handler(void)
{
   SysTick -> CTRL &=~(1 << 16); 
   tick++;
}


SystemTick_init(SystemCoreClock/10000) yaptığınızda 100us'de kesme üretir.

Osiloskopta baktığımda 100us'ye çok yakın değerlerde gecikme alabiliyordum yarın tekrar kontrol edeyim.
boş işlerin adamı ---- OHM Kanunu: I = V/R ---- Güç Formülü: P = V*I = I^2*R = V^2/R

Mucit23

Teşekkür ederim deneyelim.

Bir sorum daha olacak. Keil'de bazı lib dosyalarının üzerinde anahtar işareti var. Yani o dosya kilitlenmiş, Hiçbir şekilde dosyayı editleyemiyorum. Bu dosya üzerindeki korumayı nasıl kaldırırım.

ST'nin DSP librarysindeki math fonksiyonlarını kullanmak istiyorum fakat ATMCM4.h bulunamadı diye hata veriyor.

.\Libraries\CMSIS\Include\arm_math.h(280): error:  #5: cannot open source input file "ARMCM4.h": No such file or directory


ARMCM4.h yerine "stm32f4xx.h" dosyasını çağırmam gerekiyor bildiğim kadarıyla.

mistek

O konuda bilgim yok ama bende merak ediyorum.
boş işlerin adamı ---- OHM Kanunu: I = V/R ---- Güç Formülü: P = V*I = I^2*R = V^2/R

camby

#83
Dosyayı 'salt okunur' yaptığınızda üzerinde değişiklik yapılamıyor , bu da Keil'da kilit olarak gözüküyor. STM library'leri bu şekilde.

mesaj birleştirme:: 04 Şubat 2014, 09:23:17

Alıntı yapılan: Mucit23 - 03 Şubat 2014, 22:34:38
Stm32f4X de delay fonksiyonu ile us bazında gecikme yaptıran oldumu? Stm32F10x için systick.c ve systick.h kütüphanelerim vardı onda kolay oluyordu. Stm32f4'de ise systick örneğindeki yapıyı kullanıyordum fakat farkettimki düzgün çalışmıyor. Yani 1ms yerine 3.120 ms gecikme yapıyordu. Bende SysTick_Config fonksiyonuna gönderdiğim parametreyi 1000 yerine 3119 yaparak çözdüm.

Bundan daha düşük gecikmeleri SysTick ile nasıl yaparım?

Hocam bu şekilde olmaması lazım , ya kullandığın fonsiyonda sıkıntı var , yada system clock sıkıntılı.

Ben hem F4 hem de F1 için aşağıdakileri kullanıyorum.

//====== SysTick Handler ======================================================
void SysTick_Handler(void)
{
  TimingDelay_Decrement();
}//============================================================================


//====== Systick Init =========================================================
void Systick_Init(void)
{	
	SysTick_Config(SystemCoreClock/1000000); 			// 1us step for Delay Function
	STK_CTRL &=~ 0x00000001;   							// 1: Counter disabled 
	
}//============================================================================


#include "delay.h"

static __IO uint32_t TimingDelay;

//====== Delay ================================================================  
void Delay(__IO uint32_t nTime)
{ 
	STK_CTRL |= 0x00000001;   						// 1: Tick Counter enabled 
	
	TimingDelay = nTime;

	while(TimingDelay != 0);
	
	STK_CTRL &=~ 0x00000001;   						// 1: Tick Counter disabled 
}//============================================================================

//====== Timing Delay =========================================================
void TimingDelay_Decrement(void)
{
  if (TimingDelay != 0x00)
  { 
    TimingDelay--;
  }
}//============================================================================


/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __delay_H
#define __delay_H

/* Includes ------------------------------------------------------------------*/
#include "stm32f4xx.h"

#define STK_CTRL (*((volatile unsigned int*) 0xE000E010)) 

/* Exported functions ------------------------------------------------------- */
void TimingDelay_Decrement(void);
void Delay(__IO uint32_t nTime);

#endif /* __MAIN_H */


Kullanım :

GPIO_WriteBit(GPIOB,GPIO_Pin_7,Bit_SET);	 	// Signal LED 
		Delay(1000000);
		GPIO_WriteBit(GPIOB,GPIO_Pin_7,Bit_RESET);	 	// Signal LED

yılmaz

Merhaba

Stm32f4 için PIC C Compiler da yazdığım standart c fonksiyonlarını kullanabilir miyim? Keil IDE kullanıyorum.

Mucit23

Keilin şu L6200E hataları çok canımı sıkıyor.. Yazım hatası felan olsa hataya çift tıklayınca hatanın yapıldığı satıra gidiyor. Gösteriyor orayı. Fakat bu tür hatalarda göstermiyor.

Multiply defined hatası var fakat nerede olduğunu bulamıyorum. Siz bu tür problemleri nasıl aşıyorsunuz?

mistek

#86
"Find in files" ile kelimeyi projenin neresinde olduğunu bi araştırın isterseniz.
boş işlerin adamı ---- OHM Kanunu: I = V/R ---- Güç Formülü: P = V*I = I^2*R = V^2/R

camby

Ic ice header , define tanimlamalarini dikkatli yapmak lazim , yoksa dediginiz gibi cildirtiyor.
Define tanimlamalari .h icine alin , header dosyasinda header guard olsun.

Benim kendi yazdigim kutuphanelerde kendilerine ait .h dosyalari var , onun icinde kendi tanimlamalari ve main.h cagrisu var.


Mucit23

keil saçlarımı ağarttı.
Kendi yazdığım kütüphanelerde zaten problem olmuyor ama başka bir kütüphaneyi programa ekleyince uğraş babam uğraş.... Uğraşki hatayı bulasın..

mistek dediğin gibi yaptım, Bütün dosyaların içerisinde teker teker arama yapıp buldum.

mistek

Alıntı yapılan: camby - 11 Şubat 2014, 23:58:30
Define tanimlamalari .h icine alin , header dosyasinda header guard olsun.

Hocam header guard dediğiniz bu mu?

#ifndef __PWM_SETUP_H
#define __PWM_SETUP_H
boş işlerin adamı ---- OHM Kanunu: I = V/R ---- Güç Formülü: P = V*I = I^2*R = V^2/R