Stm32f205 Uart Veri Alma

Başlatan yldzelektronik, 22 Haziran 2012, 16:30:38

yldzelektronik

İyi çalışmalar.
Arm kullanarak uart ile veri alışverişini normalde tek karakterle sorunsuz yapabiliyordum.Ancak bana lazım olan birden fazla karakteri uarttan alabilmek.Bu işe çözüm olarak nette bulduğum kod örnekleriyle çözüm getirebildim.Tabii küçük birkaç farkla...
Bahsi geçen işlemci için 103ten uyarlandı.

char gelen[255];

int VeriAl (void) {

while (!(USART1->SR & USART_FLAG_RXNE));

return ((int)(USART1->DR & 0x1FF));
}
int i=0;
	do {
	for (i=0;i<=1;i++)
	{
		gelen[i] = VeriAl();
	 }
	}while((USART1->SR & USART_FLAG_RXNE));



Ancak işlemcim bu işin dışında da işler yapmalı.Ancak bu işle ilgilenirken (while (!(USART1->SR & USART_FLAG_RXNE)) ; ) bu satırda çakılıyo.Veri gelmediğinde burdan ayrılmıyor.Bu satırı sildiğimde ise tek karakter veri alabiliyorum.Yani dizinin tüm elemanları aynı karakterle doluyo.Bunu nasıl aşabilirim?Yada uart kesmesi için ne yapmak gerekir?
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

pisayisi

Kesme gelmiş ilgili flag silinmemiş ,
Aşağıdaki örnek yardımcı olabilir...

  if (USART1->SR & USART_FLAG_RXNE) {                  // read interrupt
      USART1->SR &= ~USART_FLAG_RXNE;	          // clear interrupt


http://www.keil.com/download/files/stm32_usart_irq.zip
Murat

CLR

Alıntı yapılan: yldzelektronik - 22 Haziran 2012, 16:30:38
İyi çalışmalar.
Arm kullanarak uart ile veri alışverişini normalde tek karakterle sorunsuz yapabiliyordum.Ancak bana lazım olan birden fazla karakteri uarttan alabilmek.Bu işe çözüm olarak nette bulduğum kod örnekleriyle çözüm getirebildim.Tabii küçük birkaç farkla...
Bahsi geçen işlemci için 103ten uyarlandı.

char gelen[255];

int VeriAl (void) {

while (!(USART1->SR & USART_FLAG_RXNE));

return ((int)(USART1->DR & 0x1FF));
}
int i=0;
	do {
	for (i=0;i<=1;i++)
	{
		gelen[i] = VeriAl();
	 }
	}while((USART1->SR & USART_FLAG_RXNE));



Ancak işlemcim bu işin dışında da işler yapmalı.Ancak bu işle ilgilenirken (while (!(USART1->SR & USART_FLAG_RXNE)) ; ) bu satırda çakılıyo.Veri gelmediğinde burdan ayrılmıyor.Bu satırı sildiğimde ise tek karakter veri alabiliyorum.Yani dizinin tüm elemanları aynı karakterle doluyo.Bunu nasıl aşabilirim?Yada uart kesmesi için ne yapmak gerekir?

Merhaba,

Gelişmiş işlemcilerde böyle kod yazmak pek mantıklı olmaz, DMA modülü var onu kullanmayı öğrenirsen çok faydalı olur. Usart,I2C,SPI gibi durumlarda göndereceğin veri 1byte'tan fazlaysa dma kullanmanı tavsiye ederim.

Knowledge and Experience are Power