Örnek : STM32F100RB ile USART3 Kullanımı + RX INT + RS485

Başlatan camby, 18 Kasım 2012, 01:17:18

camby

Program STM32F100RB için USART3'den gelen veriyi kaydedip aynen geri yolluyor.

Bülent hocamın burada : https://www.picproje.org/index.php/topic,35896.15.html

Klein hocamın da burada : https://www.picproje.org/index.php/topic,43436.0.html

örnekleri var.

Benim yaptığım program STM32F100RB üzerinde çalışıyor. Gelen veri kesme ile diziye kayıt ediliyor. Gelen veri sayısı 8'e ulaşınca paket aynen geri yollanıyor. RS-485 kullanıldığı için iletişim yönü programda değiştiriliyor. Program işi bitince başa dönüyor. Son byte'ı yolladıktan sonra kontrol yapmadım rasgele bir bekleme yapıp devam ettim.

//======================== Main ===============================================

#include "stm32f10x.h"
#include "GPIO_STM32F100RB.h"
#include "delay_ms.h"

unsigned char WAdr;
char RxBuf[8];

//======================== USART3 Handler =====================================
void USART3_IRQHandler()
{
    	volatile int Sts;
    	Sts=USART3->SR;		
    	RxBuf[WAdr] = USART3->DR;				// Diziye Kaydet
    	WAdr = (WAdr+1);			                        // Max dizi uzunlugu 8 char
}

//======================== USART3 Init ========================================
void Usart3Init(void)
{
	WAdr=0;							// USART3 data kayit
	RCC->APB1ENR |= 0x00040000;      			// USART3 Clk Enable 
	RCC->APB1RSTR |= 0x00040000;      			// USART3 Reset		
	RCC->APB1RSTR &=~ 0x00040000;      			// USART3 Reset
        USART3->SR &=~ 0X03FF;                 			// Status registeri silelim
        USART3->BRR = 0x09C4;            	    		// 9600 Baud
	USART3->CR1 |= 0x0000200C;  				// USART3 enable // 1 Start, 8 Data, 1 Stop, No parity (Default)	
	USART3->CR1 |= (1<<5);					// RXNEIE: RXNE interrupt enable [ ORE=1 or RXNE=1 ]
	NVIC->ISER[1]|=0x80;         				// USART3 global Interrupt	
}				

void SendChar(char Tx)   
{
	while(!(USART3->SR&0x0080));      			// TX Buffer dolu ise bekle (Rehber Sayfa 646)
	USART3->DR = Tx;	
}

void SendTxt(char *Adr)
{
      while(*Adr) 
        {
        	SendChar(*Adr);
          	Adr++;
        }  
}

/*----------------------------------------------------------------------------
  MAIN function
 *----------------------------------------------------------------------------*/
int main (void) 
 {	 
 
	GPIO_Init(); 
	Initial_SSD1963();
	 
	GPIOB->BSRR = (1 << 8);					// MAX485 Çikis 
	Usart3Init();
	  
	GPIOB->BRR = (1 << 8);					// MAX485 Giris
	while(1) 						// Loop forever
	{							
		delay_ms(1000);
		
		while(!(WAdr==8));
		WAdr = 0;
		
		GPIOB->BSRR = (1 << 8);				// MAX485 Çikis
		SendTxt(RxBuf);
		SendChar(' ');   
		delay_ms(100);
		GPIOB->BRR = (1 << 8);				// MAX485 Giris
	}
}