LPC176x icin GPIO headerı insallah yararlı olur kullanmak istiyenlere

Başlatan toprak6834, 23 Şubat 2013, 16:31:26

toprak6834

Arkadaşlar merhaba LPC176x icin bi header yazdım cogu programcı icin gereksiz olabilir ben sadece kendimi geliştirmek için yazdım kullanmak istiyen yada kodlarını inceliyip belki bi ihitmal bilmedigi bişeyi ögrenen birileri olur diye buraya ekliyorum ben bu siteden çok şey ögrendim elimdim geldigincede buraya bişeyler eklemek istiyorum..
kulanımı çok basit GPIOSR.h ı projenize ekliyorsunuz

GPIOR(P021);//bu fonksiyon ile port0 rın 21. pini resetleniyo örnegin P215 olsaydı PORT2 nin 15. pini resetlenecekti
GPIOS(P021);//bu fonksiyon ile setleniyo.

////header dosyası

#ifndef GPIOSR_H_
#define GPIOSR_H_

//PORT 0 tanimlamalari P012,P013,P014,P027,P028,P031 GPIO için kullanilmiyor

#define P000 000
#define P001 010
#define P002 020
#define P003 030
#define P004 040
#define P005 050
#define P006 060
#define P007 070
#define P008 080
#define P009 090
#define P010 100
#define P011 110
#define P015 150
#define P016 161
#define P017 171
#define P018 181
#define P019 191
#define P020 201
#define P021 211
#define P022 221
#define P023 231
#define P024 241
#define P025 251
#define P026 261
#define P029 291
#define P030 301

//PORT 1 tanimlamalari P1.02,P1.03,P1.05,P1.06,P1.07,P1.11,P1.12,P1.13 GPIO için kullanilmiyor

#define P100 002
#define P101 012
#define P104 042
#define P108 082
#define P109 092
#define P110 102
#define P114 142
#define P115 152
#define P116 163
#define P117 173
#define P118 183
#define P119 193
#define P120 203
#define P121 213
#define P122 223
#define P123 233
#define P124 243
#define P125 253
#define P126 263
#define P129 293
#define P130 303
#define P131 313

//PORT 2 tanimlamalari P2.14 dahil sonrasý GPIO için kullanilmiyor

#define P200 004
#define P201 014
#define P202 024
#define P203 034
#define P204 044
#define P205 054
#define P206 064
#define P207 074
#define P208 084
#define P209 094
#define P210 104
#define P211 114
#define P212 124
#define P213 134

//PORT 3 tanimlamalari P3.25 ve P3.26 haric geri kalan GPIO için kullanilmiyor

#define P325 257
#define P326 267

//PORT 4 tanimlamalari P4.28 ve P4.29 haric geri kalan GPIO için kullanilmiyor

#define P428 289
#define P429 299

//fonksiyon tanimlamalari

void GPIOS(uint16_t var);
void GPIOR(uint16_t var);

#endif

/////c dosyası

#include <LPC17xx.h>
#include <stdio.h>
#include "GPIOSR.h"

