18 Ekim 2016 Salı

8 - ADC_PWM_USART örneği

Merhaba arkadaşlar,

Sıradaki paylaşımda anlatım yapılmadan direkt kod paylaşımı olacaktır. çünkü daha önceki paylaşımları yapan arkadaşlar bu yeni örneği anlamada zorluk çekmeyecektir.

Yine de örneği özetleyecek olursak;

STM32F4 kartımızın A0 pininden ADC bilgisi okunuyor ve bu ADC bilgisi PWM'e göre oranlandıktan sonra (sebebi periyod değerimiz) pwm çıkışı verilmektedir. ancak bunu yaparken de aynı zamanda görebilmemiz açısından PC' ye bu bilgiler USART aracılığıyla gönderilmektedir.

aşağıda kodlar bulunmaktadır.:

#include "stm32f4xx.h" // stm32f4 kütüphanesi 
#include "stm32f4xx_gpio.h"         // GPIO kütüphanesi
#include "stm32f4xx_rcc.h"        // RCC clock kütüphanesi
#include "stm32f4xx_adc.h"                // ADC clock kütüphanesi

#include "stm32f4xx_usart.h"       // Keil::Device:StdPeriph Drivers:USART
#include "delay.h"
#include "stm32f4xx_tim.h"

#include <stdio.h>
#include <stdlib.h>

uint32_t i;
uint8_t dolu;
char gonder;
uint16_t PRSC_Value;
char str[50];
volatile char veri;
uint16_t ADC_deger=0;


void Periph_Config()
{
/* GPIOD ve GPIOA Periph clock hattlari aktif edilir */
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);

/* ADC1 Periph clock hatti aktif edilir */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
}




void USART_Puts(USART_TypeDef* USARTx, volatile char *s)
{
while(*s)
{
while(!(USARTx ->SR & 0x00000040));
USART_SendData(USARTx,*s);
*s++;
}
}

uint16_t ADC_Oku()
{
  ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_56Cycles); //ADC
  KANAL 0 SECILDI VE 56 CYCLES KONUMUNDA
  ADC_SoftwareStartConv(ADC1); //DONUSUME BASLA DEDIK
  while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==RESET); //HER DÖNUSUM SONRASI
  BAYRAGI SIFIRLAYALIM
  return ADC_GetConversionValue(ADC1);
}

void GPIO_led_Config()
{
GPIO_InitTypeDef  GPIO_InitStructure; // Port yönlendirmesi

    /* PD12, 13, 14 ve PD15 pinleri kullan1lacak */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //Pinler cikis olarak belirlendi
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //Pin PushPull olarak ayarlandi
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //GPIO Bus hizi 100 MHz ayarlandi
    GPIO_Init(GPIOD, &GPIO_InitStructure);  
     //Yukarida tanimlanan bilgileri GPIOD adresine ait oldugu belirtilir
}




void USART_Config()
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
// GPIO ALTERNATE FUNCTION olarak tanimlanan pinin konfigürasyonlari 
// pin ile baglant1 kuracagi modül belirlenir.  
GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_USART1);
// USART konfigürasyonlari:
USART_InitStructure.USART_BaudRate  = 115200;
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(USART1, &USART_InitStructure);
USART_Cmd(USART1, ENABLE);
}



void ADC_GPIO_Config()
{
GPIO_InitTypeDef  GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; //Pinler analog giris olarak belirlendi
   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //Pin PushPull olarak ayarlandi
   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //GPIO Bus hizi 100 MHz ayarlandi
   GPIO_Init(GPIOA, &GPIO_InitStructure); 
   //Yukarida tanimlanan bilgileri GPIOA adresine ait oldugu belirtilir
}


