Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

STM32F103C8 pull-up

Başlatan pax, 06 Aralık 2016, 10: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 |= (1 << 14);                                                                                                                                 
   }

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

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

#2
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




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, 12: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, 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

Zoroaster

Fakat aşağıda da geri bozuyorsun.

Gpio_init();
        while(1)
	      {

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

Zoroaster

Aşağıdaki gibi yapacaksın.

Gpio_init();
        while(1)
	      {

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

   
Seytan deliginden kacti.

pax

#9
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

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

pax



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. 

Zoroaster

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