void GPIOS(uint16_t var)
{
volatile int pinselnum,pinonlar,pinbirler,kalan,kayma_sayisi;
   /*
   oncelikle GPIOS fonksiyonuna P015 (var degiskeni) girdi diyelim P015 nin degeri header dosyasinda degeri 150 olarak
   atanmis bu degeri okurken soyle okuyorum birker basamagi PINSEL numarasi yuzler ve onlar basamagi hangi pin oldugu
   yani biz ornek olarak 150 aldik bu ne demek PINSEL0 ve 15. pin demek bölme islemleri yüzler onlar ve birler basamagini
   ayiriyor kayma_sayisi sayisi onlar ve birler basamagi olmak üzere tekrar olurturuyor orenegin biz 150 sayisini yuzler=1
   onlar=5 birler=0 diye ayirdik PINSEL numarasi birler basamagi yani 0 pin no 15 olmasi lazim oda kayma_sayisi=10*yuzler+onlar
   olarak buluyoruz.
   */
   pinonlar=var/100;
   kalan=var%100;
   pinbirler=kalan/10;
   pinselnum=kalan%10;
   kayma_sayisi=10*pinonlar+pinbirler;
   
if(pinselnum==0)
{
   /*
   Simdi buradaki kod su islemi yapiyor yukarida ornek olara 150 almistik kayma_sayisi=15 di.buna göre 2*kayma_sayisi=30 ve
   2*kayma_sayisi+1=31 bunlar ne demek derseniz biz 15 pini GPIO olarak ayarlamak için PINSEL0 rin 30. ve 31. bitlerine 0
   yazmamiz gerekiyo bunlar bit numaralari.Simdi bit numaralarini bulduk 1 sayisini bu bit numaralari kadar sola kaydirip
   orlarsak eger elimizde 0xC0000000 sayisi olur (15. pin icin) ve bu sayinin değilini alirsak 0x3FFFFFFF bunu PINSEL0 rin
   eski degeri ile andlersek 30. ve 31. bit sifir olur ikinci islem FIODIR 15. bitini 1 yaparsak 15. pin cikis olur ve FIOSET in
   15. bitini bir yaparsak 15.pin setlerin bunlar için kayma_sayisi zaten 15 di 1 sayisini 15 sola kaydirip eski degerle orlarsak
   bu islemlerde hal olur.
   */
   LPC_PINCON->PINSEL0 &= ~((1<<(2*kayma_sayisi))|(1<<(2*kayma_sayisi+1)));
   LPC_GPIO0->FIODIR |=(1<<kayma_sayisi);
   LPC_GPIO0->FIOSET |=(1<<kayma_sayisi);   
}
if(pinselnum==1)
{
   /*
   kayma_sayisindan 16 çikarmamin sabebi söyle anlatiyim 25. pini aktif edidez diyelim 25*2=50 ediyor 32 yi geciyor
   yukaridaki anlatilanlarin hepsi 0-15 icindi bu yüzden 16 çikariyorum geri kalanlar ayni.
   */
   kayma_sayisi=kayma_sayisi-16;
   LPC_PINCON->PINSEL1 &= ~((1<<(2*kayma_sayisi))|(1<<(2*kayma_sayisi+1)));
   LPC_GPIO0->FIODIR |=(1<<kayma_sayisi);
   LPC_GPIO0->FIOSET |=(1<<kayma_sayisi);   
}
if(pinselnum==2)
{
   LPC_PINCON->PINSEL2 &= ~((1<<(2*kayma_sayisi))|(1<<(2*kayma_sayisi+1)));
   LPC_GPIO1->FIODIR |=(1<<kayma_sayisi);
   LPC_GPIO1->FIOSET |=(1<<kayma_sayisi);   
}
if(pinselnum==3)
{
   kayma_sayisi=kayma_sayisi-16;
   LPC_PINCON->PINSEL3 &= ~((1<<(2*kayma_sayisi))|(1<<(2*kayma_sayisi+1)));
   LPC_GPIO1->FIODIR |=(1<<kayma_sayisi);
   LPC_GPIO1->FIOSET |=(1<<kayma_sayisi);
}
if(pinselnum==4)
{
   LPC_PINCON->PINSEL4 &= ~((1<<(2*kayma_sayisi))|(1<<(2*kayma_sayisi+1)));
   LPC_GPIO2->FIODIR |=(1<<kayma_sayisi);
   LPC_GPIO2->FIOSET |=(1<<kayma_sayisi);
}
if(pinselnum==7)
{
   kayma_sayisi=kayma_sayisi-16;
   LPC_PINCON->PINSEL7 &= ~((1<<(2*kayma_sayisi))|(1<<(2*kayma_sayisi+1)));
   LPC_GPIO3->FIODIR |=(1<<kayma_sayisi);
   LPC_GPIO3->FIOSET |=(1<<kayma_sayisi);
}
if(pinselnum==9)
{
   kayma_sayisi=kayma_sayisi-16;
   LPC_PINCON->PINSEL9 &= ~((1<<(2*kayma_sayisi))|(1<<(2*kayma_sayisi+1)));
   LPC_GPIO4->FIODIR |=(1<<kayma_sayisi);
   LPC_GPIO4->FIOSET |=(1<<kayma_sayisi);
}
}

