Stellaris LM3S811 Uygulamalar -2

 

Bu yazımızda Stellaris LM3S811 üzerinde UART haberleşmesini gerçekleştireceğiz. Asında bu yazı Uygulamalar -1 yazısının devamı
niteliğindedir ve orada kullanılan main.c dosyası güncellenerek oluşturulmuştur.

Bu uygulamada board üzerinden seri haberleşme yardımıyla bilgisayara veri göndermeyi gerçekleştireceğiz. Yine son yapmış olduğumuz kodu güncelleyerek bu işlemleri yapacağız.

Öncelikle temel algoritmasını çıkaralım;

  • UART ve GPIO çevresel aygıtlarını aktifleştir,
  • GPIO pinlerini UART için ayarla,
  • UART Rx İnterruptını aç,
  • Kullanıcının kullanabileceği adresleri belirle olarak tanımlayabiliriz.
Uygulamada iki adet GPIO pinine ihtiyacımız olacaktır. Birisi iletim(TX) diğeri ise alım(RX) olacaktır.  Aynı zamanda timer da kullanmamız gerekiyor timer lardan bir tanesi iletim tikini oluşturacak bir diğeri ise alım için tik oluşturacaktır. Bazı temel argümanları belirledikten sonra kullanacağımız fonksiyonları çıkarıyoruz.
SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);//UART0 kullanılacağını belirtiyoruzSysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);//GPIOA kullanılacağını belirtiyoruzIntMasterEnable();//Genel interruptları aktive etUARTIntEnable(UART0_BASE, UART_INT_RX | UART_INT_RT); //UART0 için interrupt aktive etUARTConfigSetExpClk(UART0_BASE, //UART0 için ayarla

SysCtlClockGet(), //sistem clock unu kullan

115200, //BAUD 115200

(UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |UART_CONFIG_PAR_NONE)//8 bit data, 1 stop biti, parity yok

);

SysCtlDelay(SysCtlClockGet() / 12); //Gecikme

UARTCharsAvail(UART0_BASE)// Buffer tarafından kaç karakter alındığını bize döndürüyor.

UARTCharPutNonBlocking(UART0_BASE, UARTCharGetNonBlocking(UART0_BASE)); //Eğer uygun yer varsa buffer üzerine karakter iletmemizi sağlıyor. Eğer uygun yer yoksa hata kodu döndürüyor.

[codesyntax lang=”c”]

/*********************UART DATA GÖNDERME FONKSIYONU************************/
void UARTSend(const unsigned char *pucBuffer, unsigned long ulCount)//değişken olarak datayı ve gönderilen data sayısını al
{

    while(ulCount--)//goönderilen data sayısı bitene kadar gönder
    {
        UARTCharPutNonBlocking(UART0_BASE, *pucBuffer++);	//UART 0 üzeirnden pucbuufer içindeki datayı yaz bir sonraki dataya geç
    }
}
/**************************************************************************/

[/codesyntax]

Veri gönderme fonksiyonumuz oldukça basit. Parametre olarak verimizi ve karakter sayımızı gönderiyoruz. Karakter sayımız bitene kadar verileri karakter karakter iletiyor.

[codesyntax lang=”c”]

#include "lm3s811.h"
#include "inc/hw_ints.h"
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/sysctl.h"
#include "boards/ek-lm3s811/drivers/display96x16x1.h"
#include "driverlib/uart.h"
#include "driverlib/gpio.h"
/********Prototipler*********/
void UARTSend(const unsigned char *pucBuffer, unsigned long ulCount);
/****************************/

int main()
{
	volatile unsigned long i= 0;
	SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN |SYSCTL_XTAL_6MHZ);
	Display96x16x1Init(false);	/*Bu fonksiyon OLED ekran icin I2C ara yuzunu tanimlamak icin kullaniliyor*/	

	Display96x16x1StringDraw("Stellaris!",0,0);// 0,0 noktasina stellaris yaz
	Display96x16x1StringDraw("MCU-TURKEY!", 0, 1);// 0,1 noktasina yaz

	SYSCTL_RCGC2_R = SYSCTL_RCGC2_GPIOC;	//PORTC nin kullanilacagini belirliyoruz
    i = SYSCTL_RCGC2_R;						// icindeki de[eri bir yere yazarak aktif hale getrmemiz gerekiyor
	GPIO_PORTC_DIR_R  = 0x20; // pc5 pinini output olarak ayarla

	SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);//UART0 kullanılacağını belirtiyoruz
 	SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);//GPIOA kullanılacağını belirtiyoruz

	GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);//UART pinlerini A0 ve A1 üzerine set et

	/*********UART haberleşmesini ayarla********/
    UARTConfigSetExpClk(
		UART0_BASE,		 //UART0 için ayarla
		SysCtlClockGet(), //sistem clock unu kullan
	  	115200,			  //BAUD 115200
     	(UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |UART_CONFIG_PAR_NONE)//8 bit data, 1 stop biti, parity yok
	 );
	/******************************************/

	for(;;)
	{
		SysCtlDelay(SysCtlClockGet() / 12); //Gecikme
        UARTSend("MCU-TURKEY  ",12);
		GPIO_PORTC_DATA_R =	 0x20;//ledi yak
		for(i=0;i<100000;i++);//delay
		GPIO_PORTC_DATA_R = ~0x20; //ledi söndür
		for(i=0;i<100000;i++);	 //delay
	}
	return 0;
}
/*********************UART DATA GÖNDERME FONKSIYONU************************/
void UARTSend(const unsigned char *pucBuffer, unsigned long ulCount)//değişken olarak datayı ve gönderilen data sayısını al
{

    while(ulCount--)//goönderilen data sayısı bitene kadar gönder
    {
        UARTCharPutNonBlocking(UART0_BASE, *pucBuffer++);	//UART 0 üzeirnden pucbuufer içindeki datayı yaz bir sonraki dataya geç
    }
}
/**************************************************************************/

[/codesyntax]

Uygulamanın çalıştırılması kısmında windows 7 üzerinde Hyper terminal olmadığı için MCU-TURKEY  sitesi üzerinde paylaşımı yapılmış olan seri port programını kullandım(link).

 Böylelikle Stellaris üzerinden seri haberleştirmeyi gerçekleştirmiş oluyoruz.

 

 

You May Also Like

About the Author: tunayan

Leave a Reply

Your email address will not be published. Required fields are marked *