Picproje Elektronik Sitesi

DERLEYİCİLER => Diğer Derleyiciler => KEIL => Konuyu başlatan: pax - 06 Aralık 2016, 10:45:25

Başlık: STM32F103C8 pull-up
Gönderen: pax - 06 Aralık 2016, 10:45:25
 PC13 de led ve PC14 de buton bağlı . butona basıp led yakabiliyorum ancak pc14 dahili pull-up direncini aktif edemiyorum



#include "stm32f10x.h"                 
#include "delay.h"

void Gpio_init()
   {
   
       RCC->APB2ENR |= 0x00000010;
       GPIOC->CRH |= 0x08200000;
       GPIOC->ODR |= (1 << 14);                                                                                                                                 
   }

int main (void)
  {

         Gpio_init();

  while(1)
      {
   if(!(GPIOC->IDR & (1<<14)))
         {
   GPIOC->ODR= 0x00002000;   
 
                        }
          else
{
   GPIOC->ODR= 0x00000000;
}
      }
}

Başlık: Ynt: STM32F103C8 pull-up
Gönderen: Klein - 06 Aralık 2016, 18:13:04
CNFy[1:0]:Port x configuration bits (y= 8 .. 15)
These bits are written by software to configure the corresponding I/O port.
Refer to Table 20: Port bit configuration table on page 161.
In input mode (MODE[1:0]=00):
00: Analog mode
01: Floating input (reset state)
10: Input with pull-up / pull-down
11: Reserved

Portun CNF bitlari varsayılan olarak 01  durumunda.   10 ile or yapınca  11  oluyor.  11 durumu rezerveli olduğu için ya yazılmıyor ya da bir işe yaramıyor. İlgili bitleri önce 00 yapıp sonra 10 yaparsanız muhtemelen olacak.
Başlık: Ynt: STM32F103C8 pull-up
Gönderen: pax - 07 Aralık 2016, 11:02:42
dediğiniz gibi yaptım ama sonuç olumsuz


#include "stm32f10x.h"                 

void Gpio_init()
   {
     GPIOC->ODR =0;
     RCC->APB2ENR |= 0x00000010;
     GPIOC->CRH &= 0xF00FFFFF;
     GPIOC->CRH |=  0x08200000;  
     GPIOC->ODR |= 0x00004000;                                                                                                                               
   }

int main (void)
  {
Gpio_init();
        while(1)
      {

if(!(GPIOC->IDR & 0x00004000))
  {
     GPIOC->ODR= 0x00002000;   
                       }
        else
        {
  GPIOC->ODR= 0x00000000;
         }
       }
  }



debug dan CRH'ı kontrol ediyorum istediğim değeri alıyor


(https://s12.postimg.cc/wazr1d4k9/pullup.png) (https://postimg.cc/image/wazr1d4k9/)
Başlık: Ynt: STM32F103C8 pull-up
Gönderen: Zoroaster - 07 Aralık 2016, 12:03:45
O direnç input durumu için geçerli.

Eğer pini output tanımlarsan o özelliği kullanamazsın.
Başlık: Ynt: STM32F103C8 pull-up
Gönderen: pax - 07 Aralık 2016, 12:08:20
Alıntı yapılan: Zoroaster - 07 Aralık 2016, 12:03:45
O direnç input durumu için geçerli.

pin giriş olarak tanımlandı zaten .
Başlık: Ynt: STM32F103C8 pull-up
Gönderen: Zoroaster - 07 Aralık 2016, 12:16:15
PC13 deki ledi yakıp söndürmek için ODR registerine değer yüklerken PullUp yaptığın PC14 pinine 1 yazman gerekir.

Yani ledi yakıp söndürmek için 0x2000 ve 0x0000 değil 0x6000 ve 0x4000 değerlerini kullanacaksın.
Başlık: Ynt: STM32F103C8 pull-up
Gönderen: pax - 07 Aralık 2016, 13:27:51
Alıntı yapılan: Zoroaster - 07 Aralık 2016, 12:16:15
PC13 deki ledi yakıp söndürmek için ODR registerine değer yüklerken PullUp yaptığın PC14 pinine 1 yazman gerekir.

Yani ledi yakıp söndürmek için 0x2000 ve 0x0000 değil 0x6000 ve 0x4000 değerlerini kullanacaksın.


PC14 pinine zaten


oid Gpio_init()
   {

     GPIOC->ODR =0;

     RCC->APB2ENR |= 0x00000010;
     GPIOC->CRH &= 0xF00FFFFF;
     GPIOC->CRH |=  0x08200000;  
      GPIOC->ODR |= 0x00004000;                                                                                                                               
   }



burada  GPIOC->ODR |= 0x00004000;  ile pc14 ü 1 yapıyorum
Başlık: Ynt: STM32F103C8 pull-up
Gönderen: Zoroaster - 07 Aralık 2016, 13:30:53
Fakat aşağıda da geri bozuyorsun.

Gpio_init();
        while(1)
      {

if(!(GPIOC->IDR & 0x00004000))
  {
     GPIOC->ODR= 0x00002000;   
                       }
        else
        {
  GPIOC->ODR= 0x00000000;
         }
       }
  }
