STM32F103 USART PROBLEMİ

Başlatan kkeess, 30 Ocak 2018, 12:54:42

kkeess

Merhaba arkadaşlar
usart kullanarak veri alımı ve gönderimi yapmaya çalışıyorum. Klavyeden girdiğim veriyi tekrar ekrana yazdırmak istediğimde düzgün sonucu alamıyorum. Direk bi string gönderdiğimde ekrana yazılıyor ama veri almaya çalıştığım zaman 1 yolluyorsam g görüyor 2 yollayınca 3 görüyor. RX TX Pinlerinin yerini değiştirdiğim zaman gönderdiğim veri bozuluyor ama okunan veri doğru oluyor ekranda göremiyorum ama ledlerde kontroünü yaptım. Problem nedir acaba ? yardımlarınız için teşekkürler şimdiden. RS485 Dönüştürücü kullanıyorum.

#include "stm32f10x.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_usart.h"
#include "delay.h"
#include <string.h>
#include "stm32f10x_conf.h"
#include "misc.h";

char  str[50];
uint32_t i=0,a=0;
char gelenVeri[21] = {0};
char tmp;

#define RX_BUF_SIZE 80
volatile char RX_FLAG_END_LINE = 0;
volatile char RXi;
volatile char RXc;
volatile char RX_BUF[RX_BUF_SIZE] = {'\0'};

void clear_RXBuffer(void) {
	for (RXi=0; RXi<RX_BUF_SIZE; RXi++)
		RX_BUF[RXi] = '\0';
	RXi = 0;
}



void Init_USART1(void) {

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1,
            ENABLE);

    USART_ClockInitTypeDef USART_ClockInitStructure;
    GPIO_InitTypeDef UARTTX;
    UARTTX.GPIO_Pin = GPIO_Pin_9;
    UARTTX.GPIO_Mode = GPIO_Mode_AF_PP;
    UARTTX.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_InitTypeDef UARTRX;
    UARTRX.GPIO_Pin = GPIO_Pin_10;
    UARTRX.GPIO_Mode = GPIO_Mode_IPU;
    UARTRX.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &UARTTX);
    GPIO_Init(GPIOA, &UARTRX);

    USART_ClockStructInit(&USART_ClockInitStructure);
    USART_ClockInit(USART1, &USART_ClockInitStructure);

    USART_InitTypeDef UART1;
    UART1.USART_BaudRate = 9600;
    UART1.USART_WordLength = USART_WordLength_8b;
    UART1.USART_StopBits = USART_StopBits_1;
    UART1.USART_Parity = USART_Parity_No;
    UART1.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    UART1.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

    USART_Init(USART1, &UART1);
    USART_Cmd(USART1, ENABLE);

    USART1_NVIC_Configuration();
}

void USART1_NVIC_Configuration(void) {

    NVIC_InitTypeDef NVIC_InitStructure;
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
}

//USART Recieve Interrupt
void USART1_IRQHandler(void)
{
    if ((USART1->SR & USART_FLAG_RXNE) != (u16)RESET)
	{
    		RXc = USART_ReceiveData(USART1);
    		RX_BUF[RXi] = RXc;
    		RXi++;

    		if (RXc != 13) {
    			if (RXi > RX_BUF_SIZE-1) {
    				clear_RXBuffer();
    			}
    		}
    		else {
    			RX_FLAG_END_LINE = 1;
    		}

			//Echo
    		USART_SendData(USART1, RXc);
	}



		  	if(RXc== '1')
			{
			    GPIO_SetBits(GPIOA,GPIO_Pin_4);
				GPIO_ResetBits(GPIOA,GPIO_Pin_5);


			}

       if( RXc == '2')

       	   {
				GPIO_ResetBits(GPIOA,GPIO_Pin_4);
				GPIO_SetBits(GPIOA,GPIO_Pin_5);


			}


	}



void USART_puts(USART_TypeDef* USARTx, volatile char *s){

    while(*s){
        // wait until data register is empty
        while( !(USARTx->SR & 0x00000040) );
        USART_SendData(USARTx, *s);
        *s++;
    }
}
int main(void)

{

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	GPIO_InitTypeDef GPIO_InitStructure;

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 |GPIO_Pin_5;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);

	Init_USART1();



	DelayInit();

	GPIO_ResetBits(GPIOA,GPIO_Pin_5);

	GPIO_ResetBits(GPIOA,GPIO_Pin_4);






while(1)
{
	USART1_IRQHandler();

}


}