Archive for the ‘ARM’ Category

Lm3s8962 float To Char*

  • Lm38962 altında float sayıları char dizisi haline getirmek için;

Kütüphane eklenmesi;

#include "IQmath/IQmathLib.h"

Gerekli kod işlemleri;

float sonuc;
char dizi[15];
_iq X;
X = _IQ(sonuc);
_IQtoa(dizi, "%5.10f", X);

çevrilen dizi uart ile gönderilebilir veya ekrana yazdırılabilir.

Kaynaklar

  1. Stellaris® IQmath Library
  2. indirme : http://www.ti.com/tool/sprc087
Reklamlar

rom.h & unresolved symbol

  • CCS 4 yeni bir proje başlatılıp, rom.h kullanıldığında  “unresolved symbol ROM_EthernetConfigSet, first referenced in ./ana.obj”  hata karşılıyor. Sadece header dosyasını eklemek yeterli değil fonksiyonların tanımlarınıda eklemek gerekiyor. Bunu düzeltmek için,

Properties > C/C++ Build > Tool Settings > TMS470 Compiler > Predefined Symbols: > Pre- define NAME kısmına aşağıdaki satır eklenir.

TARGET_IS_TEMPEST_RB1

eklenmesi gerekmektedir.

Kaynaklar
# http://e2e.ti.com/support/microcontrollers/stellaris_arm_cortex-m3_microcontroller/f/471/t/88396.aspx [erişim : 28.3.2012]

Protosocketler

Nedir ?

  • Protosocket kütüphanesi; uip stack için, geleneksel BSD socket arayüzünü sağlamaktadır.
  • Protosocket kütüphanesi, sequential şekilde çalışmaktadır.
  • Sadece TCP bağlantılarında çalışmaktadır.
  • Protosocket kütüphanesi, ardışıl kontrol akışı sağlamak için [[Protothread]] kullanmaktadır.
  • Protosocket kütüphanesi, verileri tekrar göndermeyi düşünmeden gönderme imkanı sağlayan fonksiyonlar sağlamaktadır.
  • Her protosocket, protothread olarak çalıştığı için PSOCK_BEGIN() ile başlamalıdır. ve PSOCK_EXIT() ile bitmektedir.

Gerekli Kütüphaneler

psock.h

Fonksiyonlar

  •  kullanılan struct yapısı örneği
// struct tanımlanıyor
typedef struct hello_world_state {
  struct psock p;
  char inputbuffer[10];
  char name[40];
} uip_tcp_appstate_t;
// struct kullanılmadan önce ayarlanıyor
struct hello_world_state *s = &(uip_conn->appstate);
  •  Protosocketi ilklendirmek
PSOCK_INIT(&s->p, s->inputbuffer, sizeof(s->inputbuffer));
  • protosocket kullanılmadan çağırılmalıdır.
  • İlk parametre; protosockette pointerdır.
  • protosocket için input buffer a pointerdır.
  • input buffer boyutudur.

; Protosocketi başlatmak için

PSOCK_BEGIN(&s->p);
  • Diğer protosocket çağırılarından önce çağrılmalıdır.
  • parametre; başlatılacak olan protosockete pointerdır.

; String göndermek için

char konsol [] = "TI > ";
PSOCK_SEND_STR(&s->p, konsol);
  • ilk parametre; protosockette pointerdır.
  • İkinci parametre gönderilmek istenen stringdir.

; Karşıdan gönderileni almak için

PSOCK_READTO(&s->p, '\n');
  • Belirtilen karaktere kadar okuma yapılıyor.
  • Karşıdan gönderilene struct yardımıyla ulaşılabiliyor.
  • ilk parametre; protosockette pointerdır.
  • İkinci parametre, okumanın durdulacağı karakter.

; Socketi kapatmak için

PSOCK_CLOSE(&s->p);
  • protosocketi kapatır.

! Kaynaklar

[1] uip-1.0-refman
[2] uip hello-world örneği
[3] luminary enet_uip örneği

LM3S8962 Buton Kullanım Örneği

  • LM3S8962 arm cortex m3 kartındaki butonları kullanan bir uygulamadır.
