Ders 9: Stm32f4 ile USART kullanımı

Bu dersimizde stm32f4 ile USART kullanımına giriş yapacağız.USART hakkında internet ortamında detaylıca bilgi bulabileceğinizden USART hakkında genel tanımlamalara değinilmeyecek olup işlemcimiz ile nasıl kullanabileceğimiz kısmına değineceğiz.Diğer kısımlar için aklınıza takılanları yazabilirsiniz.

Dersin bu kısmında daha önceden ADC dersinde kullandığımız potansiyometre uygulaması ile elde ettiğimiz dataları bilgisayara seri port üzerinden TTL modül kullanarak göndereceğiz.(*USART derslerimizde TTL modüllerimizi yanımızdan ayırmayacağız)

Her zaman yaptığımız gibi program yazma aşamasına girmeden önce datasheetleri ve kullanacağımız birimin kütüphanesini incelemeye başlıyoruz.

► stm32f4xx_usart.c kütüphanesine göz atalım

1

♣ Her zamanki gibi ilk yapmamız gerekenler clock hattını aktif etmek,sonrasında USART haberleşmesinde kullanılacak pinlerin ayarları,haberleşmenin genel ayarları,interrupt,dma… gibi ayarlar.

♣ Sıra geldi haberleşmede hangi USART birimi kullanılacak ve bu USART için istediğim pinleri seçebilecek miyim? Buna cevaben datasheeti kurcalamaya başlıyoruz. Ben USART2 kullanmaya karar verdim,siz de istediğinizi kullanabilirsiniz.

2

3

Görüldüğü üzere pinleri “AF” olarak tanımlamamız gerektiğini kolayca öğreniyoruz.Bu derste tek taraflı iletişim yapacağımızdan sadece USART2_TX i yani PA2 pinini aktif edeceğim.(Diğer derslerimizde veri alma kısmına değineceğim)

♣ Sıra geldi haberleşme ayarlarımıza,bunun için kütüphaneyi biraz talan ediyoruz,bu süreçte gözümüze takılan diğer kısımları da okuyup bilgi sahibi oluyoruz

4

(*İlk uygulama olacağından haberleşme ayarlarını default olacak şekilde ayarlayacağım.)

 

♣ Sıra geldi potansiyometreden değerleri okuyabilmek için gerekli ADC ayarlarının yapılmasına.Bu konu için önceki derlerimize göz atabilirsiniz.

Şimdi kod yazmaya hazırız.USART adında proje oluşturup kodlarımızı yazıyoruz.(Proje oluşturma işlemi için önceki derslerimize göz atabilirsiniz)

(Manage Run kısmında önceki derslerden farklı olarak USART ı seçmeyi unutmayın)

 

♦ İşlemci-Bilgisayar arası iletişim hariç her şey tamam.Sıra geldi stm32f4 – TTL modül ve potansiyometre bağlantılarına,

Potansiyometre Vcc –> stm32f4 3V3

Potansiyometre GND –> stm32f4 GND

Potansiyometre Data –> stm32f4 PA0

USB TTL GND –> stm32f4 GND

USB TTL VCC –> stm32f4 5V

USB TTL RX –> stm32f4 PA2

Bağlantılarda tamam olduğuna göre kodu derleyip herhangi bir terminal programı kullanılarak potansiyometreden ölçtüğümüz değeri görebiliriz.

#include "stm32f4xx.h"                  // Device header
#include <stdio.h>    
char str[50];
uint32_t i = 0;
 
uint16_t Read_ADC(void) //
{
	ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1, ADC_SampleTime_56Cycles);  //hesaplama tek cycle da hesaplanmaz,genis sürede daha az ak1m ceker,tepki süresi önemli ise kisa tutulabilir
	ADC_SoftwareStartConv(ADC1);     // adc1 üzerinde yazilimsal dönüsümü baslat 
	while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==RESET);  // icerideki sart saglandikca assagiya inme while noktali virgül ile bitiyorsa
	return ADC_GetConversionValue(ADC1);	
}	
 
 
void USART_Puts(USART_TypeDef* USARTx, volatile char *s)
{
	while(*s)
	{
		while(!(USARTx ->SR & 0x00000040)); // TX Buffer dolu ise bekle
		USART_SendData(USARTx, *s);
		*s++;
	}
}
 
int main()
{
	uint16_t adc_data; //
 
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
 
	ADC_InitTypeDef ADC_InitStructure; //
	ADC_CommonInitTypeDef ADC_CommonInitStructure; //
 
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); // USART2 clock
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); // A portu clock
 
 
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); // ADC clock
 
	/* ADC ve Potansiyometre Ayarlari */
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
	GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
	GPIO_Init(GPIOA, & GPIO_InitStructure);
 
	ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
	ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4; // 4/8/16.. vs olabilir kristalin 4 de 1 i seçtik
	ADC_CommonInit(& ADC_CommonInitStructure);
 
	ADC_InitStructure.ADC_Resolution = ADC_Resolution_8b; // ADC cözünürlügü 8 bit
	ADC_Init(ADC1, & ADC_InitStructure);
 
	ADC_Cmd(ADC1, ENABLE);
 
	/* USART2 Ayarlari */
        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); 
 
	GPIO_PinAFConfig(GPIOA , GPIO_PinSource2,  GPIO_AF_USART2);
 
	USART_InitStructure.USART_BaudRate            = 115200; // baudrate
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	USART_InitStructure.USART_Mode                = USART_Mode_Tx;
	USART_InitStructure.USART_Parity              = USART_Parity_No ;
	USART_InitStructure.USART_StopBits            = USART_StopBits_1;
	USART_InitStructure.USART_WordLength          = USART_WordLength_8b;
	USART_Init(USART2,& USART_InitStructure);
	USART_Cmd(USART2, ENABLE);
 
	while(1)
	{
		adc_data = Read_ADC(); 
		sprintf(str,"%d\n",adc_data);
		USART_Puts(USART2,str);
	}
}

 

#include <stdio.h>  kütüphanesi  “sprintf()” fonksiyonu için kullanıldı. integer tipte okuma yaptığımızdan format tanımlayıcı olarak %d kullanıldı.Diğer tipler için ise aşağıdaki tabloya göz atabilirsiniz.

5

Yorum

  1. By Emre

    Cevapla

    • By Oğuzhan Gültekin

      Cevapla

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir