STM32F4 DISCOVERY STD_LİB İLE BUTON OKUMA YARDIM

Başlatan Kaanx, 12 Mart 2013, 14:51:18

Kaanx

Merhabalar stm32f4 kitimde user buton kullanmaya çalıstım fakat kodum çalısmadı.Atollicte derlıyorum bunu ve system_stm32f4xx.c de hiç bir degisiklik yapmadım user butonu kullanamıyorum ve kodu debug eettıgımde ledlerın hepsi yanar konumda oluyor bastıgımda yanmasını istiyorum.
systeminit kodu
void SystemInit(void)
{
  /* FPU settings ------------------------------------------------------------*/
  #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
	SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2));  /* set CP10 and CP11 Full Access */
  #endif

  /* Reset the RCC clock configuration to the default reset state ------------*/
  /* Set HSION bit */
  RCC->CR |= (uint32_t)0x00000001;

  /* Reset CFGR register */
  RCC->CFGR = 0x00000000;

  /* Reset HSEON, CSSON and PLLON bits */
  RCC->CR &= (uint32_t)0xFEF6FFFF;

  /* Reset PLLCFGR register */
  RCC->PLLCFGR = 0x24003010;

  /* Reset HSEBYP bit */
  RCC->CR &= (uint32_t)0xFFFBFFFF;

  /* Disable all interrupts */
  RCC->CIR = 0x00000000;

#ifdef DATA_IN_ExtSRAM
  SystemInit_ExtMemCtl(); 
#endif /* DATA_IN_ExtSRAM */
         
  /* Configure the System clock source, PLL Multiplier and Divider factors, 
     AHB/APBx prescalers and Flash settings ----------------------------------*/
  SetSysClock();

  /* Configure the Vector Table location add offset address ------------------*/
#ifdef VECT_TAB_SRAM
  SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */
#else
  SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
#endif
}


main.c kodu

#include "stm32f4xx.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_rcc.h"
GPIO_InitTypeDef  GPIOD_InitStructure,GPIOA_InitStructure;

void Delay(__IO uint32_t nCount);


void Pin_Init(void)

{

	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE);

	GPIOD_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
	GPIOD_InitStructure.GPIO_Pin=GPIO_Pin_15|GPIO_Pin_14|GPIO_Pin_13|GPIO_Pin_12;
	GPIOD_InitStructure.GPIO_OType=GPIO_OType_PP;
	GPIOD_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
	GPIOD_InitStructure.GPIO_Speed=GPIO_Speed_2MHz;
	GPIOD_Init(GPIOD,&GPIOD_InitStructure);
	STM_EVAL_PBInit(BUTTON_USER,BUTTON_MODE_GPIO);

	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);

	GPIOA_InitStruct.GPIO_Pin = GPIO_Pin_0; //BUTON İÇİN
	GPIOA_InitStruct.GPIO_Mode = GPIO_Mode_IN; //BUTONDAN BİLGİ OKUNACAK O YUZDEN İNPUT EDILDI
	GPIOA_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
	GPIOA_InitStruct.GPIO_OType = GPIO_OType_PP;
	GPIOA_InitStruct.GPIO_PuPd = GPIO_PuPd_DOWN;
	GPIOA_Init(GPIOA, &GPIOA_InitStruct);

	GPIO_ResetBits(GPIOD,GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);
}


void main (void)
{

	Pin_Init();
	while(1)
	{
		if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0))
		{
			Delay(0X3FFFF);
			GPIO_ToggleBits(GPIOD,GPIO_Pin_15);
		}
		else
		{
			Delay(0X3FFFF);
			GPIO_ResetBits(GPIOD,GPIO_Pin_15);
		}
	}
}


void Delay(__IO uint32_t nCount)
{
  while(nCount--)
  {
  }
}


yardımlarını bekliyorum.

muhittin_kaplan

Kaanx kolay gelsin
yanlış hatırlamıyorsam butonlar "0" gönderiyor.

Klein

Buton basılı iken Hi oluyor. Kodun bu kusmında bir hata dikkatimi çekmedi. 
Ledlerde sorun olmadığına veya SystemInit kodlarında hata olmadığından emin misiniz?

