STM32F4 pin okuma problemi

Başlatan ArifAhmet, 20 Eylül 2014, 14:32:01

ArifAhmet

Merhabalar,
KEİL ile stm32f4 kullanarak pin okumaya çalışıyorum. Kodlar şöyle;
if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)) { 
    
    //İşlemler..
	
} 
if (GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_0)) { 

   //İşlemler..
	
}


GPIOA doğru bir şekilde çalışıyor fakat C portunda hiçbirşey bağlı olmamasına rağmen sürekli bu koşulun içine giriyor, ancak gnd'ye bağlayınca duruyor. Sorun nerdedir acaba?
Yaşasın Open Source!

kimlenbu

Pin ayarlarını nasıl yaptın, onun da kodunu koyar mısın ?

JKramer

Dahili pullup'lar aktif olabilir, GPIO init kısmını incelemeniz lazım.

ArifAhmet

GPIO_InitDef.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 ;
GPIO_InitDef.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitDef.GPIO_OType = GPIO_OType_PP;
GPIO_InitDef.GPIO_PuPd = GPIO_PuPd_DOWN;
GPIO_InitDef.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitDef);

GPIO_InitDef.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 ;
GPIO_InitDef.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitDef.GPIO_OType = GPIO_OType_PP;
GPIO_InitDef.GPIO_PuPd = GPIO_PuPd_DOWN;
GPIO_InitDef.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitDef);
Yaşasın Open Source!

minicihazlar

Peki bu GPIO'ların clock'ları da aktif edildimi?

ArifAhmet

Yaşasın Open Source!

LukeSkywalker

Discovery kiti kullaniyorsaniz c0 pini bir yerlere baglanmis olabilir. Kontrol edin semadan.

ArifAhmet

Alıntı yapılan: LukeSkywalker - 20 Eylül 2014, 17:20:03
Discovery kiti kullaniyorsaniz c0 pini bir yerlere baglanmis olabilir. Kontrol edin semadan.
Onuda düşündüm. O yüzden B portunuda baktım aynı şey yine oldu. A portunun diğer pinlerine bağladım yine aynı şey oldu.
Yaşasın Open Source!

LukeSkywalker

Giris olan pinler bosta mi duruyor?

muhittin_kaplan

kodların tamamını görelim..

ArifAhmet

Alıntı yapılan: LukeSkywalker - 20 Eylül 2014, 17:30:14
Giris olan pinler bosta mi duruyor?
Evet.

/*    Keil project for USB HID Device
*
*    Before you start, select your target, on the right of the "Load" button
*
*    @author     Tilen Majerle
*    @email        tilen@majerle.eu
*    @website    http://stm32f4-discovery.com
*    @ide        Keil uVision 5
*/
/* Include core modules */
#include "stm32f4xx.h"
/* Include my libraries here */
#include "defines.h"
#include "tm_stm32f4_usb_hid_device.h"
#include "tm_stm32f4_delay.h"
#include "tm_stm32f4_disco.h"

#include "stm32f4xx_rcc.h"
#include "stm32f4xx_gpio.h"
 
int main(void) {

	GPIO_InitTypeDef GPIO_InitDef;
    uint8_t already = 0;
    TM_USB_HIDDEVICE_Mouse_t Mouse;
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
	
	GPIO_InitDef.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 ;
//Mode output
GPIO_InitDef.GPIO_Mode = GPIO_Mode_IN;
//Output type push-pull
GPIO_InitDef.GPIO_OType = GPIO_OType_PP;
//With pull down resistor
GPIO_InitDef.GPIO_PuPd = GPIO_PuPd_DOWN;
//50MHz pin speed
GPIO_InitDef.GPIO_Speed = GPIO_Speed_50MHz;
 
//Initialize pin on GPIOA port
GPIO_Init(GPIOA, &GPIO_InitDef);
	GPIO_InitDef.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 ;
//Mode output
GPIO_InitDef.GPIO_Mode = GPIO_Mode_IN;
//Output type push-pull
GPIO_InitDef.GPIO_OType = GPIO_OType_PP;
//With pull down resistor
GPIO_InitDef.GPIO_PuPd = GPIO_PuPd_DOWN;
//50MHz pin speed
GPIO_InitDef.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitDef);
GPIO_ResetBits(GPIOC, GPIO_Pin_0);
    
    /* Initialize system */
    SystemInit();
    
    /* Initialize leds */
    TM_DISCO_LedInit();
    
    /* Initialize button */
  //  TM_DISCO_ButtonInit();
    
    /* Initialize delay */
    TM_DELAY_Init();
    
    /* Initialize USB HID Device */
    TM_USB_HIDDEVICE_Init();
    
    /* Set default values for mouse struct */
    TM_USB_HIDDEVICE_MouseStructInit(&Mouse);
    /* Set default values for keyboard struct */

                     while(1){ 
        /* If we are connected and drivers are OK */
        if (TM_USB_HIDDEVICE_GetStatus() == TM_USB_HIDDEVICE_Status_Connected) {
            /* Turn on green LED */
            TM_DISCO_LedOn(LED_GREEN);
            
/* Simple sketch start */    

         /* If you pressed button right now and was not already pressed */
if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)) { /* Button on press */
    
    /* Rotate wheel on mouse */
    Mouse.YAxis = -10; /* Move 10 units = 10 * 3 lines on text editor in windows */
    
    /* Send mouse report */
    TM_USB_HIDDEVICE_MouseSend(&Mouse);
	
} 
if (GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_0)) { /* Button on press */
    GPIO_ResetBits(GPIOC, GPIO_Pin_0);
    /* Rotate wheel on mouse */
    Mouse.YAxis = 10; /* Move 10 units = 10 * 3 lines on text editor in windows */
    
    /* Send mouse report */
    TM_USB_HIDDEVICE_MouseSend(&Mouse);
	
} 
  
					}
            
    }
}

