stm32f10x.gpio.h kütüphanesindeki fonksiyon

Başlatan ido2323, 08 Kasım 2016, 16:35:13

ido2323

Hayırlı günler "stm32f10x.gpio.h" kütüphanedeki fonksiyonları anlamaya çalışıyorum, bazıları rahat bazıları zor anlaşılıyor. Aşağıdaki fonksiyonu rica etsem biri açıklayabilir mi?

void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);

Örnek kullanım;
GPIO_Init(GPIOA, &GPIO_InitStructure);

Anlamadığım kısım burada GPIO_TypeDef* , "*" işareti, "&" işareti

Teşekkürler.

typedef struct
{
  __IO uint32_t CRL;
  __IO uint32_t CRH;
  __IO uint32_t IDR;
  __IO uint32_t ODR;
  __IO uint32_t BSRR;
  __IO uint32_t BRR;
  __IO uint32_t LCKR;
} GPIO_TypeDef;

Zoroaster

GPIO dediğimiz I/O birimi pek çok registere sahip.

Örneğin

GPIOA için GPIOA_CRL, GPIOA_CRH, GPIOA_IDR.....
GPIOB için GPIOB_CRL, GPIOB_CRH, GPIOB_IDR.....

Rehber dokumana bakarsan A,B,C ... birbirinin aynı özelliklerde registerlerden oluşuyor, sadece  adresleri değişik.

Adamlar herbir GPIO registerlerini bir araya getirelim demişler ve bu amaçla bir structure yapısı oluşturmuşlar ve buna GPIO_TypeDef adını vermişler.

Bu yapıyı istediğimiz herhangi bir GPIO'ya sıvadıkmı artık o GPIO'ya bu yapı üzerinden erişiriz demişler.

Bu durumda aşağıdaki gibi init fonksiyonunu çağırdığında init fonksiyonuna iki şey bildirmen gerekiyor.

1) Bu registerlere yerleşecek verilerin saklı olduğu değişken (ki bu da bir structure)
2) A,B,C,.. den hangisi init edilecek (adresi)

GPIO_Init(GPIOA, &GPIO_InitStructure);

Yukarıdaki yazım şeklinde GPIOA adındaki structure GPIO_InitStructure değişkenindeki değerler yazılacak imiş.

Buradaki & sembolü GPIO_InitStructure'ın adresidir.

void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);

Yukarıdaki yazımda GPIO_TypeDef*  ifadesindeki * sembolü bir pointerdir diyor. Pointerin nasıl bir datayı gösterdiği ise GPIO_TypeDefE2 bakarak anlaşılır.

Bunu da zaten aşağıdaki gibi vermiştin.

typedef struct
{
  __IO uint32_t CRL;
  __IO uint32_t CRH;
  __IO uint32_t IDR;
  __IO uint32_t ODR;
  __IO uint32_t BSRR;
  __IO uint32_t BRR;
  __IO uint32_t LCKR;
} GPIO_TypeDef;

Bu konuda C ile ilgili şamatalar başlığında açıklamalar olacaktı. Konuyu takip edersen pointer, structure yapılarını göreceksin. Daha üstlerde de type casting konusunu ele almıştık.

https://www.picproje.org/index.php/topic,35908.msg257078.html#msg257078

Sonuçta bazı değişkenleri belli bir düzene göre alt alta sıralarsan bu registerlere sadece ilk registerin adresini bilerek ulaşabilirsin. Mantık bu.

* ile değişkenimizin bir pointer olduğunu, & ile de adresi belirtiyoruz.

Seytan deliginden kacti.

ido2323

Teşekkür ederim,  eksikleri çalışıp gidermeye devam edeceğiz;
http://boredzo.org/pointers/