nCount parametresini neden __IO segmentinde tanımladınız?

Kaanx

#3
Alıntı yapılan: muhittin_kaplan - 12 Mart 2013, 17:06:57
Kaanx kolay gelsin
yanlış hatırlamıyorsam butonlar "0" gönderiyor.
Tesekkur ederim sizlerede kolay gelsin öncelıkle. ben bunu registerlara baglı olarak yapmıstım fakat lib kullanımında gercekleyemedım butonun sıfır göndermemesi gerek if() içerisnde ==1 yazmadım otomatikman 1 mi diye sorgulamıyor mu ?

mesaj birleştirme:: 13 Mart 2013, 02:05:02

Alıntı yapılan: Klein - 12 Mart 2013, 21:51:30
Buton basılı iken Hi oluyor. Kodun bu kusmında bir hata dikkatimi çekmedi. 
Ledlerde sorun olmadığına veya SystemInit kodlarında hata olmadığından emin misiniz?

nCount parametresini neden __IO segmentinde tanımladınız?

Hocam atollicte derledıgımden dolayı yukarıda verdıgım gibi  systemınit kodları oraya hiç dokunmadım degıstrmem gerekıyor muydu orayıda ? IO segmentinde GPIO kullanımı ıcın kullanıcagımdan delay fonksıyonunu o yuzden IO olarak aldım duz mantık dusunmus olabilirim ne işe yarar diye sorarsanız bilgim yok lib incelerken denk gelmişti.

Kaanx

#4
KODU SU SEKILDE TEKRAR YAZDIM LAKIN HALA LEDLER YANIYOR VE USER BUTTON SET VERMIYOR SYSTEM INIT DOSYALARINI DA DEGISTIRM LUTFEN YARDIM BEKLIYORUM BU KONUYU ANLAMADAN GECMEK ISTEMIYORUM.

SYSTEMINIT();
void SystemInit()
  {
  unsigned int i;

      for (i=0;i<0x00100000;i++);          // OSC oturtma ve kurtarma rutini
      RCC->CFGR |= 0x00009400;         // AHB ve APB hizlarini max degerlere set edelim
      RCC->CR |= 0x00010000;            // HSE Xtal osc calismaya baslasin
      while (!(RCC->CR & 0x00020000));// Xtal osc stabil hale gelsin
      RCC->PLLCFGR = 0x07405408;      // PLL katsayilarini M=8, N=336, P=2 ve Q=7 yapalim
  //  RCC->PLLCFGR = 0x07402A04;     // PLL katsayilarini M=4, N=168, P=2 ve Q=7 yapalim
      RCC->CR |= 0x01000000;            // PLL calismaya baslasin  (Rehber Sayfa 95)
      while(!(RCC->CR & 0x02000000)); // Pll hazir oluncaya kadar bekle
  //  FLASH->ACR = 0x00000705;        // Flash ROM icin 5 Wait state secelim ve ART yi aktif edelim (Rehber Sayfa 55)
      FLASH->ACR = 0x00000605;        // Flash ROM icin 5 Wait state secelim ve ART yi aktif edelim (Rehber Sayfa 55)
      RCC->CFGR |= 0x00000002;        // Sistem Clk u PLL uzerinden besleyelim
      while ((RCC->CFGR & 0x0000000F) != 0x0000000A); // Besleninceye kadar bekle
      RCC->AHB1ENR |= 0x0000001F;    // GPIO A,B,C,D,E clock'u aktif edelim
      GPIOD->MODER = 0x55000000;     // GPIOD nin 15, 14, 13, 12 pinleri cikis tanimlandi (LEDler icin)
      GPIOD->OSPEEDR= 0xFFFFFFFF;   // GPIOD nin tum cikislari en yuksek hizda kullanacagiz

      GPIOA->MODER=0X00000000; //a portu komple giriş
      GPIOA->OSPEEDR=0XFFFFFFFF; // cıkıs 100mhz
  }


MAİN.C

#include <stm32f4xx.h>
#include <stm32f4_discovery.h>
#include <stm32f4xx_gpio.h>
void Delay(__IO uint32_t nCount);
void Pin_Init(void);


