Sayın Hocalarım ve ilgilenen arkadaşlar,
MikroC ARM kitabımızdaki açıklamalara benzeterek datasheet(el kitabı) yardımıyla A0 pininden harici kesme çalıştırdım. Ama bunun dışındaki port(A dahil) ve pinlerden datasheet açıklamalarını uyguladığım halde ne yaptıysam sonuç alamadım. Çalışan ve çalışmayan kodlardan örnek aşağıdadır. Burada eksik olan nedir ? İlgileneceklere şimdiden teşekkürler.
//STM32F103C8 8MHz HARİCİ Kristal PLL Açık
// BUTON A PORTU 0.pine bağlanacak Pull Down yapıldığı için +3V'dan verilecek
#define BUTON Button(&GPIOA_IDR,0,100,1) //KESMEDE GEREKLİ DEĞİL
#define BUTONB Button(&GPIOB_IDR,1,100,1)
void buton_kesme() iv IVT_INT_EXTI0 ics ICS_AUTO
{
EXTI_PR=1; //Kesme bayrağını temizle
GPIOC_ODR.B13=~GPIOC_ODR.B13;
GPIOB_ODR.B0=~GPIOB_ODR.B0;
}
void main() //********************************************
{
Delay_ms(500);
GPIO_Digital_Output(&GPIOB_ODR,_GPIO_PINMASK_0);
GPIO_Digital_Output(&GPIOC_ODR,_GPIO_PINMASK_13);
GPIO_Digital_Input(&GPIOA_IDR,_GPIO_PINMASK_0); // ????????
GPIO_Digital_Input(&GPIOB_IDR,_GPIO_PINMASK_1); // ????????
GPIO_Set_Pin_Mode(&GPIOA_BASE,_GPIO_PIN_0,_GPIO_CFG_MODE_INPUT | _GPIO_CFG_PULL_DOWN);
//GPIO_Config(&GPIOB_BASE,_GPIO_PINMASK_1,_GPIO_CFG_PULL_DOWN); //Bir başka Pulldown yapma usulü
GPIO_Set_Pin_Mode(&GPIOB_BASE,_GPIO_PIN_1,_GPIO_CFG_MODE_INPUT | _GPIO_CFG_PULL_DOWN);
AFIO_EXTICR1=0; //PORTA İÇİN "0".PORTB İÇİN "1" VS.
EXTI_FTSR=0; //0 idi DÜŞEN KENAR TETİKLEME YOK.
EXTI_RTSR=1; //1 idi YÜKSELEN KENAR TETİKLEEME VAR
EXTI_IMR=1; //1 idi
EXTI_EMR=0; //0 idi
EXTI_PR=1; //1 idi //Kesmeye girince 0 oluyor.Kesme bayrağı
NVIC_IntEnable(IVT_INT_EXTI0); // Harici kesmeye izin ver.
//RCC_APB2ENR.AFIOEN=1; // ALTERNATİF FONK. I/O CLOCK (*)Açıklama aşağıda
//RCC_APB2ENR.IOPBEN=1; // B PORTU CLOCK ENABLE (*)
while(1)
{
}
}
/* (*) Kesme sadece A0 pininde çalışıyor. B portu 1. pini için dataseheet incelemesine göre benim yap
tığım ilave.Ancak sonuç alınamadı.*/
//STM32F103C8 8MHz HARİCİ Kristal PLL Açık
// BUTON B PORTU 1.pine bağlanacak Pull Down yapıldığı için +3V'dan verilecek
#define BUTON Button(&GPIOA_IDR,0,100,1) //KESMEDE GEREKLİ DEĞİL
#define BUTONB Button(&GPIOB_IDR,1,100,1)
void buton_kesme() iv IVT_INT_EXTI1 ics ICS_AUTO
{
EXTI_PR=1; //Kesme bayrağını temizle
GPIOC_ODR.B13=~GPIOC_ODR.B13;
GPIOB_ODR.B0=~GPIOB_ODR.B0;
}
void main() //********************************************
{
Delay_ms(500);
GPIO_Digital_Output(&GPIOB_ODR,_GPIO_PINMASK_0);
GPIO_Digital_Output(&GPIOC_ODR,_GPIO_PINMASK_13);
GPIO_Digital_Input(&GPIOA_IDR,_GPIO_PINMASK_0); // ????????
GPIO_Digital_Input(&GPIOB_IDR,_GPIO_PINMASK_1); // ????????
GPIO_Set_Pin_Mode(&GPIOA_BASE,_GPIO_PIN_0,_GPIO_CFG_MODE_INPUT | _GPIO_CFG_PULL_DOWN);
//GPIO_Config(&GPIOB_BASE,_GPIO_PINMASK_1,_GPIO_CFG_PULL_DOWN); //Bir başka Pulldown yapma usulü
GPIO_Set_Pin_Mode(&GPIOB_BASE,_GPIO_PIN_1,_GPIO_CFG_MODE_INPUT | _GPIO_CFG_PULL_DOWN);
AFIO_EXTICR1=1; //PORTA İÇİN "0".PORTB İÇİN "1" VS.
EXTI_FTSR=0; //0 idi DÜŞEN KENAR TETİKLEME YOK.
EXTI_RTSR=1; //1 idi YÜKSELEN KENAR TETİKLEEME VAR
EXTI_IMR=1; //1 idi
EXTI_EMR=0; //0 idi
EXTI_PR=1; //1 idi //Kesmeye girince 0 oluyor.Kesme bayrağı
NVIC_IntEnable(IVT_INT_EXTI1); // Harici kesmeye izin ver.
RCC_APB2ENR.AFIOEN=1; // ALTERNATİF FONK. I/O CLOCK (*)Açıklama aşağıda
RCC_APB2ENR.IOPBEN=1; // B PORTU CLOCK ENABLE (*)
while(1)
{
}
}
/* (*) Kesme sadece A0 pininde çalışıyor. B portu 1. pini için dataseheet incelemesine göre benim yap
tığım ilave.Ancak sonuç alınamadı.*/
https://drive.google.com/drive/folders/0B1XWQs68BUsobkRCUWI0U3BnTk0?usp=sharing
https://drive.google.com/drive/folders/0B1XWQs68BUsoeHhXN2JJQUlFWlU?usp=sharing
@mg1980 B portunun 0. pinini deniyorsunuz değil mi?
Çünkü B portunun 1. pini için şunu yazmanız gerek:
AFIO_EXTICR1=16;
Hocam,
İlginize teşekkürler.
B portunun 1.pinini Pulldown yapmış olarak +3v veriyorum. 16 yazdığım halde olmadı. Neden 16 ?
B0 olsaydi 1 yazmaniz yeterliyildi.
Ama siz b1 kullandiginiz icin registerin 4. bitini 1 yapmalisiniz. Reference manualde çok açık.
Ayrica kodun calisabilmesi icin diger duzenlemeleri de yapmalisiniz.
Hocam,
Çalışan kod ve kitabınızdaki açıklamalar doğrultusunda B portu 1. pin için gerekeni (kullanıcı el kitabına uygun olarak)yaptığımı düşünüyorum. 4.bit konusuna biraz kafa yoracağım.İnşallah sonuç alırız.Saygılar.
Alıntı yapılan: mg1980 - 05 Ocak 2017, 22:44:31
Çalışan kod ve kitabınızdaki açıklamalar doğrultusunda B portu 1. pin için gerekeni (kullanıcı el kitabına uygun olarak)yaptığımı düşünüyorum.
Kitaba uygun yapmamışsınız.
Registerlara iyi bakın.
ref manual s.210'dan itibaren inceleyin.
Ayrıca s.191'i de inceleyin.