stm32f407vg ile usart kullanımı sorunu

Başlatan electrical, 06 Temmuz 2013, 14:48:43

electrical

arkadaşlar stm ile usart denemesi yapıyorum ama terminalde gönderdiğim string yerine aşağıdaki resim gibi karakterler geliyor stm ile pc iletişimi için ft232r kullanıyorum ve sadece rx tx ve gnd bağladım pinb11 txd ye bağladım ve pinb10 uda rxd ye bağladım ft232r entegresinde

http://s1307.hizliresim.com/1c/6/pyk9g.jpg

uart.c
/*
==============================================================================

STM32F407VG karti icin asenkronik haberlesme(USART)
kutuphane dosyasi

==============================================================================
*/

#include "stm32f4xx.h"
#include "uart.h"
// stm32f407vf  ile ilgili kutuphaneler ekleniyor bu dosya ile




//extern char *data; // degisken tanimlaniyor

extern void uart_setup(void){
	GPIO_InitTypeDef GPIO_InitStruct;
	NVIC_InitTypeDef NVIC_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE);
	  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);


	  // usart rx ve tx pinleri ayarları
	      GPIO_PinAFConfig(GPIOB,10,GPIO_AF_USART3);
	      GPIO_PinAFConfig(GPIOB,11,GPIO_AF_USART3);
	      GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
	      GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
	      GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
	      GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
	      GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
	      GPIO_Init(GPIOB, &GPIO_InitStruct);

	      // usart 3 ayarları asenkronik modda
	        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
	        USART_InitStructure.USART_BaudRate =9600;
	        USART_InitStructure.USART_WordLength = USART_WordLength_8b;
	        USART_InitStructure.USART_StopBits = USART_StopBits_1;
	        USART_InitStructure.USART_Parity = USART_Parity_No;
	        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

	        USART_Init(USART3, &USART_InitStructure);
	        NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
	        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	        NVIC_Init(&NVIC_InitStructure);

	        USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);
	        USART_Cmd(USART3,ENABLE);

}

// usart veri gonderme fonksiyonu
void uart_send(USART_TypeDef* USARTx, volatile char *ptr){

    while(*ptr){

        while( !(USARTx->SR & 0x00000040) );
        USART_SendData(USARTx, *ptr);
        *ptr++;
    }
}
                         
  

/*extern void uart_al(USART_TypeDef* USARTx){
  return USART_ReceiveData(USARTx);
}*/


/*void USART3_IRQHandler(void){


	if( USART_GetITStatus(USART1, USART_IT_RXNE) ){


	}
}*/


uart.h
/*
==============================================================================

STM32F407VG karti icin asenkronik haberlesme(USART) 
kutuphane dosyasi 



==============================================================================
*/


void uart_setup(void); // genel uart ayarlari yapiliyor bununla

void uart_send(USART_TypeDef* USARTx, volatile char *ptr);// uart ta veri gonderiliyor


//extern void uart_al(USART_TypeDef* USARTx); bu fonksiyonu yapılandırcam


main.c
#include "stm32f4xx.h"
#include "uart.h"

void Delay(__IO uint32_t nCount) {
  while(nCount--) {
  }
}




int main(void)
{
	 uart_setup();
	 Delay(65535);
	 uart_send(USART3,"berk");






  while (1)
  {
	 //uart_send(USART3,"berk");
	  Delay(65535);

  }
}


electrical

Arkadaşlar bir düşüncesi olan var mı hiç ? (Baund hızını değiştirdiğimde daha da değişik karakterler alıyorum bu arada)

muhittin_kaplan

Tüm sistemin boud vs ayarları aynı mı  ?

electrical

tüm sistemde aynı hocam stm kart' ın zaten baund' u kodda da olduğu gibi 9600 putty kullanıyorum terminal olarak ve onda da baund 9600 olarak ayarlı   "klein" hocanın usart denemesini yaptım onda da aynı karakterler çıkıyor sürekli..

muhittin_kaplan

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++;
	}
}



