void init_port_F() {
volatile unsigned long tmp;
SYSCTL_RCGCGPIO_R |= 0x00000020; // Port F’nin saatini aktifleştir
tmp = SYSCTL_RCGCGPIO_R; // Saatin başlaması için gecikme
GPIO_PORTF_LOCK_R = 0x4C4F434B; // Port F GPIO kilidini aç
GPIO_PORTF_CR_R = 0x1F; // PF4-0 kilidini aç
GPIO_PORTF_AMSEL_R = 0x00; // PF anlog I/O kapat
GPIO_PORTF_PCTL_R = 0x00000000; // PF4-0 GPIO olarak ayarla
GPIO_PORTF_DIR_R = 0x0E; // PF4,PF0 giriş, PF3-1 çıkış
GPIO_PORTF_AFSEL_R = 0x00; // PF7-0 Alternatif fonksiyonları kapat
GPIO_PORTF_PUR_R = 0x11; // PF0 ve PF4 üzerindeki pull-up direncini
// aktifleştir
GPIO_PORTF_DEN_R = 0x1F; // PF4-0 digital I/O aktifleştir
}
void init_port_B() {
volatile unsigned long delay;
SYSCTL_RCGC2_R |= SYSCTL_RCGC2_GPIOB;
delay = SYSCTL_RCGC2_R;
GPIO_PORTB_DIR_R |= 0xFF;
GPIO_PORTB_AFSEL_R &= ~0xFF;
GPIO_PORTB_DEN_R |= 0xFF;
}
uint8_t kodlar[] = {
0b00111111,
0b00000110,
0b01011011,
0b01001111,
0b01100110,
0b01101101,
0b01111101,
0b00000111,
0b01111111,
0b01101111
};
volatile int sayi = 0;
// seven segmentte aralarda bekleyerek 0'dan 9'a say
void islem_1() {
volatile unsigned long delay;
GPIO_PORTB_DATA_R = kodlar[sayi];
for (delay = 0 ; delay < 2000000 ; delay++)
/* */;
sayi = (sayi + 1) % 10;
}
// button basiliysa ledi yak, degilse sondur
void islem_2() {
if (GPIO_PORTF_DATA_R & 0b00001 == 0) {
GPIO_PORTF_DATA_R |= 0b00100;
} else {
GPIO_PORTF_DATA_R &= ~0b00100;
}
}
int main() {
volatile unsigned long delay;
init_port_B();
init_port_F();
// surekli islem_1 ve islem_2'yi yap
while (1) {
islem_1();
islem_2();
}
}
-
Nested Vector Interrup Controller (NVIC)
EXPORT __Vectors
__Vectors ; address ISR
DCD StackMem + Stack ; 0x00000000 Top of Stack
DCD Reset_Handler ; 0x00000004 Reset Handler
DCD NMI_Handler ; 0x00000008 NMI Handler
DCD HardFault_Handler ; 0x0000000C Hard Fault Handler
. . .
. . .
. . .
DCD PendSV_Handler ; 0x00000038 PendSV Handler
DCD SysTick_Handler ; 0x0000003C SysTick Handler
. . .
. . .
. . .
DCD FlashCtl_Handler ; 0x000000B4 Flash Control
DCD GPIOPortF_Handler ; 0x000000B8 GPIO Port F
-
DCD, 32-bitlik bir sabiti tanımlayan bir assembler sözde-op’dır.
EXPORT __Vectors
__Vectors ; address ISR
DCD StackMem + Stack ; 0x00000000 Top of Stack
DCD Reset_Handler ; 0x00000004 Reset Handler
DCD NMI_Handler ; 0x00000008 NMI Handler
DCD HardFault_Handler ; 0x0000000C Hard Fault Handler
. . .
. . .
. . .
DCD PendSV_Handler ; 0x00000038 PendSV Handler
DCD SysTick_Handler ; 0x0000003C SysTick Handler
. . .
. . .
. . .
DCD FlashCtl_Handler ; 0x000000B4 Flash Control
DCD GPIOPortF_Handler ; 0x000000B8 GPIO Port F
-
Interrupt Service Rutine fonksiyonun bulunduğu bellek konumuna işaret eden ilişkili 32 bitlik bir vektör
EXPORT __Vectors
__Vectors ; address ISR
DCD StackMem + Stack ; 0x00000000 Top of Stack
DCD Reset_Handler ; 0x00000004 Reset Handler
DCD NMI_Handler ; 0x00000008 NMI Handler
DCD HardFault_Handler ; 0x0000000C Hard Fault Handler
. . .
. . .
. . .
DCD PendSV_Handler ; 0x00000038 PendSV Handler
DCD SysTick_Handler ; 0x0000003C SysTick Handler
. . .
. . .
. . .
DCD FlashCtl_Handler ; 0x000000B4 Flash Control
*DCD GPIOPortF_Handler ; 0x000000B8 GPIO Port F*
void init_port_F() {
volatile unsigned long tmp;
SYSCTL_RCGCGPIO_R |= 0x00000020; // Port F’nin saatini aktifleştir
tmp = SYSCTL_RCGCGPIO_R; // Saatin başlaması için gecikme
GPIO_PORTF_LOCK_R = 0x4C4F434B; // Port F GPIO kilidini aç
GPIO_PORTF_CR_R = 0x1F; // PF4-0 kilidini aç
GPIO_PORTF_AMSEL_R = 0x00; // PF anlog I/O kapat
GPIO_PORTF_PCTL_R = 0x00000000; // PF4-0 GPIO olarak ayarla
GPIO_PORTF_DIR_R = 0x0E; // PF4,PF0 giriş, PF3-1 çıkış
GPIO_PORTF_AFSEL_R = 0x00; // PF7-0 Alternatif fonksiyonları kapat
GPIO_PORTF_PUR_R = 0x11; // PF0 ve PF4 üzerindeki pull-up direncini
// aktifleştir
GPIO_PORTF_DEN_R = 0x1F; // PF4-0 digital I/O aktifleştir
}
/** systick_handler() fonksiyonu her systick kesmesi olduğunda çalışacak. */
void systick_handler() {
// ledin durumunu ters cevir
GPIO_PORTF_DATA_R ^= 0b00010;
}
-
SysTick’i kapatmak için ENABLE bitini temizlenir
/** SysTick_Init() fonksiyonu systick kesmesini aktifleştiriyor. Kaç saniyede bir kesme üretileceğini verilen period parametresine
göre ayarlanıyor. */
void SysTick_Init(unsigned long period){
NVIC_ST_CTRL_R = 0; // SysTick'i kapatmak için ENABLE bitini temizlenir
NVIC_ST_RELOAD_R = period-1; // RELOAD saklayıcısı ayarlanır
NVIC_ST_CURRENT_R = 0; // Sayacı silmek için NVIC_ST_CURRENT_R'ye herhangi bir
// değer yazılır
NVIC_SYS_PRI3_R = (NVIC_SYS_PRI3_R&0x00FFFFFF)|0x40000000;
// NVIC_SYS_PRI3_R kaydında TICK alanını kullanarak SysTick kesmelerinin önceliğini
oluşturulur
NVIC_ST_CTRL_R = 0x07; // NVIC_ST_CTRL_R kontrol saklayıcısına istenen modu yazılır
}
/** SysTick_Init() fonksiyonu systick kesmesini aktifleştiriyor. Kaç saniyede bir kesme üretileceğini verilen period parametresine göre ayarlanıyor. */
void SysTick_Init(unsigned long period){
NVIC_ST_CTRL_R = 0; // SysTick'i kapatmak için ENABLE bitini temizlenir
NVIC_ST_RELOAD_R = period-1; // RELOAD saklayıcısı ayarlanır
NVIC_ST_CURRENT_R = 0; // Sayacı silmek için NVIC_ST_CURRENT_R'ye herhangi bir
// değer yazılır
NVIC_SYS_PRI3_R = (NVIC_SYS_PRI3_R&0x00FFFFFF)|0x40000000;
// NVIC_SYS_PRI3_R kaydında TICK alanını kullanarak SysTick kesmelerinin önceliğini
oluşturulur
NVIC_ST_CTRL_R = 0x07; // NVIC_ST_CTRL_R kontrol saklayıcısına istenen modu yazılır
}
/** SysTick_Init() fonksiyonu systick kesmesini aktifleştiriyor. Kaç saniyede bir kesme üretileceğini verilen period parametresine göre ayarlanıyor. */
void SysTick_Init(unsigned long period){
NVIC_ST_CTRL_R = 0; // SysTick'i kapatmak için ENABLE bitini temizlenir
NVIC_ST_RELOAD_R = period-1; // RELOAD saklayıcısı ayarlanır
NVIC_ST_CURRENT_R = 0; // Sayacı silmek için NVIC_ST_CURRENT_R'ye herhangi bir
// değer yazılır
NVIC_SYS_PRI3_R = (NVIC_SYS_PRI3_R&0x00FFFFFF)|0x40000000;
// NVIC_SYS_PRI3_R kaydında TICK alanını kullanarak SysTick kesmelerinin önceliğini
oluşturulur
NVIC_ST_CTRL_R = 0x07; // NVIC_ST_CTRL_R kontrol saklayıcısına istenen modu yazılır
}
/** SysTick_Init() fonksiyonu systick kesmesini aktifleştiriyor. Kaç saniyede bir kesme üretileceğini verilen period parametresine göre ayarlanıyor. */
void SysTick_Init(unsigned long period){
NVIC_ST_CTRL_R = 0; // SysTick'i kapatmak için ENABLE bitini temizlenir
NVIC_ST_RELOAD_R = period-1; // RELOAD saklayıcısı ayarlanır
NVIC_ST_CURRENT_R = 0; // Sayacı silmek için NVIC_ST_CURRENT_R'ye herhangi bir
// değer yazılır
NVIC_SYS_PRI3_R = (NVIC_SYS_PRI3_R&0x00FFFFFF)|0x40000000;
// NVIC_SYS_PRI3_R kaydında TICK alanını kullanarak SysTick kesmelerinin önceliğini
oluşturulur
NVIC_ST_CTRL_R = 0x07; // NVIC_ST_CTRL_R kontrol saklayıcısına istenen modu yazılır
}
/** SysTick_Init() fonksiyonu systick kesmesini aktifleştiriyor. Kaç saniyede bir kesme üretileceğini verilen period parametresine göre ayarlanıyor. */
void SysTick_Init(unsigned long period){
NVIC_ST_CTRL_R = 0; // SysTick'i kapatmak için ENABLE bitini temizlenir
NVIC_ST_RELOAD_R = period-1; // RELOAD saklayıcısı ayarlanır
NVIC_ST_CURRENT_R = 0; // Sayacı silmek için NVIC_ST_CURRENT_R'ye herhangi bir
// değer yazılır
NVIC_SYS_PRI3_R = (NVIC_SYS_PRI3_R&0x00FFFFFF)|0x40000000;
// NVIC_SYS_PRI3_R kaydında TICK alanını kullanarak SysTick kesmelerinin önceliğini
oluşturulur
NVIC_ST_CTRL_R = 0x07; // NVIC_ST_CTRL_R kontrol saklayıcısına istenen modu yazılır
}
-
SysTick, saat frekansında azalma sağlayan 24 bitlik bir sayacı vardır.
-
CURRENT değeri 1’den 0’a iner, COUNT bayrağı set olur.
-
Bir sonraki saatte CURRENT RELOAD değeri ile yüklenir.
-
Bu şekilde, SysTick sayacı (CURRENT) sürekli olarak azalmaktadır.
-
RELOAD değeri n ise, SysTick sayacı modulo n + 1 ile çalışır.
-
COUNT bayrağı her n + 1 sayıda ayarlanacaktır.
int main() {
init_port_F();
SysTick_Init(1600000); // 1600000 clockta bir kesme uret
// islemcinin frekansi 16Mhz = 16000000
// 1600000/16000000 = 0.1 saniyede bir kesme uretir
enable_interrupts();
while (1) {
wait_for_interrupt();
}
}
static inline void disable_interrupts() { //Kesmeleri pasif yap
asm("CPSID I");
}
static inline void enable_interrupts() { // Kesmeleri aktifleştir
asm("CPSIE I");
}
static inline void wait_for_interrupt() { // Kesme olana kadar bekle
asm("WFI");
}
void init_port_F() {
volatile unsigned long tmp;
SYSCTL_RCGCGPIO_R |= 0x00000020; // Port F’nin saatini aktifleştir
tmp = SYSCTL_RCGCGPIO_R; // Saatin başlaması için gecikme
GPIO_PORTF_LOCK_R = 0x4C4F434B; // Port F GPIO kilidini aç
GPIO_PORTF_CR_R = 0x1F; // PF4-0 kilidini aç
GPIO_PORTF_AMSEL_R = 0x00; // PF anlog I/O kapat
GPIO_PORTF_PCTL_R = 0x00000000; // PF4-0 GPIO olarak ayarla
GPIO_PORTF_DIR_R = 0x0E; // PF4,PF0 giriş, PF3-1 çıkış
GPIO_PORTF_AFSEL_R = 0x00; // PF7-0 Alternatif fonksiyonları kapat
GPIO_PORTF_PUR_R = 0x11; // PF0 ve PF4 üzerindeki pull-up direncini
// aktifleştir
GPIO_PORTF_DEN_R = 0x1F; // PF4-0 digital I/O aktifleştir
}
void init_port_B() {
volatile unsigned long delay;
SYSCTL_RCGC2_R |= SYSCTL_RCGC2_GPIOB;
delay = SYSCTL_RCGC2_R;
GPIO_PORTB_DIR_R |= 0xFF;
GPIO_PORTB_AFSEL_R &= ~0xFF;
GPIO_PORTB_DEN_R |= 0xFF;
}
uint8_t kodlar[] = {
0b00111111,
0b00000110,
0b01011011,
0b01001111,
0b01100110,
0b01101101,
0b01111101,
0b00000111,
0b01111111,
0b01101111
};
volatile int sayi = 0;
void systick_handler() { // systick kesmesi oldugunda bu fonksiyon calisacak
sayi = (sayi + 1) % 10;
GPIO_PORTB_DATA_R = kodlar[sayi];
}
/** SysTick_Init() fonksiyonu systick kesmesini aktifleştiriyor. Kaç saniyede bir kesme üretileceğini verilen period parametresine göre ayarlanıyor. */
void SysTick_Init(unsigned long period){
NVIC_ST_CTRL_R = 0; // SysTick'i kapatmak için ENABLE bitini temizlenir
NVIC_ST_RELOAD_R = period-1; // RELOAD saklayıcısı ayarlanır
NVIC_ST_CURRENT_R = 0; // Sayacı silmek için NVIC_ST_CURRENT_R'ye herhangi bir
// değer yazılır
NVIC_SYS_PRI3_R = (NVIC_SYS_PRI3_R&0x00FFFFFF)|0x40000000;
// NVIC_SYS_PRI3_R kaydında TICK alanını kullanarak SysTick kesmelerinin önceliğini
oluşturulur
NVIC_ST_CTRL_R = 0x07; // NVIC_ST_CTRL_R kontrol saklayıcısına istenen modu yazılır
}
static inline void disable_interrupts() { //Kesmeleri pasif yap
asm("CPSID I");
}
static inline void enable_interrupts() { // Kesmeleri aktifleştir
asm("CPSIE I");
}
static inline void wait_for_interrupt() { // Kesme olana kadar bekle
asm("WFI");
}
// button basiliysa ledi yak, degilse sondur
void islem_2() {
if (GPIO_PORTF_DATA_R & 0b00001 == 0) {
GPIO_PORTF_DATA_R |= 0b00100;
} else {
GPIO_PORTF_DATA_R &= ~0b00100;
}
}