#include "inc/hw_gpio.h"
#include "inc/hw_ints.h"
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/debug.h"
#include "driverlib/gpio.h"
#include "driverlib/interrupt.h"
#include "driverlib/sysctl.h"
#include "drivers/rit128x96x4.h"
void
GPIOFIntHandler(void)
{
    //
    // Clear the GPIO interrupt.
    //
    GPIOPinIntClear(GPIO_PORTF_BASE, GPIO_PIN_1); 
    RIT128x96x4StringDraw("SELECT", 48, 32, 15);
}
void
GPIOEIntHandler(void)
{
    //
    // Clear the GPIO interrupt.
    //
   GPIOPinIntClear(GPIO_PORTE_BASE, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3);

   if(GPIOPinRead(GPIO_PORTE_BASE, GPIO_PIN_0) == 0)
		RIT128x96x4StringDraw("UP     ", 48, 32, 15);
   if(GPIOPinRead(GPIO_PORTE_BASE, GPIO_PIN_1) == 0)
		RIT128x96x4StringDraw("DOWN     ", 48, 32, 15);
   if(GPIOPinRead(GPIO_PORTE_BASE, GPIO_PIN_2) == 0)
		RIT128x96x4StringDraw("LEFT     ", 48, 32, 15);
   if(GPIOPinRead(GPIO_PORTE_BASE, GPIO_PIN_3) == 0)
		RIT128x96x4StringDraw("RIGHT     ", 48, 32, 15);  
}
int
main(void)
{
    //
    // Set the clocking to run directly from the crystal.
    //
    SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN |
                   SYSCTL_XTAL_8MHZ);
    //
    // Enable the peripherals used by this application.
    //
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);
    //
    // Configure the push button as an input and enable the pin to interrupt on
    // the falling edge (i.e. when the push button is pressed). basılmasında kesme olsun
    //
    GPIOPinTypeGPIOInput(GPIO_PORTF_BASE, GPIO_PIN_1);
    GPIOPadConfigSet(GPIO_PORTF_BASE, GPIO_PIN_1, GPIO_STRENGTH_2MA,
                     GPIO_PIN_TYPE_STD_WPU);
    GPIOIntTypeSet(GPIO_PORTF_BASE, GPIO_PIN_1, GPIO_FALLING_EDGE);
    GPIOPinIntEnable(GPIO_PORTF_BASE, GPIO_PIN_1);
    IntEnable(INT_GPIOF);

	//
	// E portu ayarlanıyor.
	//
    GPIOPinTypeGPIOInput(GPIO_PORTE_BASE, GPIO_PIN_0);
    GPIOPadConfigSet(GPIO_PORTE_BASE, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 
    				| GPIO_PIN_3, GPIO_STRENGTH_2MA,GPIO_PIN_TYPE_STD_WPU);
    GPIOIntTypeSet(GPIO_PORTE_BASE, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 
    				| GPIO_PIN_3, GPIO_FALLING_EDGE);
    GPIOPinIntEnable(GPIO_PORTE_BASE, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3);
    IntEnable(INT_GPIOE);
    //
    // Initialize the OLED display.
    //
    RIT128x96x4Init(1000000);
    RIT128x96x4StringDraw("But. Int Ex.", 30, 16, 15);
    //
    // Loop forever.  This loop simply exists to display on the OLED display
    //
    while(1)
    {   
    }
}
  • Select butonu için ve diğer butonlar için kesme tanımlandı.
  • OLED ayarlanıp, hangi butona basıldı ise ekranda o butonun adı yazdırılıyor.
  • startup_ccs.c dosyası altında butonlara tanımlanan kesmeler vektor tablosuna kaydedilir.
extern void GPIOFIntHandler(void);
extern void GPIOEIntHandler(void);
GPIOEIntHandler,                       // GPIO Port E
GPIOFIntHandler,                        // GPIO Port F

Kaynaklar

  1. Luminary Micro gpio_jtag örneği 

ARM Cortex-M3

Özellikleri

  • Cortex™-M3 32-bit mikroişlemcidir.
  • It has a 32-bit data path, a 32-bit register bank, and 32-bit memory interfaces
  • Cortex-M3 işlemci, ARMv7-M mimarisi tabanlı ilk ARM işlemcisidir. Tasarım amacı, güçte yüksek performans ve düşük maliyetli gömülü sistemdir.
  • Cortex-M3 işlemci, 3-stage pipeline gelişmiştir.
  • Harvard Mimarisi tabanlıdır.
  • branch speculation, single cycle multiply ve hardware divide özelliklerer sahiptir.
  • Sadece Thumb-2 komut kümesi desktelenir.
  • Düşük maliyetli, düşük güç tüketimli 32 bit RISC işlemcidir.
  • CPU çekirdeğinin yanında, bir çok bileşene sahiptir. Bunlar; NVIC, MPU, Debug Access Port (DAP).
  • Sabit memory map sahiptir.

