top of page

UART & USART

USART (Universal Synchronous Asynchronous Receiver Transmitter) çok kullanılan haberleşme çevre birimlerinden biridir. Dataların iki sistem arasında transferi sağlanır. Bu iletişim haberleşme sistemlerinde paralel veya seri olabilir. Paralel haberleşmede farklı hatlardan veri aynı anda gönderilebilir. Seri iletişimde ise veriler sırayla ve tek hat üzerinden gönderilir, daha yavaştır. Uzun mesafe için seri haberleşme tercih edilmektedir ve USART da seri haberleşme protokollerinden biridir. UART ile arasındaki tek fark UART çevre biriminin yalnızca asenkron modu desteklemesi, USART'ın ise hem senkron hem de asenkron modları desteklemesidir. Senkron haberleşmede veri gönderlirken clock hattı vardır asenkron veri iletiminde ise clock sinyali yoktur.



Veri iletimde veriler frame şeklinde gönderilir. Her frame 1 start bit ve 8 veri biti ile 1 stop bitinden oluşur. Yani toplam 10 bit gönderilir denilebilir. Stop biti 1, 1.5, 2 bit olabilir. Parity bit bulunur ve haberleşmede parity biti hata kontrolünde kullanılır. Parity biti gönderilen 1’lerin sayısı tekse tek parity çiftse çift parity gibi kontrol edilir.



Genellikle MCU’ların UART çıkışları 3.3V veya 5V seviyelerindedir. Uzun mesafelerde elektriksel gürültülerden etkilenmemek için RS-232 gibi protokollerden faydalanılır. USART voltaj hakkında bilgi vermez sadece sinyal gönderme yöntemidir. Voltaj seviyelerini değiştirebilmek için bazı iletişim standartları kullanılır. (RS-232, RS-485, RS 282 gibi.) Bu iletişim strandartları kullanılıyorsa hardware flow control aktif edilmelidir. Bu standartlar verinin içeriği veya yazılımsal kısmıyla ilgili değildir, fiziki katmanlardır. Konnektörün tipi, kablo uzunluğu ne olmalı,sinyallerin volt ölçeklemesi gibi özellikleri belirler. (Farklı protokollerde iletilen verinin gerilim seviyeleri değişiyor. 0 ve 1 farklı gerilim seviyelerinde ifade ediliyor. Ethernet, USB genellikle RS-232, RS-434 protokollerle eşlenik olarak kullanılırlar.) Genellikle mikrodenetleyiciler, yalnızca bir UART modülü yerine bir USART modülü ile birlikte gelir. Böylece USART modülünü hem senkron modda hem de asenkron modda kullanılabilir.


Usart Block Diagramda da görüldüğü gibi veri iletiminin arka planında belli bir akış bulunur. Örneğin içerdeki veriyi koyulan register TDR, içerden veri alınan RDR’dir. Haberleşme hızı baud rate’i kontrol eden register Usart_Brr register’dır. Baud rate ayarları iki tarafta da aynı seçilmelidir. Örneğin yazılımdaki baud rate ile terminal ekranının baud rate'i aynı seçilmelidir. Baud rate 1 bitin gönderilme hızıyla ilgilidir. 300 ve 300'ün katları olacak şekilde, 9600 115200 vs. olabilir.





UART birimlerinde Rx Tx ve GND uçları bulunur. Haberleşecek birimlerin Rx ve Tx uçları çapraz bağlanır, yani iki cihazdan birinin Tx'i diğerinin Rx'ine, Rx'i Tx'ine bağlanmalıdır. GND bağlantıları ortak bağlanır. USART’ta bunlara ek olarak bir de clock hattı vardır. USART haberleşmede full dublex iki tarafın da aynı anda haberleşebileceği yapıdır. Half duplex, aynı anda haberleşemeyen sırayla haberleşen yapılardır. Genel olarak veri transferinde Alınan veriyi koyacak bir register vardır. Belli olaylarda haber vermek için durum flagları vardır.


USART ayarı yapılırken kullanılacak her çevre birimde olduğu gibi clock aktif edilmelidir. Ve bu değer daha sonra baudrate ayarında da kullanılmaktadır. GPIO ayarları yapılırken de alternate function af olarak ayarlanması gerekir.


Putty, real term, tera term, hercules terminal gibi terminal yazılımları mevcuttur. Bu uygulamada tera term kullanılmıştır. Yazılımda ayarlanan baud rate ile terminal yazılımındaki baud rate ile aynı olması gerekir.


Terminalin bağlantı ayarları için öncelikle Öncelikle TTL portu seçilir. Bazı kartlarda ara bir dönüştürücüye ihtiyaç yoktur. Bu uygulamada TTL seri port COM9’dadır.



Ardından baud rate 9600 ayarlanır.




St-Link Utility'den kod gönderildikten sonra ekranda çalışan kodun çıktıları görünmeye başlar. Lochal echo seçilme nedeni klavyeden sayı girildiğinde ekranda sayıları görmek içindir. Son olarak terminal ekranda görüldüğü gibi kodun çıktısı elde edilir ve klavyeden 0 girildiğindde PC8 ledi sönmektedir, 1 girildiğinde PC8 ledi yanmaktadır.






