led toggle uygulamasında problemler var

Başlatan ergen, 08 Eylül 2012, 01:55:51

ergen

#include "STM32F4xx.h"

// FCPU =168Mhz
// FAHB =FCPU
// FAPB2=FCPU/2
// FAPB1=FCPU/4

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 = 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 = 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 |= 0x0000000F;     // GPIO A,B,C,D clock'u aktif edelim 
    GPIOB->MODER = 0x00000015;      // GPIOB nin 0,1,2 pinleri cikis tanimlandi (LEDler icin)
    GPIOB->OSPEEDR= 0xFFFFFFFF;     // GPIOD nin tum cikislari en yuksek hizda kullanacagiz 
      RCC->APB2ENR|=0x4000;           // SYSCFG Enable
      
} 

void EXTI1_IRQHandler ()
{
    EXTI->PR|=0x00000002;           // EXTIO INT flagimizi silelim
      GPIOB->ODR^=0x00000007; 	
} 


int main()
{
//  Butona basinca pinimiz H oluyor
    GPIOA->MODER &=~0x0000000C;      // GPIO pin ancak inp modunda interrupt uretebilir (Rehber 143)
    //GPIOA->PUPDR &= 0x00000004;
    SYSCFG->EXTICR[0]&=~0x000000F0; // GPIO A1 interrupt uretecek
    EXTI->RTSR=0x00000002;                   // Yukselen kenar tetiklemesi yapacagiz. (EXTI1)
    EXTI->FTSR=0;                   // Dusen kenar tetiklemesi istemiyoruz.  (EXTI1)
    EXTI->IMR=0x00000002;                    // EXTI1 Int enable (Rehber 202-203)
    EXTI->EMR=0;                    // Event istemiyoruz
    NVIC->ISER[0] = 0x00000080;     // NVIC EXTI1_IRQ interrupti acalim
    while(1);      
}



Bülent hocamızın yapmış olduğu kodlardan yararlanarak toggle işlemini kart üzerinden değilde harici olarak bi buton bagladım ve yine harici bagladıgım üç ledi yakıyorum.Fakat bazı problemler var mesela butona ardarda basınca ledler çok kararlı ve hızlı bir şekilde yanıp sönme işlemi yapmıyo bazen bassamda sönmüyo ve yanmıyo parazitle ilgili olabilir ama yükselen kenardan sonra gecikme eklemek istiyorm bunu hangi satıra eklicem onu kestiremedim.yada bunun başka bir çözümü varmı.birde ekledigim butonun girişini dahili direnç ile pull-down yapmak istiyorum            GPIOA->PUPDR &= 0x00000004;  bu satırı ekledim debug yaparken bu satırda register a yazma yapmıyo GPIOA->PUPDR &= 0x00000004; böyle yaparsa yazıyo neden anlamadım.yardımcı olurmusunuz çok ihtiyacım var.