Kullanım Alanları

  • Düşük Maliyetli Mikrodenetleyicilerde
  • Endüstriyel kontrol sistemlerinde
  • kablosuz ağlarda
  • Otomobil gövde sistemlerinde
  • Tüketici Ürünlerinde
  • Veri iletişim Uygulamalarında : Örneğin Bluetooth ve ZigBee

Cortex-m3 işlemci ile Cortex-m3 tabanlı MCU

  • Cortex-m3 işlemcisi mikrodenetleyici chipin cpusudur. Buna ek olarak, Cortex-m3 tabanlı mikrodenetleyici başka bileşenlerede ihtiyaç duymaktadır.
  • Chip üreticileri Cortex-m3 işlemcisi lisansını aldıktan sonra , cortex-m3 işlemcisini kendi silikon tasarımlarına koymaktadırlar. Buna bellek, çevre ortamları ve giriş çıkışlar eklemektedirler. Her üreticinin farklı özelliklere sahip cortex-m3 tabanlı ürünleri mevcuttur.

Cortex-m3 ürünü seçim kriterleri

  • Çevrebirimi
  • Bellek
  • Saat Hızı
  • Kapladığı Alan (footprint)

Kaynaklar

[1] The Definitive Guide to the ARM CORTEX-M3, Joseph Yiu, 2nd Edition
[2] Workbook version 1-4 Stellaris Full Day.pdf
[3] Application Note 179 Cortex™-M3 Embedded Software Development

CCS 4 LM3S8962 Proje Oluşturma

 Mevcut Projeyi Dahil Etmek 

  • Project > Import Existing CCS/CCE Eclipse Project >

 Yeni Proje Oluşturmak 

  •  ”’File > New > CCS Project”’
  • “Project Name ” Kısmında projenin ismi belirlenir.
  •  “Project Type” kısmında ”’ARM”’ Seçilir.
  •  “Referenced Projects” kısımdan ”’driverlib”’ projeye dahil edilir.
  •  “CCS Project Settings” penceresinde “Device Variant” bölümünden gerekli mikrodenetleyici seçilir. Ben LM3S8962 seçiyorum.
  •  Projeyi oluşturduk ancak herhangi bir kaynak dosya koymadık. Ayar işlemlerini yapacak olan ”’startup”’ dosyasını oluştururuz. StellarisWare örneklerinden herhangi birinden kopyalanır.
  •  Projeye kaynak dosyası ekleriz. ”’File > New > Source File >”’ Kaynak Dosyanın ismi belirtilir.
  • ”’File > New > Target Configuration File”’ dosyası ile ayar dosyası projeye eklenir. General Setup bölümünde Board kısmından hedef board seçilir.
  •  Projenin özellikleri içinde ”’Properties > C/C++ Build > Build Steps > Post Build Step”’ altındaki Command kısmına altaki satır kopyalanır.
"${CCE_INSTALL_ROOT}/utils/tiobj2bin/tiobj2bin.bat" "${BuildArtifactFileName}" 
"${BuildArtifactFileBaseName}.bin" "${CG_TOOL_ROOT}/bin/ofd470.exe" "${CG_TOOL_ROOT}/bin/hex470.exe" 
"${CCE_INSTALL_ROOT}/utils/tiobj2bin/mkhex4bin.exe"
  •  driverlib.lib dosyası ekleniyor. ”’C/C++ Build > Tool Settings > Basic Settings: > TMS470 Linker > File Search Path > Include library~”’ altına eklenir.
"${workspace_loc:/driverlib/Debug/driverlib.lib}"
  •  ”’C/C++ Build > Tool Settings > Basic Settings: > TMS470 Compiler > Include Options”’ buraya derleyicinin bakacağı yolları ekliyoruz. Aşağıdaki iki yol ekleniyor:
C:\StellarisWare
C:\StellarisWare\boards\ek-lm3s8962
  •  Eğer LWIP bir proje yapılıyorsa şunlarda path eklenmesi gerekiyor:
"C:\StellarisWare\third_party\lwip-1.3.2\src\include"
"C:\StellarisWare\third_party\lwip-1.3.2\src\include\ipv4"
"C:\StellarisWare\third_party\lwip-1.3.2\apps"
"C:\StellarisWare\third_party\lwip-1.3.2\ports\stellaris\include"
"C:\StellarisWare\third_party"

 Kaynaklar
