Archive for the ‘Cortex M3’ Tag

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

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]

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

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