void init_usart(void){

	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;

	/* enable peripheral clock for USART2 */
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);


	/* GPIOA clock enable */
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);

	/* GPIOA Configuration:  USART2 TX on PA2 */
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;
	GPIO_Init(GPIOA, &GPIO_InitStructure);

	/* Connect USART2 pins to AF2 */
	// TX = PA2
	GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_USART2);

	USART_InitStructure.USART_BaudRate = 9600;
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;
	USART_InitStructure.USART_StopBits = USART_StopBits_1;
	USART_InitStructure.USART_Parity = USART_Parity_No;
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	USART_InitStructure.USART_Mode = USART_Mode_Tx;
	USART_Init(USART2, &USART_InitStructure);

	USART_Cmd(USART2, ENABLE); // enable USART2

}


    
sprintf(str,"GX%dGY%dGZ%dAX%dAY%dAZ%dS\r\n",GyrX,GyrY,GyrZ,AccX,AccY,AccZ);
USART_puts(USART2,str);//


Olarak Kullanmışım ben.
ama

#include "stm32f4xx_usart.h"
dosyasını kullanmışım.

camby

define ile belirtilmiş kristal hızını kontrol edin.  Usart library'leri işlem yaparken , define ile belirlenmiş hızları referans alıyorlar.

muhittin_kaplan

Onun için bahse konu olan stm_clock_configuration tool adında bir excel dosyası var. onu kullanın. config dosyası üretiyor.

electrical

muhittin hocam #include "stm32f4xx_usart.h" dosyasını ekleyip de denedim onla ilgili değil. stm_clock_configuration tool nasıl kullanacağım ve birde kristal hızını nasıl tanımlayacağım usart kütüphanesinde söyle bir tanım yapılmış birde clockla ilgili
/** @defgroup USART_Clock 
  * @{
  */ 
#define USART_Clock_Disable                  ((uint16_t)0x0000)
#define USART_Clock_Enable                   ((uint16_t)0x0800)
#define IS_USART_CLOCK(CLOCK) (((CLOCK) == USART_Clock_Disable) || \
                               ((CLOCK) == USART_Clock_Enable))
/**
  * @}
  */ 

/** @defgroup USART_Clock_Polarity 
  * @{
  */
  
#define USART_CPOL_Low                       ((uint16_t)0x0000)
#define USART_CPOL_High                      ((uint16_t)0x0400)
#define IS_USART_CPOL(CPOL) (((CPOL) == USART_CPOL_Low) || ((CPOL) == USART_CPOL_High))

/**
  * @}
  */ 

/** @defgroup USART_Clock_Phase
  * @{
  */

#define USART_CPHA_1Edge                     ((uint16_t)0x0000)
#define USART_CPHA_2Edge                     ((uint16_t)0x0200)
#define IS_USART_CPHA(CPHA) (((CPHA) == USART_CPHA_1Edge) || ((CPHA) == USART_CPHA_2Edge)


electrical

sorunu şuan itibari ile çözdüm arkadaşlar ama biraz kafam karıştı tam kavrayamadım stm32f4xx.h kütüphanesinde bazılarında

  * @file    stm32f4xx.h
  * @author  MCD Application Team
  * @version V1.1.0
  * @date    11-January-2013

    #if !defined  (HSE_VALUE)
    #define HSE_VALUE    ((uint32_t)25000000) /*!< Value of the External oscillator in Hz */
    #endif /* HSE_VALUE */

olarak 25 Mhz olarak tanımlanmış bende boyle

ama bazılarında ise

  * @file    stm32f4xx.h
  * @author  MCD Application Team
  * @version V1.0.0
  * @date    30-September-2011

#if !defined  (HSE_VALUE)
  #define HSE_VALUE    ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */
#endif /* HSE_VALUE */

8 MHz olarak tanımlanmış 8MHz olanlarda direk olarak 9600 baund yazdığımız da 9600 olarak kabul ediyor
ama bende 25 Mhz olarak tanımlı ve 9600 baund için ben 9600*3 olarak kodda yazıyorum ve terminalde ise direk 9600 baund ayarlayarak düzgün bir şekilde iletişim sağlanıyor.

muhittin_kaplan

Bu dosyanın çalışmasında bazı sıkıntılar mevcut.
sedec define ile xtal hızını tanımladığımızda, eğer register ayarlarıyla pll felan ayarlamaz isek sistem hızında tanımlamanın bir etkisi olmuyor, bunun yanısıra çevresel üniteler tanımlamadan alıyor. Dolayısıyla rada uyumsuzluk oluşuyor.
Anlayacağın define ile tanımlı xtal ile pll vs ayalarının tam yapılması gerkiyor. sadece tanımlama yapmak işlemci hızını değiştirmiyor.