void GPIOR(uint16_t var)
{
   volatile int pinselnum,pinonlar,pinbirler,kalan,kayma_sayisi;

   pinonlar=var/100;
   kalan=var%100;
   pinbirler=kalan/10;
   pinselnum=kalan%10;
   kayma_sayisi=10*pinonlar+pinbirler;
   
if(pinselnum==0)
{
   LPC_PINCON->PINSEL0 &= ~((1<<(2*kayma_sayisi))|(1<<(2*kayma_sayisi+1)));
   LPC_GPIO0->FIODIR |=(1<<kayma_sayisi);
   LPC_GPIO0->FIOCLR |=(1<<kayma_sayisi);   
}
if(pinselnum==1)
{
   kayma_sayisi=kayma_sayisi-16;
   LPC_PINCON->PINSEL1 &= ~((1<<(2*kayma_sayisi))|(1<<(2*kayma_sayisi+1)));
   LPC_GPIO0->FIODIR |=(1<<kayma_sayisi);
   LPC_GPIO0->FIOCLR |=(1<<kayma_sayisi);   
}
if(pinselnum==2)
{
   LPC_PINCON->PINSEL2 &= ~((1<<(2*kayma_sayisi))|(1<<(2*kayma_sayisi+1)));
   LPC_GPIO1->FIODIR |=(1<<kayma_sayisi);
   LPC_GPIO1->FIOCLR |=(1<<kayma_sayisi);   
}
if(pinselnum==3)
{
   kayma_sayisi=kayma_sayisi-16;
   LPC_PINCON->PINSEL3 &= ~((1<<(2*kayma_sayisi))|(1<<(2*kayma_sayisi+1)));
   LPC_GPIO1->FIODIR |=(1<<kayma_sayisi);
   LPC_GPIO1->FIOCLR |=(1<<kayma_sayisi);
}
if(pinselnum==4)
{
   LPC_PINCON->PINSEL4 &= ~((1<<(2*kayma_sayisi))|(1<<(2*kayma_sayisi+1)));
   LPC_GPIO2->FIODIR |=(1<<kayma_sayisi);
   LPC_GPIO2->FIOCLR |=(1<<kayma_sayisi);
}
if(pinselnum==7)
{
   kayma_sayisi=kayma_sayisi-16;
   LPC_PINCON->PINSEL7 &= ~((1<<(2*kayma_sayisi))|(1<<(2*kayma_sayisi+1)));
   LPC_GPIO3->FIODIR |=(1<<kayma_sayisi);
   LPC_GPIO3->FIOCLR |=(1<<kayma_sayisi);
}
if(pinselnum==9)
{
   kayma_sayisi=kayma_sayisi-16;
   LPC_PINCON->PINSEL9 &= ~((1<<(2*kayma_sayisi))|(1<<(2*kayma_sayisi+1)));
   LPC_GPIO4->FIODIR |=(1<<kayma_sayisi);
   LPC_GPIO4->FIOCLR |=(1<<kayma_sayisi);
}
}

toprak6834

arkadaşlar hangi pini yazarsanız fonksiyonun içine sadece o pin çıkış olarak ayarlanıp setleniyo veya resetleniyo diger pinler sebest kalıyo...

haydarpasamikro

Emeğinize sağlık. Ancak keil nxp code bundles a bakacak olursak:

void GPIOSetDir( uint32_t portNum, uint32_t bitPosi, uint32_t dir )
{
  if(dir)
   LPC_GPIO[portNum]->DIR |= 1<<bitPosi;
  else
   LPC_GPIO[portNum]->DIR &= ~(1<<bitPosi);
}


void GPIOSetValue( uint32_t portNum, uint32_t bitPosi, uint32_t bitVal )
{
  LPC_GPIO[portNum]->MASKED_ACCESS[(1<<bitPosi)] = (bitVal<<bitPosi);
}


Programcılıkta anlaşılabilirlik, esneklik, taşınabilirlik, sadelik, yazım stilindeki alışılagelmişlikleri de önemlidir.
Mikro Dünyası.Haydarpaşa Teknik ve Endüstri Meslek Lisesi Mikrodenetleyici Atl. Şefi

toprak6834

hocam söylediklerinizde çok haklısınız ... teşekkürler yorumunuz icin