Nxp arm7 – Uart

Merhaba,
Öncelik sitenin amacı konusunda açıklık getirmeliyim. Siteyi inceleyen çoğu arkadaş içeriği beğendi, bazı arkadaşlar ise açıklamaların daha detaylı olmasını istiyorlar. Bu sitede benim amacım: mpasm, asm30, C30, keil , arm7 assembly veya C dil ve programlarını detaylıca anlatmak olmadığı için, isteyen arkadaş devam etmek istediği program ve/veya dil(leri) araştırıp öğrenmenlidir. Fakat tavsiye isteyen arkadaşlara tabii ki elimden geldiğince yardımcı olamaya çalışacağım. Elektronik donanım tasarımı olsun, bilgisayar veya programlama dilleri olsun hepsinin öğrenmek için tek bir ortak noktası vardır. İngilizce, bu dil mesleğimizde ilerleyebilmek için şarttır. Şimdi uygulamamıza geçelim.
Bu uygulamızda LPC2148′in uart1′inden 19200bps ile data gonderimi yapacağız. Bunun için bize gerekenler.
* Keil C compiler
* LPC2148 development board
* ISP programlayıcı (in circuit serial programmer)
* Hiper terminal veya rs232′den alınan verilerimizi gözlemliyebileceğimiz başka bir program
Ben bu örnekte Ersin Keçiş adlı bir arkadaşımızın geliştirdiği rs232 tester adlı programı kullanacağım.
http://ersinkecis.com/RS232_Tester.zip (Böyle faydalı bir program hazırladığı için Ersin Keçiş’e teşekkürler)
Program resmi ve programın kendisi aşağıdadır.
/*****************************************************************************/
#include <LPC214x.h>
//#include "port_pinleri.h"
void sistem_setup(void);
void DLY_MS(long ms);
void uart1_setup(void);
void u1_karakter_gonder(char ch);
void u1_string_gonder(const char *ch);
const char kutay[]={"UART1 ile, 19200bps'de data gonderiyoruz\r\n"};
int
main(void){
sistem_setup();
SCS = 0x03; // fast I/O moduna geelim
uart1_setup(); // uart1,19200bps,1 stop bit, parity yok
while (1){
u1_string_gonder(&kutay[0]); // uart1'den 19200bps'de diziyi gonder
DLY_MS(1000);
u1_string_gonder("www.uicroarm.com");
DLY_MS(1000);
}
}
// Uart1 baudrate = PCLK(VPB Clock) / 16*(16*U1DLM+U1DLL) ile bulunur
// Yukaridaki formul bazi durumlarda tam olarak baudrate ayarini yapamiyabilir
// yani sonu kesirli ikabilir , o zaman kesirli bolme islemlerini yapabilen
// U1FDR registeride kullanilmalidir. (U1 fractional divider register)
void
uart1_setup(void){
PINSEL0|=0x50000; // RxD1 ve TxD1 pinleri enable
U1LCR=0x83; // 8 bits, Parity yok, 1 Stop bit
U1DLL = 97; // 19200 Baud Rate ,
U1DLM = 0;
U1LCR = 0x03; // baudrate ayarlandi
}
void
u1_karakter_gonder (char ch){ // Karakteri seri porta yaz
while (!(U1LSR & 0x20)); // bus idle oluncaya kadar bekle
U1THR=ch; // karakter bus'a
}
void
u1_string_gonder(const char *ch){ // string yazilacak
while(*ch) //
u1_karakter_gonder(*ch++);
}
void
sistem_setup(void){
// Processor clock=5*12Mhz=60Hz
PLL0CFG=0x24; // MSEL = 4(multiplier =5),PSEL(PLL divider) = 2
// PLLCON ve PLLCFG registerleri ierigi degistirildiginde , asagidaki
// proses uygulanir, 1) PLL0FEED=0xAA ve 2)PLL0FEED=0x55
PLL0FEED=0xAA; // Feed process
PLL0FEED=0x55;
PLL0CON=0x1; // PLL'i enable et
PLL0FEED=0xAA; // Feed process
PLL0FEED=0x55;
while(!(PLL0STAT & 0x400)) ; // PLL kitleninceye kadar bekle (5*12Mhz=60Mhz'e kitlenir)
PLL0CON=0x3; // PLL'i clock kaynagi gibi bagla
PLL0FEED=0xAA; // Feed process
PLL0FEED=0x55;
MAMCR=0x2; // MAM full Enable
MAMTIM=0x4; // MAM fetch cycles = 4CCLK
VPBDIV=0x02; // PCLK = 30 MHz (Pclk=Peripheral Clock)
}
// CCLK=60MHz iken 1ms
void
DLY_MS(long ms){
long i;
unsigned int j;
for (i = 0; i < ms; i++ )
for (j = 0; j < 7500; j++ );
}
/*****************************************************************************/
Bu program ile elde ettiğimiz sonuç:


