Stm32f4 buton uygulaması hakkında

Başlatan l0rd, 19 Mart 2015, 22:05:26

l0rd

Merhaba ;

https://www.picproje.org/index.php/topic,35896.0.html  Bu konudaki 2. Program ( Buton uygulaması ) hakkında bir sorum var.

Ledleri çıkış olarak aşağıdaki gibi tanımladık ve gerekli ayarları yaptık fakat buton hakkında bir ayar niye yapmadık.Mesela butonu giriş yapmak gibi bir ayar ?

RCC->AHB1ENR |= 0x0000000F;    // GPIO A,B,C,D clock'u aktif edelim
GPIOD->MODER = 0x55000000;     // GPIOD nin 15, 14, 13, 12 pinleri cikis tanimlandi (LEDler icin)
GPIOD->OSPEEDR= 0xFFFFFFFF;    // GPIOD nin tum cikislari en yuksek hizda kullanacagiz

Program bu ( Yeniden sekme açmamanız için )
#include "STM32F4xx.h"

void SystemInit()
{
unsigned int i;

    (*((int*)0xE000ED88))|=0x0F00000;  
    for (i=0;i<0x00100000;i++);          // OSC oturtma ve kurtarma rutini
    RCC->CFGR |= 0x00009400;         // AHB ve APB hizlarini max degerlere set edelim
    RCC->CR |= 0x00010000;            // HSE Xtal osc calismaya baslasin        
    while (!(RCC->CR & 0x00020000));// Xtal osc stabil hale gelsin
    RCC->PLLCFGR = 0x07405408;      // PLL katsayilarini M=8, N=336, P=2 ve Q=7 yapalim
//  RCC->PLLCFGR = 0x07402A04;     // PLL katsayilarini M=4, N=168, P=2 ve Q=7 yapalim
    RCC->CR |= 0x01000000;            // PLL calismaya baslasin  (Rehber Sayfa 95)
    while(!(RCC->CR & 0x02000000)); // Pll hazir oluncaya kadar bekle
//  FLASH->ACR = 0x00000705;        // Flash ROM icin 5 Wait state secelim ve ART yi aktif edelim (Rehber Sayfa 55)
    FLASH->ACR = 0x00000605;        // Flash ROM icin 5 Wait state secelim ve ART yi aktif edelim (Rehber Sayfa 55)
    RCC->CFGR |= 0x00000002;        // Sistem Clk u PLL uzerinden besleyelim
    while ((RCC->CFGR & 0x0000000F) != 0x0000000A); // Besleninceye kadar bekle
    RCC->AHB1ENR |= 0x0000000F;    // GPIO A,B,C,D clock'u aktif edelim 
    GPIOD->MODER = 0x55000000;     // GPIOD nin 15, 14, 13, 12 pinleri cikis tanimlandi (LEDler icin)
    GPIOD->OSPEEDR= 0xFFFFFFFF;   // GPIOD nin tum cikislari en yuksek hizda kullanacagiz 
} 

int main()
{
    while(1)
      {
         if (GPIOA->IDR & 0x000000001) GPIOD->ODR= 0x0000F000;     // Ledler yansin
         else GPIOD->ODR= 0x00000000;     // Ledler sonsun
      } 
}
what you do that defines you

z

Dokümana bakmaya üşendim.

Alıntı YapGPIOD->MODER = 0x55000000;     // GPIOD nin 15, 14, 13, 12 pinleri cikis tanimlandi (LEDler icin)

MODER reğisterinin üst bitlerine 5 yazılırken diğerlerine 0 yazılmış. Kataloğu aç ve bu registere 0 yazmanın ne anlama geldiğine bak.

Muhtemelen input demektir ve programda adı geçen satırın açıklama kısmına ilgili pinleri input yaptık yazmaya üşenmişizdir.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

l0rd