void ADC1_Config()
{
ADC_InitTypeDef ADC_InitStructure;
ADC_CommonInitTypeDef ADC_CommonInitStructure;
ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_CommonInitStructure.ADC_Prescaler  = ADC_Prescaler_Div4;
ADC_CommonInitStructure.ADC_TwoSamplingDelay= DC_TwoSamplingDelay_5Cycles;
ADC_CommonInit(&ADC_CommonInitStructure);
ADC_InitStructure.ADC_ContinuousConvMode =DISABLE;
ADC_InitStructure.ADC_ScanConvMode =DISABLE;
ADC_InitStructure.ADC_Resolution =ADC_Resolution_12b;
ADC_InitStructure.ADC_ExternalTrigConv =ADC_ExternalTrigConvEdge_None;
ADC_InitStructure.ADC_DataAlign =ADC_DataAlign_Right;
ADC_Init(ADC1,&ADC_InitStructure);
ADC_Cmd(ADC1,ENABLE);
}



void Timer_GPIO_Config()
{
GPIO_InitTypeDef  GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //Pinler pwm cikis olarak belirlendi
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //Pin PushPull olarak ayarlandi
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //GPIO Bus hizi 100 MHz ayarlandi
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    //Yukarida tanimlanan bilgileri GPIOD adresine ait oldugu belirtilir
GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_TIM5);
}


void Timer_Config()
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
PRSC_Value = (uint16_t)(SystemCoreClock/2 / 4000000)-1;
TIM_DeInit(TIM10);
   TIM_TimeBaseStructure.TIM_ClockDivision = 0; 
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_Period = 255 - 1;
TIM_TimeBaseStructure.TIM_Prescaler = PRSC_Value;
TIM_TimeBaseInit( TIM5,&TIM_TimeBaseStructure);
}



void PWM_Config()
{
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
//4.kanal %100 pwm
//PD3
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 0;
TIM_OC4Init(TIM5, &TIM_OCInitStructure);
TIM_OC4PreloadConfig(TIM5, TIM_OCPreload_Enable);
TIM_ARRPreloadConfig(TIM5, ENABLE);
TIM_Cmd(TIM5,ENABLE);
}




int main(void)
{
Periph_Config();
GPIO_led_Config();
USART_Config();
ADC_GPIO_Config();
ADC1_Config();
Timer_GPIO_Config();
Timer_Config();
PWM_Config();
while(1)
{
// oncelikle ADC'den okuma yapiliyor
uint16_t Data =0;
Data = ADC_Oku(); 
//periyot 255 verildigi icin ve ADC 12 bit oldugundan dolayi
//gelen bilgiyi 0-255 arasi oranliyoruz
Data = (Data*255)/4096;
//oranlanan ilgi gonderiliyor
USART_SendData(USART1, Data);
i = 600000;
while(i)
i--;
// burada da bilgi pwm olarak timer'a yaziliyor
TIM5->CCR4 = Data;
// yine oranlanan bilgimizin % 'lik degeri gonderiliyor
Data= Data * 100/255;
USART_SendData(USART1, Data);
i = 600000;
while(i)
i--;
}
}


Aşağıda kodun resimleri bulunmaktadır:






Sorularınız olursa aşağıya yorum yazabilirsiniz.

İyi Çalışmalar
                                                                                                                    


8 - ADC_PWM_USART örneği

Merhaba arkadaşlar,

Sıradaki paylaşımda anlatım yapılmadan direkt kod paylaşımı olacaktır. çünkü daha önceki paylaşımları yapan arkadaşlar bu yeni örneği anlamada zorluk çekmeyecektir.

Yine de örneği özetleyecek olursak;

STM32F4 kartımızın A0 pininden ADC bilgisi okunuyor ve bu ADC bilgisi PWM'e göre oranlandıktan sonra (sebebi periyod değerimiz) pwm çıkışı verilmektedir. ancak bunu yaparken de aynı zamanda görebilmemiz açısından PC' ye bu bilgiler USART aracılığıyla gönderilmektedir.

aşağıda kodlar bulunmaktadır.:

#include "stm32f4xx.h" // stm32f4 kütüphanesi 
#include "stm32f4xx_gpio.h"         // GPIO kütüphanesi
#include "stm32f4xx_rcc.h"        // RCC clock kütüphanesi
#include "stm32f4xx_adc.h"                // ADC clock kütüphanesi

#include "stm32f4xx_usart.h"       // Keil::Device:StdPeriph Drivers:USART
#include "delay.h"
#include "stm32f4xx_tim.h"

