Ynt: STM32F4 Std_LIB Kullanımı (Örnek)

Başlatan Klein, 26 Ekim 2012, 16:10:47

sseedat

mrb hocam

Kütüphane klasörü\Utilities\STM32F4-Discovery\stm32f4_discovery.c   klasörde boyle dosya bulamadım.bendeki
utilities klasöründe STM32_EVAL klasörü var (burdada stm32f4_discovery.c dosyası yok)

STM32F4xx_DSP_StdPeriph_Lib_V1.0.1  ve  LİB.stm32f10x_stdperiph_lib kütüphane kalsörlerine bakıyorum. acaba biyerlerde hata mı yapıyorum.
Görünmez bir mezarlıktır Zaman...

Klein

stm32f4_discovery.c dosyası çok gerekli bir dosya değil.  İçinde Ledlerin bağlı olduğu portlar için tanımlamalar var. Standart kütüphaneye dahil değil. Discovery kit için kullanılmış bir dosya. Örnekte bu dosyadaki tanımları hiç kullanmamışım zaten.  Projeden kaldırırsanız sorun olmaz.

Kaanx

Merhabalar arkadaşlar benimde çorbada bir tuzum olması dileğiyle bu kodu paylaşayım dedim.Forum üyelerine ve bulent hocam aynı zamanda murat hocama cok tesekkurlerimi sunarım.Kod Atollic te derlenmiştir daha ayrıntılı bilgi için kişisel blogumdaki yazıyı inceleyebilirsiniz.
http://kaankandemir.wordpress.com/2013/03/12/stm32f4-discovery-std_periph_driver-gpio-kullanimi/
#include "stm32f4xx.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_rcc.h"

GPIO_InitTypeDef  GPIO_InitStructure;

void Delay(__IO uint32_t nCount); //gecikme fonksiyonu atadık

void Pin_Init(void)
{
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE);
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_15|GPIO_Pin_14|GPIO_Pin_13|GPIO_Pin_12;
	GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
	GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOD,&GPIO_InitStructure);


}

void main(void)
{
	Pin_Init();
	Delay(0x3FFFF);
	while(1)
	{
		GPIO_ToggleBits(GPIOD,GPIO_Pin_12);
		Delay(0x0053FFFF);
		GPIO_ToggleBits(GPIOD,GPIO_Pin_13);
		Delay(0x0053FFFF);
		GPIO_ToggleBits(GPIOD,GPIO_Pin_14);
		Delay(0x0053FFFF);
		GPIO_ToggleBits(GPIOD,GPIO_Pin_15);
		Delay(0x0053FFFF);

	}
}
void Delay(__IO uint32_t nCount)
{
  while(nCount--)
  {
  }
}

uint16_t EVAL_AUDIO_GetSampleCallBack(void)
{
    return 0; // ses çipini kullanıyorsanız tek sample veriyi burada return ile döndürün.
}
void EVAL_AUDIO_TransferComplete_CallBack(uint32_t pBuffer, uint32_t Size)
{
    return; // ses çipini kullanıyorsanız  burada çipe veri aktarımı DMA sona ermiş
}

Erhan YILMAZ

Hocam çok teşekkürler anlatım için. Bende keil'e çok hakim olamadığımdan standart libraryleri dahil etmede sorun yaşadığım için pek ilgilenmiyordum. En kısa sürede anlatılanları denemeyi düşünüyorum. Sormak istediğim discovery.h dosyası mecburi bir dosya mı? Bir proje açmak için minimum hangi dosyaları dahil etmek gerekiyor?

Kaanx

Hocam keil kullanmadım ben fakat atollicte stm32f4xx.h , stm32f4xx_gpio.h , ve blogların frekans ayarını yaptıgımız ıcın stm32f4xx_rcc.h dahil etmiştim
burada temel olarak stm32f4xx.h kesınlıkle dahıl edılmeli.

Klein