Başlık: Ynt: STM32F103C8 pull-up
Gönderen: Zoroaster - 07 Aralık 2016, 13:32:18
Aşağıdaki gibi yapacaksın.

Gpio_init();
        while(1)
      {

if(!(GPIOC->IDR & 0x00004000))
  {
     GPIOC->ODR= 0x00006000;   
                       }
        else
        {
  GPIOC->ODR= 0x00004000;
         }
       }
  }

   
Başlık: Ynt: STM32F103C8 pull-up
Gönderen: pax - 07 Aralık 2016, 13:35:05
evet haklısınız orayı göremedim şimdi oldu. ben sadece ilk anda 1 yapılmalı diye düşünmüştüm. gerisini düşünemedim.
Başlık: Ynt: STM32F103C8 pull-up
Gönderen: Zoroaster - 07 Aralık 2016, 13:49:10
STM32F103'ün pis bir yapısı bu. Bir tane daha fazladan register koymaya üşenmişler.

ODR yerine BSRR ve BRR registerlerini kullanırsan Pull Up/Down dirençlerine müdahale etmemiş olursun.
Başlık: Ynt: STM32F103C8 pull-up
Gönderen: pax - 07 Aralık 2016, 13:55:54


Alıntı yapılan: Zoroaster - 07 Aralık 2016, 13:49:10
ODR yerine BSRR ve BSR registerlerini kullanırsan Pull Up/Down dirençlerine müdahale etmemiş olursun.

evet ben de şimdi  BSSR , BSR ve ODR arasında ne fark var onu anlamaya çalışacakatım. bu konuda bilgi verirseniz sevinirim. 
Başlık: Ynt: STM32F103C8 pull-up
Gönderen: Zoroaster - 07 Aralık 2016, 14:22:21
Bu registerlerde sadece 1 yazdığın bitler çıkışı değiştiriyor.

Örneğin BSRR de 1 yaptığın bite ait çıkış 1 olurken, 0 yazdığın bitler çıkışları değişmiyor.

Yada BRR de 1 yaptığın bite ait çıkış 0 olurken 0 yazdığın bitler çıkışları değiştirmiyor.

Böylece bir başka rutinin 1 yada 0 yaptığı pini, sen bir başka rutinde etkilemeden portun diğer bitlerini 1-0 yapabiliyorsun.

Aksi halde bu sorunu daha başka yollardan çözmen gerekiyor. (Yukarıdaki örnekte Bit12'yi değiştirirken Bit14'ü bozmamak adına 0x4000 ile orlamak gibi)
Başlık: Ynt: STM32F103C8 pull-up
Gönderen: pax - 07 Aralık 2016, 14:28:55

.............
while(1)
      {
          if(!(GPIOC->IDR & 0x00004000))
              {
    GPIOC->BSRR = 0x00002000;     

                              }
        else
{
            GPIOC->BRR = 0x00002000;

}



bu şekilde daha rahat oluyor. BSRR VE BRR kullanmak daha mantıklı geldi.