STM32VL Discovery kartının USART çevre birimininreference manuelde de bulunan bazı özellikleri şu şekildedir:


  • Çift yönlü asenkron veri alışverişi yapılır.

  • Bilgisayar ve çevre birimleri arasında haberleşme sağlanır.

  • Harici olarak bir clock bulunur. Uarttan daha gelişmiştir. Hızlı veri iletişimi mümkündür.

  • İletim hızı 3Mbit/s.

  • Veri büyüklüğü 8 ya da 9 bittir.

  • 1-2 biti durdurma biti olarak yapılandırılabilir.

  • Senkron iletişimde clock bulunmaktadır. Clock ile verinin iletim süresini verir.

  • Tek kablolu half duplex iletişim sağlar.

  • İletim durum flagları mevcuttur. (receive buffer full,transmit buffer empty,end of transmission)

  • Paritiy bit kontrol özelliği vardır. (Bu verinin gönderilip gönderilmediğini tespit etmekte kullanılır. Çift parity tek parity kontrolü yapılabilir, uygulamadan uygulamaya değişir.)

  • 4 adet hata algılama bayrağı vardır. (overrun hatası, noise error, frame error, parity error)

  • 10 adet farklı interrupt bayrağı bulunmaktadır.

  • Hardware flow control mode aktif edilebilir.

  • İki farklı işlemci arasında iletişim sağlanabilir.




Bu uygulamada STM32VL Discovery kart ile bilgisayar haberleştirilmiştir. Öncelikle karttan bilgisayara yazı gönderilmiştir. Test1 ve Test2 yazıları karttan bilgisayara gönderilen yazılardır. Ardından bilgisayardan karta veri gönderilmiştir. Bilgisayardan 0 ve 1 girildiğinde kart üzerindeki PC8 ledindeki durum değişimi kontrol eidlmiştir.




Malzemeler, Devre Şeması ve Kodlar:


  • STM32VL Discovery

  • TTL

  • Jumper kablolar







#include "stm32f10x.h"                  // Device header
#include "stm32f10x_usart.h"            // Keil::Device:StdPeriph Drivers:USART
#include "delay.h"


void gpioConfig(); // Tx Rx pin ayarlamalari icin 
void usartConfig();//usart kullanimi icin ayarlanan fonksiyon
void verigonder (char *string); //  olarak gönderilecek 

char test1[20]= "\n PC8 ledi yaniyor\r";
char test2[20]="\n PC8 ledi sonuyor\r";

uint16_t okunan=0;

int main (){
  
	
	 gpioConfig();
	 usartConfig();
     DelayInit();

   while(1){
	 
	   okunan=USART_ReceiveData(USART1); // Rx olarak usartin aldigi veri 
	    if(okunan=='1'){ // klavyeden 1 girilirse PC8 pinindeki led yansin ve test1'deki yazi yazilsin 
			
			GPIO_SetBits (GPIOC,GPIO_Pin_8);
			verigonder(test1);
			delayms(2000);
		
		}
		
		if(okunan=='0'){ // klavyeden 0 girilirse PC8 pinindeki led sönsün ve test2'deki yazi yazilsin
		    GPIO_ResetBits(GPIOC,GPIO_Pin_8);
			verigonder(test2);
			delayms(2000);
		}
	   
	     
	 }
  
    

}


void gpioConfig(){

	GPIO_InitTypeDef GPIOInitStructure;
	RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOA,ENABLE); // A portunun 9-10. pinleri kullanilmistir. Clock hatti aktif edilmeli
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);	//kartin üstündeki PC8'de led bulunmaktadir. Clock hatti aktif edildi
		
	GPIOInitStructure.GPIO_Mode=GPIO_Mode_AF_PP; // usart pini için alternative push pull seçilmesi gerekiyor
	GPIOInitStructure.GPIO_Pin=GPIO_Pin_9;  // A portunun 9. pini kullanilacak. Tx mode 
	GPIOInitStructure.GPIO_Speed=GPIO_Speed_50MHz; // hiz ayari 
	
	GPIO_Init(GPIOA,&GPIOInitStructure); // A portu icin ayarlama yapildigi belirtildi 
	
	GPIOInitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; // Rx için mode in floating olarak ayarlanmali 
	GPIOInitStructure.GPIO_Pin=GPIO_Pin_10; // A portunun 10. pini kullanilacak. Rx mode 
	GPIOInitStructure.GPIO_Speed=GPIO_Speed_50MHz;//hiz ayari 
	
	GPIO_Init(GPIOA,&GPIOInitStructure);	
	
	GPIOInitStructure.GPIO_Mode=GPIO_Mode_Out_PP; // C portu 8. pin 
	GPIOInitStructure.GPIO_Pin=GPIO_Pin_8;
	GPIOInitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	
	GPIO_Init(GPIOC,&GPIOInitStructure);	


}


void usartConfig(){
  
	USART_InitTypeDef USARTInitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); // usart1'in bagli oldugu clock hatti aktif edilmistir 
	
	
	USARTInitStructure.USART_BaudRate=9600; // 
	USARTInitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
	USARTInitStructure.USART_Mode=USART_Mode_Tx| USART_Mode_Rx; // hem veri gönderilecek hem alınacak Rx Tx seçiliyor
	USARTInitStructure.USART_Parity=USART_Parity_No;
	USARTInitStructure.USART_StopBits=1; 
	USARTInitStructure.USART_WordLength=USART_WordLength_8b; // 8 bitlik veri iletimi
	
	USART_Init(USART1,&USARTInitStructure);//usart1 ayarlari yapildigi bildiriliyor
	USART_Cmd(USART1,ENABLE); // 
	
}

void verigonder (char *string){

   while(*string){
	    while(!(USART1->SR & 0x00000040)); // usart1in status registeri veri yazmak için müsait olup olmadigi kontrol ediliyor.
		   USART_SendData(USART1,*string); // usarttan bilgidayara yazilacak yazi gonderiliyor
		   *string++; 
	    
	 
	 }


}








Son Paylaşımlar

banner300900.gif
banner300900.gif
bottom of page