Dersler

View on GitHub

EEM-465 Gömülü Sistemler

2022-2023 Güz Dönemi Ders 4

RCC_AHB1 yazmacı için makro tanımlama

#define RCC_AHB1ENR (*((int*)0x40023830))
int main(){
  RCC_AHB1ENR |= 1<<3;
}

LED yakmak için gereki bilgiler

  1. GPIO portları AHB1 veri yoluna bağlıdır. Bundan dolayı RCC’nin AHB1’le ilgili yazmacında kullanacağımız GPIO birimini etkinleştirmemiz gerekiyor.
    • Kart üzerindeki LEDler D portunun 12, 13, 14 ve 15. pinlerine bağlıdır.
    • RCC_AHB1ENR yazmacında D portunu etkinleştirmek için bu yazmacın 3. biti set edilir.
    • RCC’nin başlangıç adresi 0x40023800
    • RCC_AHB1ENR yazmacının ofseti (göreceli adresi) 0x30 dolayısıyla bu yazmacın adresi 0x40023830
  2. Örneğin 13. pine bağlı olan LEDi yakalım (PD13). Bu pinin modunu output olarak ayarlamak gerekiyor.
    • GPIOD’nin başlangıç adresi: 0x4002 0C00
    • MODER yazmacının ofseti 0’dır. Dolayısıyla D portunun MODER yazmacının adresi 0x4002 0C00
    • MODER yazmacında ilgili alana 00 yazılırsa pin input moduna ayarlanır. 01 yazılırsa output moduna ayarlanır.
    • D portunun MODER yazmacının reset değeri 0 olduğu için, 13. pini output modunda ayarlamak için 26. biti 1 yapmak yeterlidir.
  3. LEDi yakmak için ODR yazmacında 13. biti set etmek gerekli.
    • Bu yazmacın ofseti 0x14 olduğundan yazmacın bellekteki adresi 0x4002 0C14

LED yakma programı

13 ve 14. pine bağlı LED’i yakmak için

int main(void){
	
  (*((int*)0x40023830	)) |=  1<<3;

  (*((int*)0x40020C00	)) |=  1<<26;
  (*((int*)0x40020C00	)) |=  1<<28;
	
  (*((int*)0x40020C14)) |= 1<<13;
  (*((int*)0x40020C14)) |= 1<<14;
}

15. pine bağlı LED’i yakmak için

#define RCC_AHB1ENR (*((int*)0x40023830))
#define GPIOD_MODER (*((int*)0x40020C00))
#define GPIOD_ODR (*((int*)0x40020C14))
int main(){
  RCC_AHB1ENR |= 1<<3;
  GPIOD_MODER |= 1<<30;
  GPIOD_ODR |= 1<<15;  
}

13. pine bağlı LED’i yakmak için

#define RCC_AHB1ENR  (*((int*)0x40023830))
#define GPIOD_MODER  (*((int*)0x40020C00))
#define GPIOD_ODR    (*((int*)0x40020C14))
int main(){  
  RCC_AHB1ENR |= 1<<3;
  GPIOD_MODER |= 1<<26;
  GPIOD_ODR |= 1<<13;
}

Derleyici optimizasyonunun kullanılmaması için volatile ifadesinin eklenmesi

#define RCC_AHB1ENR  (*((volatile int*)0x40023830))
#define GPIOD_MODER  (*((volatile int*)0x40020C00))
#define GPIOD_ODR    (*((volatile int*)0x40020C14))
int main(){
  volatile int i;
  RCC_AHB1ENR |= 1<<3;
  GPIOD_MODER |= 1<<26;
  while(1){  
    GPIOD_ODR |= 1<<13;
    for(i=0;i<1000000;i++);
    GPIOD_ODR &= ~(1<<13);
    for(i=0;i<1000000;i++);
  }
}

4 tane LEDi yakma söndürme v1

#define RCC_AHB1ENR  (*((volatile int*)0x40023830))
#define GPIOD_MODER  (*((volatile int*)0x40020C00))
#define GPIOD_ODR    (*((volatile int*)0x40020C14))
int main(){
  volatile int i;
  RCC_AHB1ENR |= 1<<3;
  GPIOD_MODER |= 1<<24;
  GPIOD_MODER |= 1<<26;
  GPIOD_MODER |= 1<<28;
  GPIOD_MODER |= 1<<30;
  while(1){
    GPIOD_ODR |= 1<<12;
    GPIOD_ODR |= 1<<13;
    GPIOD_ODR |= 1<<14;
    GPIOD_ODR |= 1<<15;
    for(i=0;i<1000000;i++);
    GPIOD_ODR &= ~(1<<12);
    GPIOD_ODR &= ~(1<<13);
    GPIOD_ODR &= ~(1<<14);
    GPIOD_ODR &= ~(1<<15);
    for(i=0;i<1000000;i++);
  }
}

