08-12-2019, Saat: 14:39
BOŞ PROJE Oluşturma isimli makalemizin hemen devamı olan bu konumuzda LED YAK SÖNDÜR TIVA örneğimizi ele alacağız. Bu anlatacağımız konular bundan sonraki hemen hemen tüm TIVA elektronik kodlama işlemlerinde temel olacaktır. Yani ARM programlama başlıyor.
TIVA yı aşağıda resmi görülen ALTLIK ile birlikte kodlama yapıp dış dünya ile konnektörlerindeki vidalar ile bağlantılarını saatçi tornavidasını kullanarak yapacağız. Bu altlıkta DIŞ dünyaya çıkartılmış 35 Adet AKTİF PIN vardır. isimleri ALTLIK taki plaket üzerinde F1, F2 gibi yazılarla PORT ve PIN isimleri belirtilmiş ayrıca GND ile de TIVA'nın EKSİ uçları çeşitli konnektörlerden dış dünyaya çıkartılmıştır. Kısaca bizim ELEKTRONİK (ROBOTİK) KODLAMA alt yapımızda bu KART'ımızı (kod adı USCO-01) kullanacağız.
[attachment=864]
ARM KEIL proje yöneticisinden, hello.c dosyasını SOL taraftaki pencereden çift tıklayarak EDITOR penceresinde açalım. ilk 1-24 satırlar proje ile alakalı bilgilendirme ve yasal yayın hakları bilgilendirmeleri vardır. Bu HELLO "Merhaba Dünya" projesi TIVA kartımızdaki MAVİ LED'i 1 sn süre ile YAKIP, 1 sn süre ile SÖNDÜRME işlemini yapar. Aynı zaman da her RESET düğmesine basıldığında da, USB kablosu üzerinden MCU'dan PC'ye doğru "Helloi World" yazısını gönderir ve hemen arkasından MAVİ LED'i birer saniye aralıklarla yakıp söndürür.
Arkadaşlar ARM programlama da hangi proje olursa olsun size tavsiyem okuma yorumlama işlemine İLK satırlardan devam eden satırlara doğru okumaya veya anlamaya çalışmayın. PROJE yöneticisindeki (Sol Pencere) sekmelerden {}Function sekmesini açarak projeye DAHİL olan DOSYA lardaki methodları (procedure veya fonksiyon) açarak ilk çalıştırılacak olan main (void) metodundan itibaren okumaya - anlamaya başlayınız.
[attachment=863]
Karşımıza gelen ilk komuttan itibaren kodlamayı anlamaya çalışalım.
// MCU içinde REAL sayılarla ondalıklı (virgüllü) işlemler yapmaya izin ver.
ROM_FPULazyStackingEnable();
// Ana kristal kullanılarak PLL ile 200 MHz üret. Sonra bu 200 MHz'i 4' böl. MCU'yu 50 MHz de çalıştır.
ROM_SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ | SYSCTL_OSC_MAIN);
// TIVA kartının üzerinde bulanan kullanıcı LED'lerini GİRİŞ/ÇIKIŞ işlemleri için KULLAN. Burada F Portu seçildi.
// F1,F2,F3 USCO-01 altlık kartımızda DIGITAL OUTPUT kategorisinde konnetörü ile birlikte çıkartılmıştır.
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
// F portuna ait 2.PIN'i ÇIKIŞ olarak AKTİF et. GPIO = Generel Pupose Input Output demektir. Genel amaçlı giriş çıkış.
ROM_GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_2);
// UART ayarlarını gerçekleştir. Bu adımdan sonra İNCELEMEYE-ANLAMAYA hemen UART metoduna giderek devam ediniz. Çünkü MCU da böyle yapacak. Makale olarak yazdığımız için UART metodunu MAIN metodundan önce yazmamız gerekirdi. Ama hiyerarşiyi bozmamak adına UART metodunu aşağıda yazmaya devam edeceğim.
ConfigureUART();
// MCU'dan PC'ye "Merhaba Dünya" bilgisini gönder ..
UARTprintf("Hello, world!\n");
// Sonsuz döngüyü başlatma komutu ..
while(1)
// Sonsuz döngü BLOK başı..
{
// MAVİ LED'i yak
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, GPIO_PIN_2);
// Bir BIT bekle (50.000.000 / 10 / 3)
SysCtlDelay(SysCtlClockGet() / 10 / 3);
// MAVİ LED'i söndür
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, 0);
// Bir BIT bekle (50.000.000 / 10 / 3)
SysCtlDelay(SysCtlClockGet() / 10 / 3);
// Sonsuz döngü BLOK sonu..
}
Böylece LED YAK SÖNDÜR uygulamasını anlamaya yorumlamaya çalıştık.
25 ve 36. satırlar arasında ise projeye dahil (include) edilen kütüphanelerin listesini verelim. Bu liste hemen hemen tüm uygulamalarda standart olarak kullanılır.
#include <stdint.h>
#include <stdbool.h>
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/debug.h"
#include "driverlib/fpu.h"
#include "driverlib/gpio.h"
#include "driverlib/pin_map.h"
#include "driverlib/rom.h"
#include "driverlib/sysctl.h"
#include "driverlib/uart.h"
#include "utils/uartstdio.h"
Son olarak tüm KODLAMA nın tamamını verelim.
TIVA yı aşağıda resmi görülen ALTLIK ile birlikte kodlama yapıp dış dünya ile konnektörlerindeki vidalar ile bağlantılarını saatçi tornavidasını kullanarak yapacağız. Bu altlıkta DIŞ dünyaya çıkartılmış 35 Adet AKTİF PIN vardır. isimleri ALTLIK taki plaket üzerinde F1, F2 gibi yazılarla PORT ve PIN isimleri belirtilmiş ayrıca GND ile de TIVA'nın EKSİ uçları çeşitli konnektörlerden dış dünyaya çıkartılmıştır. Kısaca bizim ELEKTRONİK (ROBOTİK) KODLAMA alt yapımızda bu KART'ımızı (kod adı USCO-01) kullanacağız.
[attachment=864]
ARM KEIL proje yöneticisinden, hello.c dosyasını SOL taraftaki pencereden çift tıklayarak EDITOR penceresinde açalım. ilk 1-24 satırlar proje ile alakalı bilgilendirme ve yasal yayın hakları bilgilendirmeleri vardır. Bu HELLO "Merhaba Dünya" projesi TIVA kartımızdaki MAVİ LED'i 1 sn süre ile YAKIP, 1 sn süre ile SÖNDÜRME işlemini yapar. Aynı zaman da her RESET düğmesine basıldığında da, USB kablosu üzerinden MCU'dan PC'ye doğru "Helloi World" yazısını gönderir ve hemen arkasından MAVİ LED'i birer saniye aralıklarla yakıp söndürür.
Arkadaşlar ARM programlama da hangi proje olursa olsun size tavsiyem okuma yorumlama işlemine İLK satırlardan devam eden satırlara doğru okumaya veya anlamaya çalışmayın. PROJE yöneticisindeki (Sol Pencere) sekmelerden {}Function sekmesini açarak projeye DAHİL olan DOSYA lardaki methodları (procedure veya fonksiyon) açarak ilk çalıştırılacak olan main (void) metodundan itibaren okumaya - anlamaya başlayınız.
[attachment=863]
Karşımıza gelen ilk komuttan itibaren kodlamayı anlamaya çalışalım.
// MCU içinde REAL sayılarla ondalıklı (virgüllü) işlemler yapmaya izin ver.
ROM_FPULazyStackingEnable();
// Ana kristal kullanılarak PLL ile 200 MHz üret. Sonra bu 200 MHz'i 4' böl. MCU'yu 50 MHz de çalıştır.
ROM_SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ | SYSCTL_OSC_MAIN);
// TIVA kartının üzerinde bulanan kullanıcı LED'lerini GİRİŞ/ÇIKIŞ işlemleri için KULLAN. Burada F Portu seçildi.
// F1,F2,F3 USCO-01 altlık kartımızda DIGITAL OUTPUT kategorisinde konnetörü ile birlikte çıkartılmıştır.
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
// F portuna ait 2.PIN'i ÇIKIŞ olarak AKTİF et. GPIO = Generel Pupose Input Output demektir. Genel amaçlı giriş çıkış.
ROM_GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_2);
// UART ayarlarını gerçekleştir. Bu adımdan sonra İNCELEMEYE-ANLAMAYA hemen UART metoduna giderek devam ediniz. Çünkü MCU da böyle yapacak. Makale olarak yazdığımız için UART metodunu MAIN metodundan önce yazmamız gerekirdi. Ama hiyerarşiyi bozmamak adına UART metodunu aşağıda yazmaya devam edeceğim.
ConfigureUART();
void ConfigureUART(void)
{
// UART (Seri Port işlemleri) kullanılacak PORT'u SEÇ
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
// UART0'ı SEÇ (0'dan 7'ye kadar 8 adet var..
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
// UART0 için Receive ve Transmit (RX, TX) PORT VE PIN'leri NE OLSUN?
ROM_GPIOPinConfigure(GPIO_PA0_U0RX);
ROM_GPIOPinConfigure(GPIO_PA1_U0TX);
ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
// Ana osilatör olan 16 MHz kristali kullan. PUTTY terminal yazılımı ile 115200 Baud ve 8N1 ayarları ile PC ye bağlan.
UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC);
UARTStdioConfig(0, 115200, 16000000);
}
// MCU'dan PC'ye "Merhaba Dünya" bilgisini gönder ..
UARTprintf("Hello, world!\n");
// Sonsuz döngüyü başlatma komutu ..
while(1)
// Sonsuz döngü BLOK başı..
{
// MAVİ LED'i yak
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, GPIO_PIN_2);
// Bir BIT bekle (50.000.000 / 10 / 3)
SysCtlDelay(SysCtlClockGet() / 10 / 3);
// MAVİ LED'i söndür
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, 0);
// Bir BIT bekle (50.000.000 / 10 / 3)
SysCtlDelay(SysCtlClockGet() / 10 / 3);
// Sonsuz döngü BLOK sonu..
}
Böylece LED YAK SÖNDÜR uygulamasını anlamaya yorumlamaya çalıştık.
25 ve 36. satırlar arasında ise projeye dahil (include) edilen kütüphanelerin listesini verelim. Bu liste hemen hemen tüm uygulamalarda standart olarak kullanılır.
#include <stdint.h>
#include <stdbool.h>
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/debug.h"
#include "driverlib/fpu.h"
#include "driverlib/gpio.h"
#include "driverlib/pin_map.h"
#include "driverlib/rom.h"
#include "driverlib/sysctl.h"
#include "driverlib/uart.h"
#include "utils/uartstdio.h"
Son olarak tüm KODLAMA nın tamamını verelim.
Kod:
#include <stdint.h>
#include <stdbool.h>
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/debug.h"
#include "driverlib/fpu.h"
#include "driverlib/gpio.h"
#include "driverlib/pin_map.h"
#include "driverlib/rom.h"
#include "driverlib/sysctl.h"
#include "driverlib/uart.h"
#include "utils/uartstdio.h"
//*****************************************************************************
#ifdef DEBUG
void
__error__(char *pcFilename, uint32_t ui32Line)
{
}
#endif
void ConfigureUART(void)
{
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
ROM_GPIOPinConfigure(GPIO_PA0_U0RX);
ROM_GPIOPinConfigure(GPIO_PA1_U0TX);
ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC);
UARTStdioConfig(0, 115200, 16000000);
}
int main(void)
{
ROM_FPULazyStackingEnable();
ROM_SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ | SYSCTL_OSC_MAIN);
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
ROM_GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_2);
ConfigureUART();
UARTprintf("Hello, world!\n");
while(1)
{
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, GPIO_PIN_2);
SysCtlDelay(SysCtlClockGet() / 10 / 3);
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, 0);
SysCtlDelay(SysCtlClockGet() / 10 / 3);
}
}