#2
Hard dökümanına şimdi baktım hocam 0 = input anlamına geliyormuş.O halde ;
GPIOD->MODER = 0x55000000;  bu atamayla D portunun  15 , 14 , 13 ve 12. pinler çıkış diğer pinler ( 11 ile 0 arası ) çıkış olarak tanımlanmış oluyor.Fakat  user manuale baktım butonumuz A portunun 0. pinindeymiş.Biz yukardaki atamayla D portunu çıkış yaptık.Bu atama D portuyla ilgili olduğundan A0 ı giriş yapmamış olduk , ozaman koda aşağıdaki gibi bir satır eklenmesi mi gerekiyor ?

GPIOA->MODER = 0x00000000;     // Buton A0 pininde olduğundan
what you do that defines you

Gökhan BEKEN

#3
A portuna dikkat edin hepsini input yaparsanız, direkt program atamazsınız, çünkü a portunda SWD pinleri var. Eğer yanlışlıkla input yapıp bir kere yüklerseniz, bir sonraki sefer reset butonuna basılı tutarak atın, yoksa hata verir.

mesaj birleştirme:: 19 Mart 2015, 23:33:38

Maskeleme işlemi kullarak sadece gerekli pini input yapın.
GPIOA->MODER&=0xFFFFFFFC;
Özel mesaj okumuyorum, lütfen göndermeyin.

z

İlgili bitleri 0 yaptığımızda pin input moduna alınıyorsa o zaman A portunu input yapmak için özel gayretimiz olmamış. Hard resette pinler demekki kendiliğinden input moduna geçiyor bu nedenle ilave kod yazmamışız.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

l0rd

Alıntı yapılan: Gökhan BEKEN - 19 Mart 2015, 23:32:01
A portuna dikkat edin hepsini input yaparsanız, direkt program atamazsınız, çünkü a portunda SWD pinleri var. Eğer yanlışlıkla input yapıp bir kere yüklerseniz, bir sonraki sefer reset butonuna basılı tutarak atın, yoksa hata verir.

mesaj birleştirme:: 19 Mart 2015, 23:33:38

Maskeleme işlemi kullarak sadece gerekli pini input yapın.
GPIOA->MODER&=0xFFFFFFFC;


Hocam GPIOA->MODER&=0xFFFFFFFC;  bu tanımlamayı anladım.Sadece durumunu değiştirmek istediğimiz pinler üzerinde değişiklik yapıyor diğer pinler user manualdeki reset değeri nasılsa öyle kalıyor.Fakat benim yaptığım yalnış tanımlama gibi yaparsam reset butonuna basılı iken kod atma kısmını anlamadım.O kısmı biraz daha açıklayabilir misiniz.


Alıntı yapılan: z - 19 Mart 2015, 23:36:56
İlgili bitleri 0 yaptığımızda pin input moduna alınıyorsa o zaman A portunu input yapmak için özel gayretimiz olmamış. Hard resette pinler demekki kendiliğinden input moduna geçiyor bu nedenle ilave kod yazmamışız.

Evet hocam yeni öğrendim reset durumunda user butonun pini (A0) giriş olarak verilmiş.Hocam peki el alışkanlığı oluşması açısından butonu yinede giriş olarak tanımlamamın bir zararı var mı?Bide hocam ben yukarıdaki kodu aynen derleyip işlemciye attığımda butona bastığımda led yanmadı fakat programı attıktan sonra reset butonuna bastıktan sonra user butona basınca ledlerin yandığını gördüm.Bu durum "butonu kodda çıkış olarak tanımlamadık fakat reset attığımızda fabrikasyon değeri butonu çıkış yaptı bu sayede kod çalıştı " bu şekilde mi açıklanır. :)
what you do that defines you

Gökhan BEKEN

Alıntı yapılan: l0rd - 20 Mart 2015, 22:31:07
Fakat benim yaptığım yalnış tanımlama gibi yaparsam reset butonuna basılı iken kod atma kısmını anlamadım.O kısmı biraz daha açıklayabilir misiniz.
Şu konuya bakın, demek istediğimi anlarsınız: https://www.picproje.org/index.php/topic,50851.0.html
Özel mesaj okumuyorum, lütfen göndermeyin.