#include <stdio.h>
#include <stdlib.h>

uint32_t i;
uint8_t dolu;
char gonder;
uint16_t PRSC_Value;
char str[50];
volatile char veri;
uint16_t ADC_deger=0;


void Periph_Config()
{
/* GPIOD ve GPIOA Periph clock hattlari aktif edilir */
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);

/* ADC1 Periph clock hatti aktif edilir */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
}




void USART_Puts(USART_TypeDef* USARTx, volatile char *s)
{
while(*s)
{
while(!(USARTx ->SR & 0x00000040));
USART_SendData(USARTx,*s);
*s++;
}
}

uint16_t ADC_Oku()
{
ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_56Cycles); //ADC KANAL 0 SECILDI VE 56 CYCLES KONUMUNDA
ADC_SoftwareStartConv(ADC1); //DONUSUME BASLA DEDIK
while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==RESET); //HER DÖNUSUM SONRASI BAYRAGI SIFIRLAYALIM
return ADC_GetConversionValue(ADC1);
}

void GPIO_led_Config()
{
GPIO_InitTypeDef  GPIO_InitStructure; // Port yönlendirmesi


      /* PD12, 13, 14 ve PD15 pinleri kullan1lacak */
     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //Pinler cikis olarak belirlendi
     GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //Pin PushPull olarak ayarlandi
     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //GPIO Bus hizi 100 MHz ayarlandi      GPIO_Init(GPIOD, &GPIO_InitStructure);  
     //Yukarida tanimlanan bilgileri GPIOD adresine ait oldugu belirtilir
}




void USART_Config()
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
// GPIO ALTERNATE FUNCTION olarak tanimlanan pinin konfigürasyonlari 
// pin ile baglant1 kuracagi modül belirlenir.  
GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_USART1);
// USART konfigürasyonlari:
USART_InitStructure.USART_BaudRate  = 115200;
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(USART1, &USART_InitStructure);
USART_Cmd(USART1, ENABLE);
}



void ADC_GPIO_Config()
{
GPIO_InitTypeDef  GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
       GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; //Pinler analog giris olarak belirlendi
       GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //Pin PushPull olarak ayarlandi
       GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
       GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //GPIO Bus hizi 100 MHz ayarlandi
       GPIO_Init(GPIOA, &GPIO_InitStructure); 
//Yukarida tanimlanan bilgileri GPIOA adresine ait oldugu belirtilir
}


void ADC1_Config()
{
ADC_InitTypeDef ADC_InitStructure;
ADC_CommonInitTypeDef ADC_CommonInitStructure;
ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_CommonInitStructure.ADC_Prescaler  = ADC_Prescaler_Div4;
ADC_CommonInitStructure.ADC_TwoSamplingDelay= DC_TwoSamplingDelay_5Cycles;
ADC_CommonInit(&ADC_CommonInitStructure);
ADC_InitStructure.ADC_ContinuousConvMode =DISABLE;
ADC_InitStructure.ADC_ScanConvMode =DISABLE;
ADC_InitStructure.ADC_Resolution =ADC_Resolution_12b;
ADC_InitStructure.ADC_ExternalTrigConv =ADC_ExternalTrigConvEdge_None;
ADC_InitStructure.ADC_DataAlign =ADC_DataAlign_Right;
ADC_Init(ADC1,&ADC_InitStructure);
ADC_Cmd(ADC1,ENABLE);
}



void Timer_GPIO_Config()
{
GPIO_InitTypeDef  GPIO_InitStructure;
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //Pinler pwm cikis olarak belirlendi
      GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //Pin PushPull olarak ayarlandi
      GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //GPIO Bus hizi 100 MHz ayarlandi
     GPIO_Init(GPIOA, &GPIO_InitStructure);
     //Yukarida tanimlanan bilgileri GPIOD adresine ait oldugu belirtilir
GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_TIM5);
}


void Timer_Config()
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
PRSC_Value = (uint16_t)(SystemCoreClock/2 / 4000000)-1;
TIM_DeInit(TIM10);
  TIM_TimeBaseStructure.TIM_ClockDivision = 0; 
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_Period = 255 - 1;
TIM_TimeBaseStructure.TIM_Prescaler = PRSC_Value;
TIM_TimeBaseInit( TIM5,&TIM_TimeBaseStructure);
}



