Sistem Programlama 9. Hafta Doküman 3
Buton Kesmesi
PortF’deki butonda kesme kullanımı
Bu örnek işlemciyi farklı frekansta çalıştırma ayarlarını içermektedir. Yorum satırlarını aktifleştirip farklı parametrelerle deneyebilirsiniz.
startup_gcc.c :
1) include kisimlarindan sonra asagidaki fonksiyon prototiplerini ekleyin
extern void PortF_interrupt_handler();
1) include kisimlarindan sonra asagidaki fonksiyon prototiplerini ekleyin
extern void PortF_interrupt_handler();
2) // The vector table yazan kisimdaki dizide aşağıdaki iki satırda:
IntDefaultHandler, // GPIO Port F
IntDefaultHandler, // GPIO Port F
IntDefaultHandler yerine ilgili fonksiyonları yazin
PortF_interrupt_handler, // GPIO Port F
PortF_interrupt_handler, // GPIO Port F
main.c :
#include <stdint.h>
#include <stdbool.h>
#include "inc/tm4c123gh6pm.h"
// stellaris icin: #include "inc/lm4f120h5qr.h"
static inline void disable_interrupts() {
asm("CPSID I");
}
static inline void enable_interrupts() {
asm("CPSIE I");
}
static inline void wait_for_interrupt() {
asm("WFI");
}
void init_port_F() {
volatile unsigned long tmp; // bu degisken gecikme yapmak icin gerekli
SYSCTL_RCGCGPIO_R |= 0x00000020; // 1) activate clock for Port F
tmp = SYSCTL_RCGCGPIO_R; // allow time for clock to start
GPIO_PORTF_LOCK_R = 0x4C4F434B; // 2) unlock GPIO Port F
GPIO_PORTF_CR_R = 0x1F; // allow changes to PF4-0
// only PF0 needs to be unlocked, other bits can't be locked
GPIO_PORTF_AMSEL_R = 0x00; // 3) disable analog on PF
GPIO_PORTF_PCTL_R = 0x00000000; // 4) PCTL GPIO on PF4-0
GPIO_PORTF_DIR_R = 0x0E; // 5) PF4,PF0 in, PF3-1 out
GPIO_PORTF_AFSEL_R = 0x00; // 6) disable alt funct on PF7-0
GPIO_PORTF_PUR_R = 0x11; // enable pull-up on PF0 and PF4
GPIO_PORTF_DEN_R = 0x1F; // 7) enable digital I/O on PF4-0
}
void PF4_interrupt_init() {
GPIO_PORTF_IS_R &= ~0b10000; // (d) PC4 is edge-sensitive
GPIO_PORTF_IBE_R &= ~0b10000; // PC4 is not both edges
GPIO_PORTF_IEV_R &= ~0b10000; // PC4 falling edge event
GPIO_PORTF_ICR_R = 0b10000; // (e) clear flag4
GPIO_PORTF_IM_R |= 0b10000; // (f) arm interrupt on PC4
/*
* PORT icin kullanilan degerlerin anlami icin
* http://users.ece.utexas.edu/~valvano/Volume1/E-Book/C12_Interrupts.htm#12_3
* Tablo 12.1'e bakiniz
*/
NVIC_PRI7_R = (NVIC_PRI7_R & 0xFF00FFFF) | 0x00A00000; // (g) priority 5
NVIC_EN0_R |= (1<<30); // (h) enable interrupt 30 in NVIC
}
volatile uint32_t kesme_sayisi = 0;
void PortF_interrupt_handler() {
disable_interrupts();
GPIO_PORTF_ICR_R = 0b10000; // clear interrupt flag4
kesme_sayisi++;
// yesil ledi ters cevir
GPIO_PORTF_DATA_R ^= 0b01000;
enable_interrupts();
}
int main() {
init_port_F();
PF4_interrupt_init();
enable_interrupts();
while (1) {
wait_for_interrupt();
}
}