Kodların tamamı bu muhittin hocam.
Yaşasın Open Source!

minicihazlar

GPIO_ReadInputDataBit fonksiyonuna bakınca :

uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
  uint8_t bitstatus = 0x00;

  /* Check the parameters */
  assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
  assert_param(IS_GET_GPIO_PIN(GPIO_Pin));

  if ((GPIOx->IDR & GPIO_Pin) != (uint32_t)Bit_RESET)
  {
    bitstatus = (uint8_t)Bit_SET;
  }
  else
  {
    bitstatus = (uint8_t)Bit_RESET;
  }
  return bitstatus;
}


Bu kodun tek takılı kalabileceği yer "assert_param" kısımları ama bu da pek mümkün görünmüyor. Dolayısıyla tek yer kalıyor o da bence stack/heap ayarları. Stack alanı yetmiyor olabilir mi? Dolayısıyla fonksiyona dallanacağı zaman takılıp kalıyordur, hatta büyük ihtimalle fault/exception handler'lardan birine giriyordur kod, hiç kodun takıldığında nerde durduğuna baktınız mı? Bunun yerine aynı yerden başka bir fonksiyon çağırdığınızda nasıl davranıyor?

LukeSkywalker

Pinleri birde pulldown direnci ile saseye cekip deneme yapar misiniz? Gerci dahili pdown direncleri aktif edilmis ama siz yinede bir deneyin.

ArifAhmet

Alıntı yapılan: LukeSkywalker - 20 Eylül 2014, 17:55:22
Pinleri birde pulldown direnci ile saseye cekip deneme yapar misiniz? Gerci dahili pdown direncleri aktif edilmis ama siz yinede bir deneyin.
Onuda denedim olmadı.
Alıntı yapılan: minicihazlar - 20 Eylül 2014, 17:52:15
GPIO_ReadInputDataBit fonksiyonuna bakınca :

uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
  uint8_t bitstatus = 0x00;

  /* Check the parameters */
  assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
  assert_param(IS_GET_GPIO_PIN(GPIO_Pin));

  if ((GPIOx->IDR & GPIO_Pin) != (uint32_t)Bit_RESET)
  {
    bitstatus = (uint8_t)Bit_SET;
  }
  else
  {
    bitstatus = (uint8_t)Bit_RESET;
  }
  return bitstatus;
}


Bu kodun tek takılı kalabileceği yer "assert_param" kısımları ama bu da pek mümkün görünmüyor. Dolayısıyla tek yer kalıyor o da bence stack/heap ayarları. Stack alanı yetmiyor olabilir mi? Dolayısıyla fonksiyona dallanacağı zaman takılıp kalıyordur, hatta büyük ihtimalle fault/exception handler'lardan birine giriyordur kod, hiç kodun takıldığında nerde durduğuna baktınız mı? Bunun yerine aynı yerden başka bir fonksiyon çağırdığınızda nasıl davranıyor?

Sanmıyorum. Çünkü PortA'da çalışan şey PortC'de neden çalışmıyor. Sorunun fonksiyonlarda olduğunu düşünmüyorum.
Yaşasın Open Source!

muhittin_kaplan

#14
hocam syeteminit i ilk yazın deneyelim..

mesaj birleştirme:: 20 Eylül 2014, 18:36:21

programı sadece pin okuma üzerine kur.
USB kodları etkiliyor sanırım. PC0 usb üzerinde görülüyor.