Discovery.h  mecburi değil.
Bu başlığı,  İlk ST_Lib denemesinden sonra açmıştım. Bazı acemilikler ve budan kaynaklı gereksiz şeyler var.
Yakında yeniden  düzenleyeceğim.

sseedat

merhaba
GPIO_InitTypeDef  GPIO_InitStructure; şeklinde kalıtım oluşturuyoruz
bunu şu şekilde yazıncada çalışıyor GPIO_InitTypeDef  port;
şunu sormak istedim GPIO_InitStructure olarak yazmanın bir önemi varmı yoksa istediğimiz isimden türetebilirmiyiz.

saygılar...
Görünmez bir mezarlıktır Zaman...

M_B

Alıntı yapılan: sseedat - 14 Aralık 2013, 17:25:26
şunu sormak istedim GPIO_InitStructure olarak yazmanın bir önemi varmı yoksa istediğimiz isimden türetebilirmiyiz.
Bir önemi yok. Başka bir şey de yazabilirsin. Ama çağrıştıracak bir şey olursa daha iyi olur.

İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

sseedat

teşekkürler cavabınız için
bu konuda yeniyim aklıma çok şey takılıyor mesel şu olayları tam olara kavrayamadım

timer7 örneğinde;

TIM_ITConfig(TIM7, TIM_IT_Update, ENABLE); burdaki  TIM_IT_Update  geleceğini nerden biliyoruz?
Görünmez bir mezarlıktır Zaman...

SpeedyX

Alıntı yapılan: sseedat - 14 Aralık 2013, 20:28:04
TIM_ITConfig(TIM7, TIM_IT_Update, ENABLE); burdaki  TIM_IT_Update  geleceğini nerden biliyoruz?
Timer değeri max değere ulaşıp overflow olunca, yani 0 değerine geri dönünce update event i gelir.
Timer da yukarı yada aşağı sayacağı için sona ulaşıp herzaman overflow olacaktır.

sseedat

merhaba arkadaşlar ;
CooCox ile 2*16 lcd uygulaması yapmaya çalıştım  fakat lcd ye yazdığımla lcd de çıkan farklı oluyor;
kodları şu şekilde
lcd.c
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_rcc.h"
#include "stm32f4xx.h"
#include "lcd.h"
#include "Delay.h"

GPIO_InitTypeDef lcd_port;

void lcd_init()
{

	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);

	//GPIOB
	lcd_port.GPIO_Pin=GPIO_Pin_4 | GPIO_Pin_5;
	lcd_port.GPIO_Mode=GPIO_Mode_OUT;
	lcd_port.GPIO_Speed=GPIO_Speed_2MHz;
	lcd_port.GPIO_OType=GPIO_OType_PP;
	lcd_port.GPIO_PuPd=GPIO_PuPd_NOPULL;
	GPIO_Init(GPIOB,&lcd_port);

	//GPIOD

	lcd_port.GPIO_Pin=GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 ;
	lcd_port.GPIO_Mode=GPIO_Mode_OUT;
	lcd_port.GPIO_Speed=GPIO_Speed_2MHz;
	lcd_port.GPIO_OType=GPIO_OType_PP;
	lcd_port.GPIO_PuPd=GPIO_PuPd_NOPULL;
	GPIO_Init(GPIOD,&lcd_port);

	GPIO_ResetBits(GPIOB,GPIO_Pin_4 | GPIO_Pin_5);
	GPIO_ResetBits(GPIOD,GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3);

	delayms(20);

	GPIO_SetBits(GPIOB,GPIO_Pin_5);

    lcd_veri(0x03); // Lcd Reset
    lcd_sil();
    lcd_veri(40);   // 2 satır kullanacağımızı yazdık
    lcd_veri(15);   // Display i aç
    lcd_veri(0x06); // Kursör 1 artan modda.
    lcd_sil();	    //
	lcd_veri(128);

}