void PWM_Config()
{
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
//4.kanal %100 pwm
//PD3
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 0;
TIM_OC4Init(TIM5, &TIM_OCInitStructure);
TIM_OC4PreloadConfig(TIM5, TIM_OCPreload_Enable);
TIM_ARRPreloadConfig(TIM5, ENABLE);
TIM_Cmd(TIM5,ENABLE);
}




int main(void)
{
Periph_Config();
GPIO_led_Config();
USART_Config();
ADC_GPIO_Config();
ADC1_Config();
Timer_GPIO_Config();
Timer_Config();
PWM_Config();
while(1)
{
// oncelikle ADC'den okuma yapiliyor
uint16_t Data =0;
Data = ADC_Oku(); 
//periyot 255 verildigi icin ve ADC 12 bit oldugundan dolayi
//gelen bilgiyi 0-255 arasi oranliyoruz
Data = (Data*255)/4096;
//oranlanan ilgi gonderiliyor
USART_SendData(USART1, Data);
i = 600000;
while(i)
i--;
// burada da bilgi pwm olarak timer'a yaziliyor
TIM5->CCR4 = Data;
// yine oranlanan bilgimizin % 'lik degeri gonderiliyor
Data= Data * 100/255;
USART_SendData(USART1, Data);
i = 600000;
while(i)
i--;
}
}


Aşağıda kodun resimleri bulunmaktadır:






Sorularınız olursa aşağıya yorum yazabilirsiniz.

İyi Çalışmalar
                                                                                                                    


6 Ekim 2016 Perşembe

7- STM32F4 USART Kullanımı

Merhaba Arkadaşlar,
                Sıradaki örneğimiz Stm32f4 ile USART haberleşmesi nasıl yapılır, bunun hakkında kısa bilgi ardından da kod paylaşımı yapılacaktır.
USART; (Universal Synchronous-Asynchronous Receiver – Transmitter), 0 ve 1 ‘lerden oluşan verileri, iki dijital sistem arasında alma- gönderme işlemlerinde kullanılan bir iletişim protokülüdür. İletişim seri ve paralel olmak üzere iki şekilde yapılabilir. Bunlar paralel ve seri iletişimdir. Paralel iletişimde veriler göndericiden alıcıya aynı anda birden fazla sayıda bit gidecek şekilde gönderilir. Seri iletişimde ise veriler tek hat üzerinden sırayla giderler. Bu yüzden paralel haberleşme seri haberleşmeye göre daha hızlıdır. Ancak uzun mesafeler için paralel haberleşme uygun değildir. Usart haberleşmesi bir seri iletişim protokolüdür. 

STM32F4’de aşağıdaki tabloda gösterildiği gibi 8 adet USART birimi vardır.  


Aşağıda gösterildiği üzere USART1 APB2 bus hattına, USART2 APB1 bus hattına bağlıdır. Konfigürasyon ayarlamaları yapılırken bunlara dikkat etmemiz gerekir. Detaylı bilgilere kitaplardan ya da internet üzerinden araştırılarak ulaşılabilir. Biz direkt kod yazımına geçeceğiz.

 

Artık kod yazma kısmına geçebiliriz:
1 - Öncelikle gerekli kütüphane eklemelerini yapmamız gerek. Bunlar:
#include "stm32f4xx.h"                                               //stm32f4 kütüphanesi
#include "stm32f4xx_gpio.h"                    //GPIO kütüphanesi
#include "stm32f4xx_rcc.h"                       // RCC clock kütüphanesi
#include "stm32f4xx_usart.h"                  // usart kütüphanesi
#include <stdio.h>                                         // C kütüphaneleri
#include <stdlib.h>

char          str[50];                             //değişken tanımlaması
uint32_t              i;

