Picproje Elektronik Sitesi

DERLEYİCİLER => Diğer Derleyiciler => KEIL => Konuyu başlatan: yldzelektronik - 22 Haziran 2012, 16:30:38

Başlık: Stm32f205 Uart Veri Alma
Gönderen: 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?
Başlık: Ynt: Stm32f205 Uart Veri Alma
Gönderen: pisayisi - 22 Haziran 2012, 18:18:54
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 (http://www.keil.com/download/files/stm32_usart_irq.zip)
Başlık: Ynt: Stm32f205 Uart Veri Alma
Gönderen: CLR - 24 Haziran 2012, 03:01:07
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.