21 Ekim 2021, 18:36:20

Haberler:

Eposta uyarılarını yanıtlamayınız ( ! ) https://bit.ly/2J7yi0d


STM32F103C8 pull-up

Başlatan pax, 06 Aralık 2016, 13:45:25

pax

 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 |= (<< 14);                                                                                                                                 
   }

int main (void)
  {
	
	

         
Gpio_init();
	
 
	
  while(
1)
	
      {
	
	
   if(!(
GPIOC->IDR & (1<<14)))
	
	
         {
	
	
	
   
GPIOC->ODR0x00002000;    
	
	
	
	
	
  
      
	
                  }
	
          else
	
	
	
{
	
	
	
   
GPIOC->ODR0x00000000
	
	
	
}
	
      }
}
	


Klein

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.

pax

07 Aralık 2016, 14:02:42 #2 Son düzenlenme: 07 Aralık 2016, 14:13:18 pax
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->ODR0x00002000;    
	
	
 
      
	
                 }
	
        else
	
	
        {
	
	
	
  
GPIOC->ODR0x00000000
	
	
         }
	
       }
  }
	



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




Zoroaster

O direnç input durumu için geçerli.

Eğer pini output tanımlarsan o özelliği kullanamazsın.
Seytan deliginden kacti.

pax

Alıntı yapılan: Zoroaster - 07 Aralık 2016, 15:03:45
O direnç input durumu için geçerli.

pin giriş olarak tanımlandı zaten .

Zoroaster

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.
Seytan deliginden kacti.

pax

Alıntı yapılan: Zoroaster - 07 Aralık 2016, 15: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

Zoroaster

Fakat aşağıda da geri bozuyorsun.

	
Gpio_init();
        while(
1)
	
      {

	
	
if(!(
GPIOC->IDR 0x00004000))
	
	
  
	
{
	
	
	
     
GPIOC->ODR0x00002000;    
	
	
 
      
	
                 }
	
        else
	
	
        {
	
	
	
  
GPIOC->ODR0x00000000
	
	
         }
	
       }
  }
	
Seytan deliginden kacti.

Zoroaster

Aşağıdaki gibi yapacaksın.

	
Gpio_init();
        while(
1)
	
      {

	
	
if(!(
GPIOC->IDR 0x00004000))
	
	
  
	
{
	
	
	
     
GPIOC->ODR0x00006000;    
	
	
 
      
	
                 }
	
        else
	
	
        {
	
	
	
  
GPIOC->ODR0x00004000
	
	
         }
	
       }
  }

   
Seytan deliginden kacti.

pax

07 Aralık 2016, 16:35:05 #9 Son düzenlenme: 07 Aralık 2016, 16:36:06 pax
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.

Zoroaster

07 Aralık 2016, 16:49:10 #10 Son düzenlenme: 07 Aralık 2016, 17:22:41 Zoroaster
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.
Seytan deliginden kacti.

pax



Alıntı yapılan: Zoroaster - 07 Aralık 2016, 16: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. 

Zoroaster

07 Aralık 2016, 17:22:21 #12 Son düzenlenme: 07 Aralık 2016, 17:23:58 Zoroaster
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)
Seytan deliginden kacti.

pax


.............
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.

Yasal Uyarı: Picproje.org sitemizde 5651 sayılı kanunun 8. maddesine ve T.C.Knın 125. maddesine göre tüm üyelerimiz yaptıkları paylaşımlardan kendileri sorumludur. Picproje.org hakkında yapılacak tüm hukuksal şikayetleri İletişim sayfamızdan bize bildirdikten en geç 3 (üç) iş günü içerisinde ilgili kanunlar ve yönetmelikler çerçevesinde tarafımızca incelenerek gereken işlemler yapılacak ve site yöneticilerimiz tarafından bilgi verilecektir.