STM32 miniDev, GPIO Uygulaması

STM32 miniDev’de PB8 ve PB9 pinleri JP7 konnektörüyle kullanıcı uygulamaları için dışarı verilmiş olmasının yanı sıra sırasıyla DS2 ve DS3 LED’lerine de bağlanmıştır. Bu uygulamada DS2 LED’i sürekli yanmakta, DS3 LED’i de flash yapmaktadır. uVision4′te Project -> New uVision Project seçilerek yeni bir proje yaratılır. Proje yaratılırken, projenin hangi klasöre kaydedileceği ve proje adı girilir. Ardından işlemci seçilir (STM32F103C8). Daha sonra uVision4 startup kodunu projeye dahil etmek isteyip istemediğimizi sorar, buna OK dediğimizde yeni proje STM32F10x.s dosyasıyla açılmış olur. GPIO uygulamasında ..\Keil\ARM\Boards\Keil\MCBSTM32\Blinky projesi referans alınmıştır. Bu proje içerisinden STM32_Init.c, STM32_Init.h, STM32_Reg.h yeni oluşturulan projeye dahil edilir. Bu uygulamada GPIO_main.c projenin main kısmı olarak oluşturularak projeye dahil edilir. Kaynak kodları projeye dahil etmek için menüden Project -> Manage -> Components, Environment, Books… kullanılır.

Project -> Options for Target ile donanım ve yazılımla ilgili gerekli ayarlar yapılır. STM32 miniDev’de 4MHz kristal kullanıldığından aşağıdaki resimdeki gibi bu değer girilir.

GPIO uygulamasında PB8 ve PB9′a bağlı LED’leri kontrol etmek için bu pinleri output olarak seçmek gerekir. Seçim işlemi STM32_Init.c kaynak kodunda Configuration Wizard sekmesinden yapılabilir. Aşağıdaki resimde görüldüğü gibi PB8 ve PB9 output yapılmıştır. Diğer pinler bu uygulamada bizim için önemli olmadığından dikkate almaya gerek yoktur. Configuration Wizard’la ayrıca clock, usart, timer, vs. ayarları yapmak mümkündür.

Uygulamaya ait yazılım

5 thoughts on “STM32 miniDev, GPIO Uygulaması

  1. merhabalar, çok yararli çalişmalar ve basit anlaşilir anlatiminiz var sitenizi çok yararli buldum, burda verdiğiniz program sayesinde keil de bişeyler anlamaya başladim, acaba şöyle biraz geliştirsek bloğu,

    #define PIN_B7 (1 <ODR = (GPIOB->ODR & ~PIN_B7) | (x ? PIN_B7 : 0);

    yukarda out tanimlamasi gibi acaba input nasil yanimlayabiliriz?

    • Merhaba,
      Input tanimlamayla ilgili küçük bir fonksiyon kullanılabilir. İlgili Keil örneğini biraz sadeleştirirsek:

      #define S2     0x0001    // PA0 : S2
      /*----------------------------------------------------------------------------*/
      int S2Pressed (void)
      {
        static int S2KeyPressed = 0;

        if (S2KeyPressed)
        {
         if (!((GPIOA->IDR & S2) == 0 ))    // Check if S2 is not pressed
           S2KeyPressed = 0;
        }
        else
        {
          if (((GPIOA->IDR & S2) == 0 ))    // Check if S2 is pressed
          {
            S2KeyPressed = 1;  
            return (1);
          }
        }
        return (0);
      }
      /*----------------------------------------------------------------------------*/

      Bu fonksiyonu S2Pressed() şeklinde çağırırsak ve PA0′a bağlı S2 butonu basıldıysa bize “1″ değerini
      geri dönüş değeri olarak verir.

  2. evt örnek çok basit ve güzel yeni başlayanlarin anlayacaği türden ..katki sağlamak açisindan bende bir örnek ekliyorum, deneyip çaliştirdim.

    #define BUTON                 (GPIOD->IDR & 0×0001) /* pORTD_0 */
    #define GPIO_1(x)             GPIOB->ODR = (GPIOB->ODR & ~PIN_B8) | (x ? PIN_B8 : 0);
    #define GPIO_2(x)             GPIOB->ODR = (GPIOB->ODR & ~PIN_B9) | (x ? PIN_B9 : 0);
    #define PIN_B8                (1 << 8)
    #define PIN_B9                (1 << 9)
    /*******************************************************************************
    *   DELAY FUNCTION                                                             *
    *******************************************************************************/

    static void delay_for_main (int cnt)
    {
      int i;
     
      while (cnt--)
      {
        for (i = 0; i &lt; 1000; i++);
      }
    }
    /*******************************************************************************
    *   MAIN FUNCTION                                                              *
    *******************************************************************************/

    int main (void)
    {
      stm32_Init ();
      delay_for_main(5000);

      while (1)
      {
        if (BUTON == 1)
        {    
          delay_for_main(5000);
          GPIO_1(1)
          delay_for_main(2000);  
          GPIO_1(0)
        }
      }
    }
  3. keil içinde birçok örnek var fakat sizin kodlama mantiğiniz çok öğretici geldi bana, şuanda ds18b20 isi sensöründen bilgi okumaya çalişiyorum, elimde hazir örnek var ve çalişiyor fakat internal kesmeler olduğu için karişik geldi (şimdilik) acaba bu sensör için sizin kurmuş olduğunuz basit ve anlaşilir bir kod varmidir elinizde…

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>