STM32 için İLK UYGULAMA Blue Pill Modülünde PC13 ledinin yakılması ve değişken takibi

 bu en temel proje olduğu için her adımı detaylı açıklamakta faydalı olacaktır.

ilk önce projemiz için new project diyoruz.




Arama kısmına F103C8T6 yazdığımız zaman aradığımız işlemci tipi ekranımıza çıkmaktadır. Kendi tercihimize yıldız atıp favorilere ekleyerek de daha sonra her seferinde arama yapma ihtiyacından kurtulmuş olmaktayız. Çıkan ekrana projemizin adını girdiğimiz takdirde Finish diyerek projemiz için boş şablon oluşmaktadır.



Projemizin SYS ayarları:

System Core > SYS > Debug > Serial Wire


Projemizin Clock ayarları: 8 Mhz HSE > PLLCLK > 72 Mhz





GPIO ayarları:



Sol tık ile PC-13 pinin seçiyoruz. Pini nasıl konfigüre etmek istediğimize dair seçenekler çıkıyor. Burada GPIO Output seçerek PC13 pinini kullanıma hazır hale getiriyoruz.

Ardından Ctrl + S bastığımız zaman projemiz STM32CubeIDE programı ile tekrardan güncellenecektir. Core > src > main.c bizim ana kodumuzu yazacağımız yere geliyoruz.




Biz istiyoruz ki PC13 pinine bağlı bir LED 500 milisaniye aralıklarla yanıp sönsün. Bu işlem için While(1) döngümüzün içine HAL_GPIO_TogglePin fonksiyonu ile ledi yakıp söndürmekteyiz.

/* USER CODE BEGIN WHILE */

  while (1)

  {

         HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);

    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */

  }

 /* USER CODE END 3 */

Kod bloğumuzu yazdıktan sonra

Debug için ST-Link ve STM bağlantısı

 


Debug etmek için Debug butonuna basıyoruz. Karşımıza çıkan ekranda ise Apply ardından da Ok diyerek Kod atma işlemini gerçekleştirmeye başlıyoruz.



Debug ettikten sonra sistemin kendi otomatik kesmesi olarak HAL_init(); fonskiyonunda durmaktadır. F8 Resume ile devam edebilmekte, Ctrl + F2 ile Terminate ederek durdurabilmekte ve Disconnect butonuyla da arayüzümüzün kodumuzla olan bağlantıyı kesebilmekteyiz. Step Into F5 ile kesmeye girdiği fonksiyonun da içine giriyorken, Step Over F6 ile de fonksiyonu adım adım tamamlayarak çalışmaktadır. Bu hata ayıklamak için oldukça işimize yaramaktadır.



Resume dediğimiz anda ise fonksiyonumuz kesintisiz olacak bir biçimde çalışacaktır. Fakat yazdığımız kodda bir eksik vardır. Herhangi bir delay fonksiyonu eklemediğimizden ötürü kodumuz beklemeye girmeden açma kapama gerçekleştirecek ve bundan dolayı da açıp kapandığı takip edemeyeceğiz. Bu durumda HAL_Delay(500); kod satırı ekleyerek Toggle komutundan sonra yarım saniyelik bir bekleme süresini koda dahil etmekteyiz.

Artık yeni kod bloğumuz aşağıdaki gibi olmaktadır. Bu sayede ilk başarılı Led uygulamamızı gerçekleştirmiş olduk.

Burada önemli bir bilgilendirme yapmakta fayda var; HAL_Delay() fonksiyonu içerisinde yazan sayının 1 fazlası kadar milisaniye değerinde gecikme yapar yani;
HAL_Delay(0); // 1 milisaniye gecikme
HAL_Delay(1); // 2 milisaniye gecikme yapar.
HAL_Delay(500); // 501 milisaniye gecikme yapar.

  /* Infinite loop */

  /* USER CODE BEGIN WHILE */

  while (1)

  {

         HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);

         HAL_Delay(500);

    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */

  }

  /* USER CODE END 3 */

Bu kod bloğu ile GPIO pin durumu 1 ise 0, 0 ise 1’e dönüştürülür. Fakat alternatif bir yöntem olarak da

Aynı işlem aşağıdaki kod ile de yapılabilir.

  /* Infinite loop */

  /* USER CODE BEGIN WHILE */

  while (1)

  {
         HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);
         HAL_Delay(500);
         HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);
         HAL_Delay(500);
    
/* USER CODE END WHILE */
    /* USER CODE BEGIN 3 */
  }
  
/* USER CODE END 3 */

Kod üzerinde değişiklik yapıldıktan sonra CTRL + B ile Build ederek kodumuzu güncelleyebilmekteyiz. İlk uygulama ile beraberinde değer takibinin nasıl gerçekleştirilebildiğini takip edebilmek için RAM bellekte değer kaydetmemiz gerekmektedir.

/* USER CODE BEGIN 0 */

uint32_t degisken = 0;

uint8_t ledvalue;

/* USER CODE END 0 */

  /* USER CODE BEGIN WHILE */

  while (1)

  {

         HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);

         degisken = degisken + 1;

         HAL_Delay(499);

         if (degisken > 1000) {degisken = 0; }

         ledvalue = HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13);

    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */

  }

  /* USER CODE END 3 */

CTRL + B ile Build ederek kodumuzu güncelleyebilmekteyiz. Daha sonra Debug işlemini başlattıktan sonra HAL_Init fonksiyonunda otomatik kesmeye giren hata ayıklama modumuzun devam etmesi için F8 Resume’ye basıyoruz. Burada hem Led pinimiz olarak programladığımız C13 pinimizin durumu hem de her yarım saniyede 1 değeri artan ‘degisken’ isimli global değişkenimizin  durumunu takip edebilmek amacıyla Live Expressions sekmesine ihtiyaç duyulmakta.



Add new expression ile okumak istediğimiz global değişkenimizi yazmamız gerekmekte.



Resume dediğimiz takdirde değerler kendi kendine değişecektir.



Burada dikkat edilmesi gereken esas noktalardan biri gerçek zamanlı olarak takip etmek istediğimiz değişkenin User Code Begin 0 ve User Code End 0 başlıklar arasında yazılması gerektiğidir. Void main fonksiyonunun içerisine yazılan değişkenler Live expression sekmesinden takip edilemez.


Yorumlar