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?
Pin ayarlarını nasıl yaptın, onun da kodunu koyar mısın ?
Dahili pullup'lar aktif olabilir, GPIO init kısmını incelemeniz lazım.
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);
Peki bu GPIO'ların clock'ları da aktif edildimi?
Evet aktif
Discovery kiti kullaniyorsaniz c0 pini bir yerlere baglanmis olabilir. Kontrol edin semadan.
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.
Giris olan pinler bosta mi duruyor?
kodların tamamını görelim..
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.
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?
Pinleri birde pulldown direnci ile saseye cekip deneme yapar misiniz? Gerci dahili pdown direncleri aktif edilmis ama siz yinede bir deneyin.
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.
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.
GPIO init kodlarını diğer init kodlarının altına yapıştırıp denermisin.
System init en ilk çağrılacak.
Alıntı yapılan: muhittin_kaplan - 20 Eylül 2014, 18:26:07
hocam syeteminit i ilk yazın deneyelim..
mesaj birleştirme:: 21 Eylül 2014, 08:36:21
programı sadece pin okuma üzerine kur.
USB kodları etkiliyor sanırım. PC0 usb üzerinde görülüyor.
Ondan olduğunuda sanmıyorum çünkü diğer pinleride denedim yine aynı şey.
Alıntı yapılan: Mucit23 - 20 Eylül 2014, 18:43:35
GPIO init kodlarını diğer init kodlarının altına yapıştırıp denermisin.
System init en ilk çağrılacak.
Yaptım hocam değişen bişey olmadı.
Hocam problemi Sıkıstırmanız gerek.
HID le alakalı Kodları Kullanmayın. sadece PIN okuyun.
O halde muhittin abinin söylediğini yap. Template bir program hazırla buton okumaktan başka hiçbirşey yapma ekstra kütüphane felan ekleme. Bunu dene sonra sonucu yaz tekrar bakalım.
Edit: Muhittin abi önce yazmış dediğini yap :)
Aynı problemi bende yaşıyorum malesef ama çözümü başka bir bilgisayar kullanmakla çözdüm ve aynı zamanda keil problemli diyebilirim en basit örnek verim hal kütüphanesi kullandım olmadı gittim. std kullandım oda olmadı bir türlü adc den aldım veriyi usarta basamadım sonunda gidip bir led yakım dedim bari o çalışıyormu :) oda olmayınca oturdum tek tek registerlara bakarak yazdım keilda sanırsam büyük bir problem var dedim buradanda başarısızlık elde edince sonuç olarak. Gidip bilgisayari değiştirdim sorun problem ortadan kaldı.
:)