Arkadaşlar Merhaba,
Bülent hocanın Usart kodunu deniyorum Rx,Tx pinlerini kısa devre yaptırınca gönderdiğim veriler geri geliyor RxBuf'a fakat ben direkt com port tan bir şey gönderdiğim zaman RxBuf a veri gelmiyor.Bu konuda bilginiz varsa yardımcı olur musunuz? Asıl amacım Usart 'ı iyi öğrenip GPS Modulden gelen verileri izlemek istiyorum.
#include "STM32F4xx.h"
unsigned char WAdr,RAdr;
char RxBuf[128];
/*********************************************************************************
CPU frekansi 168Mhz
AHB frekansi 84 Mhz
APB frekansi 42 Mhz
*********************************************************************************/
void SystemInit()
{
unsigned int i;
(*((int*)0xE000ED88))|=0x0F00000;
for (i=0;i<0x00100000;i++); // OSC oturtma ve kurtarma rutini
RCC->CFGR |= 0x00009400; // AHB ve APB hizlarini max degerlere set edelim
RCC->CR |= 0x00010000; // HSE Xtal osc calismaya baslasin
while (!(RCC->CR & 0x00020000));// Xtal osc stabil hale gelsin
RCC->PLLCFGR = 0x07402A04; // PLL katsayilarini M=4, N=168, P=2 ve Q=7 yapalim 168 Mhz
RCC->CR |= 0x01000000; // PLL calismaya baslasin (Rehber Sayfa 95)
while(!(RCC->CR & 0x02000000)); // Pll hazir oluncaya kadar bekle
FLASH->ACR = 0x00000605; // Flash ROM icin 5 Wait state secelim ve ART yi aktif edelim (Rehber Sayfa 55)
RCC->CFGR |= 0x00000002; // Sistem Clk u PLL uzerinden besleyelim
while ((RCC->CFGR & 0x0000000F) != 0x0000000A); // Besleninceye kadar bekle
RCC->AHB1ENR |= 0x0000001F; // GPIO A,B,C,D,E clock'u aktif edelim
GPIOD->MODER = 0x55550000; // GPIOD nin 15, 14, 13, 12, 11, 10, 9, 8 pinleri cikis tanimlandi (LEDler icin)
GPIOD->OSPEEDR= 0xFFFFFFFF; // GPIOD nin tum cikislari en yuksek hizda kullanacagiz
}
/*********************************************************************************
USART3 modulunu kullanarak asenkron haberlesme (Hata kontrolu yapilmiyor)
*********************************************************************************/
void USART3_IRQHandler()
{
volatile int Sts;
Sts=USART3->SR;
RxBuf[WAdr]=USART3->DR;
WAdr=(WAdr+1)&0x7F;
}
void UsartInit()
{
WAdr=0;RAdr=0;
// USART3 MODULUNU AKTIF HALE GETIRELIM
RCC->APB1ENR|=0x00040000; // USART3 Clk Enable (Rehber Sayfa 113)
RCC->APB1RSTR|=0x00040000; // USART3 Resetlendi
GPIOB->AFR[1]=0x07777700; // PB10..PB14 pinleri USART3 ile alakalandirildi (Hard Sayfa 49)
GPIOB->MODER|=0x2AA00000; // GPIOB 10..14 icin alternatif fonksiyon tanimi (Rehber Sayfa 148)
// USART3 MODULUNU AYARLAYALIM // 1 Start, 8 Data, 1 Stop, No parity (Default degerler)
RCC->APB1RSTR&=~0x00040000; // USART3 Reseti kaldiralim
// USART3->SR&=~0X03FF; // Status registeri silelim
USART3->BRR=0X1112; // 9600 Baud
USART3->CR1|=0x0000202C; // USART3 enable
NVIC->ISER[1]|=0x80; // NVIC da USART3 interrupta izin verelim
}
void SendChar(char Tx)
{
while(!(USART3->SR&0x80)); // TX Buffer dolu ise bekle (Rehber Sayfa 646)
USART3->DR=Tx;
}
void SendTxt(char *Adr)
{
while(*Adr)
{
SendChar(*Adr);
Adr++;
}
}
char DataReady()
{
return(WAdr-RAdr);
}
char ReadChar()
{
char Dat;
Dat=RxBuf[RAdr];
RAdr=(RAdr+1)&0x7F;
return(Dat);
}
// Rx ve TX pinlerini (GPIOB10 ve GPIOB11) birbirine baglarsaniz gonderdiginiz datalar geri gelecektir
int main()
{
int i;
UsartInit();
SendTxt("PicProje");
SendChar(' ');
SendTxt("Bunalmis");
for(i=0;i<0x1000000;i++); // Laf olsun diye bekledik
while(DataReady()) ReadChar();
while(1);
}
kodlarını incelemedim ama diğer taraftan gelen UART sinyalleri TAM Baudrate hızında mı diye kontrol etmeniz lazım.
STM32 de "Break Error" verince datayı kabul etmiyor olabilir.
Comm Operator adında bir program kullanıyorum kodda 9600 baud ayarlamış bende operatoru 9600 e ayarladım bir problem olduğunu düşünmüyorum. Interrupt ın içinde gelen veriyi direkt RxBuf a yazmasına rağmen operatorden gönderdiğim verileri almıyor.
Alıntı yapılan: tesladream - 31 Mayıs 2013, 13:53:39
Comm Operator adında bir program kullanıyorum kodda 9600 baud ayarlamış bende operatoru 9600 e ayarladım bir problem olduğunu düşünmüyorum. Interrupt ın içinde gelen veriyi direkt RxBuf a yazmasına rağmen operatorden gönderdiğim verileri almıyor.
Operatorden gönderdiğin veriyi skopla bir incele bakalım, istediğin gibi mi ?
Ben de geçenlerde aynen senin dediğin gibi bir durumla karşılaştım.
Echo modta çalışıyordu... Başka bir yerden alınca çalışmıyordu...
Baud rate leri eşitleyince düzeldi ama bunu ancak skop ile görebildim.
Yazılan örnek programda eğer arzulanan baud rate'in hesabı yanlış yapılmış olsa da sözkonusu örnek programda RX-TX pinleri kısa devre yapıldığında doğru çalışacaktır. Örneğin 9600 Baud için yazıldığı sanılan program aslında 9100 baud olsa bile sorun olmayacaktır.
Fakat bu programı bir başka programla denerken karşı taraf 9600'a set edilirse haliyle veri alış verişi sorunlu olacaktır.
Ayrıca Rx-TX pinlerini RS232 interface üzerinden kullanacaksanız araya RS232 çipi koymanınız gerekiyor.
Öncelikle baud rate hesabının doğru yapılıp kodların da doğru olduğunu teyid etmelisiniz.
Hocam arada ft232 tarzı çinden aldığım küçük bir kart kullanıyorum .Stm32 yi bu kart üzerinden bilgisayara bağladım.Bahsettiğiniz gibi bir problem olabilir ama nasıl aşacağımı bilmiyorum. Tek amacım bidirectional olarak veri alışverişi yaptırmak istiyorum transmit konusunda sıkıntı yok çünkü görüyorum Com operatorde veri geliyor ama ben burdan ben gönderdiğimde RxBuf dolmuyor 0x00 görünüyor.
Alıntı yapılan: tesladream - 31 Mayıs 2013, 14:05:36Bahsettiğiniz gibi bir problem olabilir ama nasıl aşacağımı bilmiyorum.
SKOP icat oldu.
Baudrate hesabını okula gidince bir ossiloskopta denicem bakalım varsa bir hata orda cıkar buradan yine cozersem problemi yazarım tesekkurler.
Hocam bu uygulamayı Vırtual com port olarak denediniz mi bende Rs232 convertor ft232 yok malesef VCP olarak USART kullanmayı planlıyorum. Micro USB dısında Yapılması gereken pin baglantıları nedir yada var mıdır ? ?
Aslında elimizdeki boardlarimiz VCP olarak tanıtılabiliyormuş bir kaç video izledim ama ben yapamadım rs232 to usb convertor üm var onunla direkt bağlayabiliyorum bilgisayara (Rx,Tx,3.3V,GND pinleri ile uP a bağlıyorum).Ama bunun haricinde Max232 veya max3232 gibi entegreler ile kendin bir port yapabilirsin amaç iki taraftaki interface in voltaj seviyelerini fixlemek.
Anladım hocam ben direk VCP üzerinden gitmeye devam edeyim RS232 conv yapmaya bu ara zamanım yok hazır moduller alınabilir mi ama sizin ki hazır mı kendınız mı yaptnız ?
Ben hazır aldım dx.com da 2-3 dolar bişey usta bir hafta da geliyor eline.RS232 to USB Module yazarsan çıkıcaktır.