int main(void)
{
	Pin_Init();
	GPIO_ResetBits(GPIOD,GPIO_Pin_15|GPIO_Pin_14|GPIO_Pin_13|GPIO_Pin_12);

	while(1)
	{
		while (GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0))
		{
			GPIO_SetBits(GPIOD, GPIO_Pin_12);  // 1.Ledi yak
			Delay(0x200000);
			GPIO_ResetBits(GPIOD, GPIO_Pin_12); //1.Ledi söndür
			Delay(0x200000);
			/* PD13 to be toggled */
			GPIO_SetBits(GPIOD, GPIO_Pin_13); //2.Ledi yak
			Delay(0x200000);
			GPIO_ResetBits(GPIOD, GPIO_Pin_13); //2.Ledi söndür
			Delay(0x200000);
			/* PD14 to be toggled */
			GPIO_SetBits(GPIOD, GPIO_Pin_14); //3.Ledi yak
			Delay(0x200000);
			GPIO_ResetBits(GPIOD, GPIO_Pin_14); // 3. Ledi söndür
			Delay(0x200000);
			/* PD15 to be toggled */
			GPIO_SetBits(GPIOD, GPIO_Pin_15); // 4. Ledi yak
			Delay(0x200000);
			GPIO_ResetBits(GPIOD, GPIO_Pin_15);  // 4. Ledi söndür
			Delay(0x200000);
		}
	}
}

void Pin_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStruct;

	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD|RCC_AHB1Periph_GPIOA, ENABLE);

	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_15|GPIO_Pin_14|GPIO_Pin_13|GPIO_Pin_12;
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_OUT;
	GPIO_InitStruct.GPIO_OType=GPIO_OType_PP;
	GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_NOPULL;
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOD,&GPIO_InitStruct);




	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0; //USER BUTTON TANIMLANDI
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN;
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_InitStruct.GPIO_OType=GPIO_OType_PP;
	GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_DOWN;
	GPIO_Init(GPIOA, &GPIO_InitStruct);

}

void Delay(__IO uint32_t nCount)
  {
  while(nCount--) {
  }
}


mesaj birleştirme:: 13 Mart 2013, 15:02:06

KİT ÜZERİNDE BİR SORUN VAR SNIRIM LEDLER SUREKLI YANIYOR BASKA KOD DERLEDIM UZERINDE CALISMIYOR.

Klein

kodu şu şekilde değitirip bir dene. Ledleri bir görelim. sonra buton meselesine döneriz.

void delay(uint32_t counter)
{
  while(counter--);
}

int main(void)
{
...
// portlar rcc. vs.. init işlemleri
...

while (1)
{
    GPIO_SetBits(GPIOD, GPIO_Pin_12);
    delay(0x200000); // sürenin yeterliolduğuna emin olun. 
    GPIO_ResetBits(GPIOD, GPIO_Pin_12);
  
}

}


bu çalışırsa işlemleri diğer led pinleri için tekrar edin. sonra inputlara bakalım.
eğer çalışmazsa sorun başka bir yerdedir.

Kaanx

hocam suan o kodlar çalıstı fakat target is not responding  hatası gelmeye başladı sımdıde kod debug edemıyorum

Klein

ST_Link Utility ile programlamayı bir dene. Seçeneklerin içinde "program under reset" ya da ona benzer bir seçenek olacaktı. onu işaretleyip bir dene.   

Kaanx

#8
hocam suan hiç bir programı atamıyorum full erase chip progres bölumu tıkladım st link ten hala atollicte target is not responding hatası alıyorum.

Kaanx

Hocam yardımlarınız için cok tesekkur ederim sorunu hallettim cok sukur kod suan çalısıyor donanımsal olarak bi sorun varmış sanırım Stlink ten çipi temizledim sonra bi sakinleşip pc ye ve kendime reset atınca sorun çözuldu :) Benımde çorba bir tuzum olması dileğiyle kodun çalısır hali burada

http://kaankandemir.wordpress.com/2013/03/13/stm32f4-discovery-user-button-kullanimi/