2- Periph clock hatlarını aktifleştirelim:
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
3- Usart ayarlamalarını yapalım:
void USART_Config()
{
    GPIO_InitTypeDef                               GPIO_InitStructure;
    USART_InitTypeDef                            USART_InitStructure;
                              
  GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;   //alternatif fonksiyon için kullanacağız
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; 
  GPIO_InitStructure.GPIO_PuPd              = GPIO_PuPd_UP;
  GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_6;          //PB6 pini => USART1 (TX) pinidir
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
               
  // GPIO ALTERNATE FUNCTION olarak tanimlanan pinin konfigürasyonlari
  // pin ile bağlantı kuracagi modül belirlenir. 
 GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_USART1); //PB6 dan göndereceğiz
               
  // USART konfigürasyonlari:
   USART_InitStructure.USART_BaudRate       = 115200;  //baudrate
   USART_InitStructure.USART_HardwareFlowControl  = USART_HardwareFlowControl_None;
   USART_InitStructure.USART_Mode       = USART_Mode_Tx; //gönderme modu
   USART_InitStructure.USART_Parity       = USART_Parity_No;    //parity biti yok
   USART_InitStructure.USART_StopBits  = USART_StopBits_1;
   USART_InitStructure.USART_WordLength = USART_WordLength_8b; //8bit veri uzunluğu
   USART_Init(USART1, &USART_InitStructure);
                                                                                             
   USART_Cmd(USART1, ENABLE);
}

4- Ana Döngü:
int main(void)
{
      Periph_Config();
      USART_Config();
               
           while(1)
               {
                     sprintf(str, " stm32f4 uygulamasi \n"); //yazı olarak gönderilecek
                     USART_Puts(USART1, str); //usart fonksiyonu
                     i= 5000000;
                     while(i)     i--;
                }                                            
}

///////////////////////////
USART Fonksiyonu

void USART_Puts(USART_TypeDef* USARTx, volatile char *s)
                {
                          while(*s)
                            {
                                while(!(USARTx ->SR & 0x00000040));
                                USART_SendData(USARTx,*s);
                                *s++;
                             }
                }

Aşağıda kodun resmini bulabilirsiniz:


İyi Çalışmalar.

                                                                                                                      

22 Eylül 2016 Perşembe

6- STM32F4 ADC Kullanımı

Merhaba Arkadaşlar,

                Sıradaki örneğimiz Stm32f4 ile ADC ( Analog to Digital Converter) nasıl kullanılır, bunun hakkında kısa bilgi ardından da kod paylaşımı yapılacaktır.

STM32F4’de aşağıdaki tabloda gösterildiği gibi 3 adet ADC ve her birine bağlı olarak 16 kanal bulunmaktadır.


Son olarak da STM32F4’de ADC 12Bit çözünürlüğe sahiptir. ADC hakkında daha fazla bilgiye ihtiyaç olmadığı için direkt kod yazımına geçebiliriz.

Aşağıdaki tabloda da görüldüğü üzere ADC1, ADC2 ve ADC3 hepsi de APB2 bus hattına bağlıdır.



Artık kod yazma kısmına geçebiliriz:
uint16_t ADC_Degeri;                   // ADC için değişken
1 - Öncelikle gerekli kütüphane eklemelerini yapmamız gerek. Bunlar:
#include "stm32f4xx.h"                             //stm32f4 kütüphanesi
#include "stm32f4xx_gpio.h"                    //GPIO kütüphanesi
#include "stm32f4xx_rcc.h"                      // RCC clock kütüphanesi
#include "stm32f4xx_adc.h"                     // timer kütüphanesi

2- Periph clock hatlarını aktifleştirelim:
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);

3- Output portunu ayarlamasını yapalım:
void GPIO_led_Config()
{
GPIO_InitTypeDef  GPIO_InitStructure;              // Port yönlendirmesi
   /* PD12, 13, 14 ve PD15 pinleri kullan1lacak */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;      //Pinler cikis olarak belirlendi
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;      //Pin PushPull olarak ayarlandi
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;      //GPIO Bus hizi 100 MHz ayarlandi
GPIO_Init(GPIOD, &GPIO_InitStructure);    
//Yukarida tanimlanan bilgileri GPIOD adresine ait oldugu belirtilir
}