[1] Quickstart-Eval-Kit-CCS.pdf

LM3S8962 Buton Kullanım Örneği

Buton.c dosyası içeriği

  • Kütüphaneler dahil edililiyor
#include "inc/hw_gpio.h"
#include "inc/hw_ints.h"
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/debug.h"
#include "driverlib/gpio.h"
#include "driverlib/interrupt.h"
#include "driverlib/sysctl.h"
#include "drivers/rit128x96x4.h"
  •  Kartın üzerindeki Select butonu için kesme tanımlanıyor
void
GPIOFIntHandler(void)
{
    // Clear the GPIO interrupt.
    GPIOPinIntClear(GPIO_PORTF_BASE, GPIO_PIN_1);
    RIT128x96x4StringDraw("SELECT", 48, 32, 15);
}
  • Diğer butonlar(up,down,right,left) için kesme tanımlanıyor
void
GPIOEIntHandler(void)
{
    // Clear the GPIO interrupt.
   GPIOPinIntClear(GPIO_PORTE_BASE, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3);

   if(GPIOPinRead(GPIO_PORTE_BASE, GPIO_PIN_0) == 0)
		RIT128x96x4StringDraw("UP     ", 48, 32, 15);
   if(GPIOPinRead(GPIO_PORTE_BASE, GPIO_PIN_1) == 0)
		RIT128x96x4StringDraw("DOWN     ", 48, 32, 15);
   if(GPIOPinRead(GPIO_PORTE_BASE, GPIO_PIN_2) == 0)
		RIT128x96x4StringDraw("LEFT     ", 48, 32, 15);
   if(GPIOPinRead(GPIO_PORTE_BASE, GPIO_PIN_3) == 0)
		RIT128x96x4StringDraw("RIGHT     ", 48, 32, 15);
}
  • Ana Fonksiyon saat ayarlamaları yapılıyor
int
main(void)
{
    // Set the clocking to run directly from the crystal.
    SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN |
                   SYSCTL_XTAL_8MHZ);
  • Kullanılacak portlar aktif hale getiriliyor
    // Enable the peripherals used by this application.
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);
  •  Butonlar giriş olarak ayarlanıyor. Butonların kesmelerinin düşen kenara göre ayarlanıyor.  Kesme aktif hale getiriliyor.
    GPIOPinTypeGPIOInput(GPIO_PORTF_BASE, GPIO_PIN_1);
    GPIOPadConfigSet(GPIO_PORTF_BASE, GPIO_PIN_1, GPIO_STRENGTH_2MA,
                     GPIO_PIN_TYPE_STD_WPU);
    GPIOIntTypeSet(GPIO_PORTF_BASE, GPIO_PIN_1, GPIO_FALLING_EDGE);
    GPIOPinIntEnable(GPIO_PORTF_BASE, GPIO_PIN_1);
    IntEnable(INT_GPIOF);

	// E portu ayarlanıyor.
    GPIOPinTypeGPIOInput(GPIO_PORTE_BASE, GPIO_PIN_0);
    GPIOPadConfigSet(GPIO_PORTE_BASE, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2
    				| GPIO_PIN_3, GPIO_STRENGTH_2MA,GPIO_PIN_TYPE_STD_WPU);
    GPIOIntTypeSet(GPIO_PORTE_BASE, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2
    				| GPIO_PIN_3, GPIO_FALLING_EDGE);
    GPIOPinIntEnable(GPIO_PORTE_BASE, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3);
    IntEnable(INT_GPIOE);
  •  OLED ayarlanıyor
    RIT128x96x4Init(1000000);
    RIT128x96x4StringDraw("But. Int Ex.", 30, 16, 15);
  •  Sonsuz Döngü
    while(1)
    {
    }
}

startup_ccs.c

  • startup_ccs.c dosyası içerisinde kesmeler tanımlanır.
extern void GPIOFIntHandler(void);
extern void GPIOEIntHandler(void);
  • Vektor tablosuna gerekli yerlere eklemeler yapılır. Burada ilgili kesmelere fonksiyonlar tanımlanır.
    GPIOEIntHandler,                       // GPIO Port E
    GPIOFIntHandler,                        // GPIO Port F

= Kaynaklar =
[1] Texas Instruments, gpio_jtag.c, GPIO JTAG Recovery Örneği

[2] http://www.ti.com/tool/ek-lm3s8962

[3] http://www.ti.com/tool/ccstudio?DCMP=dsp_ccs_v4&HQS=Other%252BOT%252Bccs