23/04/2009 14:43
arkadalar bu programdaki port_pinleri.h dosyasını dahil etmek gerekiyor mu?gerekiyor ise dosyayı nasıl oluşturuyoruz bilgisi olan yardımcı olabilir mi acaba?
23/04/2009 23:54
Mrb,
port_pinleri adlı header kullanılmıyor. Zaten program içinde yorum modunda.
23/10/2010 23:57
Merhaba,
Ben arm tabanlı işlemcilere yeni başaldım. Hitex sitesinden NXP LPC21XX seri için donanım rehberi falan yayınlamışlar onları inceledim. Entegrenin bir çok donanımını kullanmayı göstermiş fakat dahili eeprom yazma işini göstermemişler ve hiç bir yerdede bulamıyorum. LPC21xx lerde dahili eeprom kullanma işi nasıl oluyor? Birde program yükleme için dahili bootloaderı var denmiş direk serial portdan programlanabiliyor deniliyor. Ben bu entegreye program yüklemek istediğimde sadece RS232 kablosu ile program yükleyebiliyormuyum? eğer öyle ise bu bacaklar hangileridir? Sizin bu konular bilginiz var ise paylaşabilirmisiniz?
7/11/2010 14:16
Merhaba Salih,
Yeni nesil işlemcilerde bellek yapısı “Flash” olduğu için eeprom’a gerek duyulmamaktadır çünkü program bellek istenirse eeprom gibide kullanılabilir.
Genelde mantık aynıdır, flash’a yazmayı açmak için özel hex anahtar sözcük vardır (mesela 0xAAAA gibi) Buna ingilizce “Flash unlock Key” de denir.
Tüm işlemcilerde böyle bir anahtar word(32bit) veya half word(16bit) vardır. Flash’a yazma açıldıktan sonra yazacağın belleği mutlaka silmelisin aksi halde yazılmaz. Yani flash default durumunda olmalıdır, hafıza boş ise silmene gerek yok. Boş biliyorsun hex olarak tüm bitler “1″ ile dolu olması anlamına gelir.
Diğer önemli konu, flash bellek part parttır mesela minimum alan 1KB-2KB gibi alanlardan oluşur. Bir byte bile yazacaksan tüm bu partı silmelisin yani 1KB.
Silme süresi dahasheetlerde verilir(ms süresindedir). Sonra istediğin kadar 8bit,16bit,32bit yazabilirsin (1KB’ı aşmayacak şekilde, buna sayfa yazma (page writing) da denir ). 1Kb’dan fazla yazacaksan gerekli olan alankadarını silip yazmalısın. Her page silme arasında gerekli silme sürelerine uymalısın.
Yazma işleminden sonra, datanın yazılması için x ms süresince beklenir(bak datasheet) sonra Flash lock yapıp yazmaya kitlenir.
En önemli konu ise şudur : Yazılacak adresi doğru girmelisin veya silinecek page’i yoksa yazdığın programı
silebilirsin. Ayrıca NXP IAP( in application programming) fonksiyonlarını kullanarak yazabilirsin, hata olmaması için. En hızlı ve etkili yöntem budur, IAP dokümanını inceleyebilirsin.
Evet, arm işlemcilerde bootloader var, sadece rs232 kablosu ile program atabilirsin. LPC21xx serisinde de aynı şekilde. Uart1 ile program atılır(işlemcinin uart1 rx ve tx pinleri ve boot bacakları vardır) NXP sitesinde ISP(in system programming) ile ilgili dökümanı inceleyebilirsin.
Aykut
30/12/2010 20:31
Merhaba, öncelikle tebrikler,
PLL kodlarını kaldırıp .s dosyası ile çalıştırmayı denediniz mi? Ne gibi değişiklikler yapılmalı kısaca açıklar mısınız?
21/01/2011 20:49
Merhaba,
Pll kısmını kapatıp denemedim ama mantıken dahili Rc osc ile çalışacaktır. Bir ara dener yine buraya yazarım.
19/08/2011 20:44
hocam bu test kartından bulamadım lütfen yardım bekliyorum
(
23/08/2011 22:41
Merhaba,
Bu kartı çok önceleri satın aldım, şuan sanırım yoktur. Ebay’dan veya Türkiye’de arm7 kartı satan yerler var. İstersen oralardan satın alabilirsin. İlgilenirsen reklam olmasın diye, firma ismini özelden atabilirim.
17/01/2012 17:14
Merhaba Aykut Bey,
ellerinize saglik. test aracimin isinize yaradigina sevindim. nette bir sey ararken tesadufen gordum sitenizi ve memnun oldum.
basarili calismalarinizin devamini dilerim.