void lcd_veri(unsigned char veri)
{
   GPIO_ResetBits(GPIOB,GPIO_Pin_4); 
   GPIO_SetBits(GPIOB,GPIO_Pin_5);
	delayms(10);

    GPIO_Write(GPIOD,(veri & 0xF0)>>4); 
    GPIO_ResetBits(GPIOB,GPIO_Pin_5);
	 delayms(1);
	 GPIO_SetBits(GPIOB,GPIO_Pin_5);  
	  delayms(1);

	  GPIO_Write(GPIOD,((veri & 0x0F)));
	  GPIO_ResetBits(GPIOB,GPIO_Pin_5);
	  delayms(10);
}

void lcd_git(unsigned char p1,unsigned char p2)
{
    if (p1==1)
	{
	 lcd_veri(0x80+(p2-1));
	
	}
    else
	{
	    lcd_veri(0xC0+(p2-1));
		
		}
}

void lcd_yaz(unsigned char *lcd_data)
{
    delayms(10);
    while(*lcd_data)  yaz(*lcd_data++);
}

void yaz(unsigned  dat)
{
	 GPIO_SetBits(GPIOB,GPIO_Pin_4);
	 GPIO_SetBits(GPIOB,GPIO_Pin_5);
	 delayms(10);

    GPIO_Write(GPIOD,dat=(dat & 0xF0)>>4); 
    GPIO_ResetBits(GPIOB,GPIO_Pin_5);
	 delayms(1);
	 GPIO_SetBits(GPIOB,GPIO_Pin_5);
	 delayms(1);

	 GPIO_Write(GPIOD,dat=((dat & 0x0F)));
	 GPIO_ResetBits(GPIOB,GPIO_Pin_5);
}
void lcd_sil(void)
{
    lcd_veri(1);
    delayms(10);
}

void lcd_imlec_yok(void)
{
    lcd_veri(0x0C);
    delayms(10);
}

void lcd_imlec_var(void)
{
 	lcd_veri(0x0F);
    delayms(10);
}


main.c
#include "stm32f4xx.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_rcc.h"
#include  "stm32f4xx_adc.h"
#include   "lcd.h"
#include  "Delay.h"



int main(void)
{
 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE);
 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);
   SystemInit();



lcd_init();
lcd_yaz("lcd kontrol123");

    while(1)
    {


    }
}


lcd ye " lcd kontrol123"  yazdığımda  "fff"fffwwff333 " çıkıyor.bu konuda daha yeni olduğumdan sorunun  neyde kaynaklandığını anlayamadım pek.

Görünmez bir mezarlıktır Zaman...

sseedat

Yukarda paylaştığım lcd örneğinin sorununu çözdüm
sorun  GPIO_Write....gibi ifadeleri   GPIOD->ODR ...; ile değiştirdiğimde sorun çözüldü

şimdilik lcd çalışıyor:)
Görünmez bir mezarlıktır Zaman...

mir_as82

LCD te yazma programini kendiniz mi yazdiniz yoksa. Hazir kutuphane mevcut mu?

Kendiniz yazdiysaniz kodlari kisaca açıklar mısınız?

muhittin_kaplan

Alıntı yapılan: sseedat - 16 Aralık 2013, 00:59:53
Yukarda paylaştığım lcd örneğinin sorununu çözdüm
sorun  GPIO_Write....gibi ifadeleri   GPIOD->ODR ...; ile değiştirdiğimde sorun çözüldü

şimdilik lcd çalışıyor:)
Garip bir durum. Zaten kendiside onu yapıyor. (GPIO->ODR yi kütüphanenin içeriğinde yapıyor)

X-Fi

Sorunun temeli hız farkı ile alakalı  GPIO_Write() bir alt fonksiyondur. GPIO->ODR ise işlemcide register adresine karşılık gelir.

CMSIS tanımlamalarını direk veya kendiniz define tanımlayıp kullanırsanız. GPIO_Write() fonksiyonundan daha az kod üretilir.
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)