4- ADC pin ayarlamaları için:
void ADC_GPIO_Config()
{
GPIO_InitTypeDef  GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;    //Pinler analog giris olarak belirlendi
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;   //Pin PushPull olarak ayarlandi
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;       //GPIO Bus hizi 100 MHz ayarlandi
GPIO_Init(GPIOA, &GPIO_InitStructure);                                                                                         //Yukarida tanimlanan bilgileri GPIOA adresine ait oldugu belirtilir
}

4- ADC konfigürasyon ayarlamaları için:
void ADC1_Config()
{
ADC_InitTypeDef                        ADC_InitStructure;
ADC_CommonInitTypeDef         ADC_CommonInitStructure;
               
ADC_CommonInitStructure.ADC_Mode      = ADC_Mode_Independent;
ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;
ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
ADC_CommonInitStructure.ADC_TwoSamplingDelay =  ADC_TwoSamplingDelay_5Cycles;
ADC_CommonInit(&ADC_CommonInitStructure);
               
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConvEdge_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfConversion = 1;
ADC_Init(ADC1,&ADC_InitStructure);
ADC_Cmd(ADC1,ENABLE);
}

5- ADC bilgisinin okunması

uint16_t ADC_Oku()
{
  ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_56Cycles); 
  //ADC için KANAL 0 SECILDI VE 56 CYCLES KONUMUNDA

  ADC_SoftwareStartConv(ADC1);          //DONUSUME BASLA DEDIK
  while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==RESET); 
    //HER DÖNUSUM SONRASI BAYRAGI SIFIRLAYALIM

   return ADC_GetConversionValue(ADC1);
}

//ANA Fonksiyon

int main(void)
{
                Periph_Config();
                GPIO_led_Config();
                ADC_GPIO_Config();
                ADC1_Config();
                                                              
                while (1)              //Sonsuz donguye girilir
                               {                                            
                                     ADC_Degeri = ADC_Oku();
                                              
                                     if ( ADC_Degeri < 1024 )
                                           {
                                                  GPIO_ResetBits(GPIOD, GPIO_Pin_12);
                                                  GPIO_ResetBits(GPIOD, GPIO_Pin_13);
                                                  GPIO_ResetBits(GPIOD, GPIO_Pin_14);
                                                  GPIO_ResetBits(GPIOD, GPIO_Pin_15);
                                             }
                                                              
                                        else if ( 1024 < ADC_Degeri && ADC_Degeri < 2048 )
                                             {
                                                   GPIO_SetBits(GPIOD, GPIO_Pin_12);
                                                   GPIO_ResetBits(GPIOD, GPIO_Pin_13);
                                                   GPIO_ResetBits(GPIOD, GPIO_Pin_14);
                                                   GPIO_ResetBits(GPIOD, GPIO_Pin_15);
                                             }
                                                              
                                        else if ( 2048 < ADC_Degeri && ADC_Degeri < 3072 )
                                             {
                                                   GPIO_SetBits(GPIOD, GPIO_Pin_12);
                                                   GPIO_SetBits(GPIOD, GPIO_Pin_13);
                                                   GPIO_ResetBits(GPIOD, GPIO_Pin_14);
                                                   GPIO_ResetBits(GPIOD, GPIO_Pin_15);
                                              }
                                                              
                                       else if ( 3072 < ADC_Degeri && ADC_Degeri < 3800 )
                                              {
                                                    GPIO_SetBits(GPIOD, GPIO_Pin_12);
                                                    GPIO_SetBits(GPIOD, GPIO_Pin_13);
                                                    GPIO_SetBits(GPIOD, GPIO_Pin_14);
                                                    GPIO_ResetBits(GPIOD, GPIO_Pin_15);
                                               }
                                                              
                                        else
                                               {
                                                     GPIO_SetBits(GPIOD, GPIO_Pin_12);
                                                     GPIO_SetBits(GPIOD, GPIO_Pin_13);
                                                     GPIO_SetBits(GPIOD, GPIO_Pin_14);
                                                     GPIO_SetBits(GPIOD, GPIO_Pin_15);
                                               }
                                              
                               }
}

Aşağıda kodun resmini bulabilirsiniz:




İyi Çalışmalar.