4 tane LEDi yakma söndürme v2

#define RCC_AHB1ENR  (*((volatile int*)0x40023830))
#define GPIOD_MODER  (*((volatile int*)0x40020C00))
#define GPIOD_ODR    (*((volatile int*)0x40020C14))
int main(){
  volatile int i;
  RCC_AHB1ENR |= 1<<3;
  GPIOD_MODER |= 1<<24 | 1<<26 | 1<<28 | 1<<30 ;
  while(1){
    GPIOD_ODR |= 1<<12 | 1<<13 | 1<<14 | 1<<15 ;
    for(i=0;i<1000000;i++);
    GPIOD_ODR &= ~(1<<12 | 1<<13 | 1<<14 | 1<<15);
    for(i=0;i<1000000;i++);
  }
}

4 tane LEDi yakma söndürme v3

#define RCC_AHB1ENR  (*((volatile int*)0x40023830))
#define GPIOD_MODER  (*((volatile int*)0x40020C00))
#define GPIOD_ODR    (*((volatile int*)0x40020C14))
int main(){
  volatile int i, pin;
  RCC_AHB1ENR |= 1<<3;
  for(i=24;i<=30;i=i+2)
    GPIOD_MODER |= 1<<i;
  while(1){
    for(pin=12;pin<16;pin++)
      GPIOD_ODR |= 1<< pin;
    for(i=0;i<1000000;i++);
    for(pin=12;pin<16;pin++)
      GPIOD_ODR &= ~(1<<pin);
    for(i=0;i<1000000;i++);
  }
}

4 tane LEDi yakma söndürme v4

#define RCC_AHB1ENR  (*((volatile int*)0x40023830))
#define GPIOD_MODER  (*((volatile int*)0x40020C00))
#define GPIOD_ODR    (*((volatile int*)0x40020C14))
int main(){
  volatile int i, pin;
  RCC_AHB1ENR |= 1<<3;
  for(pin=12;pin<16;pin++)
    GPIOD_MODER |= 1<<pin*2;
  while(1){
    for(pin=12;pin<16;pin++)
      GPIOD_ODR |= 1<< pin;
    for(i=0;i<1000000;i++);
    for(pin=12;pin<16;pin++)
      GPIOD_ODR &= ~(1<<pin);
    for(i=0;i<1000000;i++);
  }
}

LEDleri sırayla yakma söndürme

#define RCC_AHB1ENR  (*((volatile int*)0x40023830))
#define GPIOD_MODER  (*((volatile int*)0x40020C00))
#define GPIOD_ODR    (*((volatile int*)0x40020C14))
int main(){
  volatile int i, pin;
  RCC_AHB1ENR |= 1<<3;
  for(pin=12;pin<16;pin++)
    GPIOD_MODER |= 1<<pin*2;
  while(1){
    for(pin=12;pin<16;pin++){
      GPIOD_ODR |= 1<< pin;
      for(i=0;i<1000000;i++);    
      GPIOD_ODR &= ~(1<<pin);
      for(i=0;i<1000000;i++);    
    }
  }
}

LEDleri sırayla yakma

#define RCC_AHB1ENR  (*((volatile int*)0x40023830))
#define GPIOD_MODER  (*((volatile int*)0x40020C00))
#define GPIOD_ODR    (*((volatile int*)0x40020C14))
int main(){
  volatile int i, pin;
  RCC_AHB1ENR |= 1<<3;
  for(pin=12;pin<16;pin++)
    GPIOD_MODER |= 1<<pin*2;
  while(1){
    for(pin=12;pin<16;pin++){
      GPIOD_ODR |= 1<< pin;
      for(i=0;i<1000000;i++);  
      GPIOD_ODR &= ~(1<<pin);          
    }
  }
}

LEDleri sırayla yakma, sırayla söndürme

#define RCC_AHB1ENR  (*((volatile int*)0x40023830))
#define GPIOD_MODER  (*((volatile int*)0x40020C00))
#define GPIOD_ODR    (*((volatile int*)0x40020C14))
int main(){
  volatile int i, pin;
  RCC_AHB1ENR |= 1<<3;
  for(pin=12;pin<16;pin++)
    GPIOD_MODER |= 1<<pin*2;
  while(1){
    for(pin=12;pin<16;pin++){
      GPIOD_ODR |= 1<< pin;
      for(i=0;i<500000;i++);      
    }
    for(pin=12;pin<16;pin++){
      GPIOD_ODR &= ~(1<<pin);
      for(i=0;i<500000;i++);      
    }
  }
}

Buton kontrollü, LEDleri sırayla yakma, sırayla söndürme

#define RCC_AHB1ENR  (*((volatile int*)0x40023830))
#define GPIOD_MODER  (*((volatile int*)0x40020C00))
#define GPIOD_ODR    (*((volatile int*)0x40020C14))
#define GPIOA_IDR    (*((volatile int*)0x40020010))
int main(){
  volatile int i, pin;
  RCC_AHB1ENR |= 1<<3 | 1<<0;
  for(pin=12;pin<16;pin++)
    GPIOD_MODER |= 1<<pin*2;
  while(1){
    if(GPIOA_IDR & 1<<0){
      for(pin=12;pin<16;pin++){
        GPIOD_ODR |= 1<< pin;
        for(i=0;i<500000;i++);      
      }
      for(pin=12;pin<16;pin++){
        GPIOD_ODR &= ~(1<<pin);
        for(i=0;i<500000;i++);      
      }
    }
  }
}

Yapı işaretçisi ile LED yakma söndürme

#define RCC_AHB1ENR (*((volatile int*)0x40023830))
#define GPIOD ((GPIO*)0x40020C00)
typedef struct{
  volatile int MODER;
  volatile int a;
  volatile int b;
  volatile int c;
  volatile int d;
  volatile int ODR;
} GPIO;
int main(){
  volatile int i, pin;
  RCC_AHB1ENR |= 1<<3;
  GPIOD->MODER |= 1<<30;
  while(1){
    GPIOD->ODR |= 1<<15;
    for(i=0;i<1000000;i++);
    GPIOD->ODR &= ~(1<<15);
    for(i=0;i<1000000;i++);
  }
}

Buton kontrollü LED yakma söndürme

#define RCC_AHB1ENR (*((volatile int*)0x40023830))
#define GPIOA_IDR   (*((volatile int*)0x40020010))
#define GPIOD ((GPIO*)0x40020C00)
typedef struct{
  volatile int MODER;
  volatile int a;
  volatile int b;
  volatile int c;
  volatile int d;
  volatile int ODR;
} GPIO;
int main(){
  volatile int i, pin;
  RCC_AHB1ENR |= 1<<3 | 1<<0;
  GPIOD->MODER |= 1<<30;
  while(1){
    if(GPIOA_IDR & 1<<0){
    GPIOD->ODR |= 1<<15;
    for(i=0;i<1000000;i++);
    GPIOD->ODR &= ~(1<<15);
    for(i=0;i<1000000;i++);
    }
  }
}

A ve D portunun yapı işaretçisi ile kullanımı, buton kontrollü LED yakma söndürme

#define RCC_AHB1ENR (*((volatile int*)0x40023830))
#define GPIOA_IDR   (*((volatile int*)0x40020010))
#define GPIOD ((GPIO*)0x40020C00)
#define GPIOA ((GPIO*)0x40020000)
typedef struct{
  volatile int MODER;
  volatile int a;
  volatile int b;
  volatile int c;
  volatile int IDR;
  volatile int ODR;
} GPIO;
int main(){
  volatile int i, pin;
  RCC_AHB1ENR |= 1<<3 | 1<<0;
  GPIOD->MODER |= 1<<30;
  while(1){
    if(GPIOA->IDR & 1<<0){
      GPIOD->ODR |= 1<<15;
      for(i=0;i<1000000;i++);
      
      GPIOD->ODR &= ~(1<<15);
      for(i=0;i<1000000;i++);
    }
  }
}

A ve D portunun yapı işaretçisi ile kullanımı, buton kontrollü sıra ile LED yakma sıra ile LED söndürme

#define RCC_AHB1ENR  (*((volatile int*)0x40023830))
#define GPIOD    ((GPIO*)0x40020C00)
#define GPIOA    ((GPIO*)0x40020000)
typedef struct{
  volatile int MODER;
  volatile int a;
  volatile int b;
  volatile int c;
  volatile int IDR;
  volatile int ODR;
}GPIO;
int main(){
  volatile int i, pin;
  RCC_AHB1ENR |= 1<<3 | 1<<0;
  for(pin=12;pin<16;pin++)
    GPIOD->MODER |= 1<<pin*2;
  while(1){
    if(GPIOA->IDR & 1<<0){
      for(pin=12;pin<16;pin++){
        GPIOD->ODR |= 1<< pin;
        for(i=0;i<500000;i++);      
      }
      for(pin=12;pin<16;pin++){
        GPIOD->ODR &= ~(1<<pin);
        for(i=0;i<500000;i++);      
      }
    }
  }
}