5 Nisan 2019 Cuma

STM32F4 USART Örneği Standart Peripheral Library(SPL)


     USART (Universal Asynchronous Receiver Transmitter)  senkron yada asenkron olarak veri gönderimi ve alımını sağlayan bir seri iletişim.  USART ile 3 – 9 arası bit uzunluğunda veri taşır. STM32F4’te 8 veya 9 bit uzunlukta veri taşınır. senkron modda veri aktarımı için clock hattına ihtiyaç duyar. Asenkron modda ise herhangi bir clock’a ihtiyaç duymadan veri aktarımı sağlanabilir. Veri aktarımı için veri aktarım hızı yani baud rate belirlenmesi gerekir. Baud rate saniyede gönderilen bit sayısı demektir ve genel olarak 1200, 2400, 4800, 19200, 38400, 57600 ve115200 değerleri kullanılır. Alıcı ve vericinin  aynı baud rate değerlerine sahip olmaları gerekmektedir.  
     Bilgisayara USART ile veri iletmek ve almak için usb-ttl dönüştürücüsü gerekir. Bağlantı yaparken Rx-Tx, Tx-Rx şeklinde yapılır. Eğer stm32f4 usb ile bilgisayara bağlıysa usb-ttl dönüştürücünün diğer pinlerini bağlamaya gerek yoktur. USART için kullanılabilecek portlar aşağıdaki tablodaki gibidir. Bu uygulamada PA2 (Tx )ve PA3(Rx) pinleri kullanılacak. 

      STM32F4’te usart ayarları stm32f4xx_usart.h kütüphanesinde bulunan USART_InitTypeDef structı kullanılarak yapılır. Bu struct ile baudrate, data uzunluğu, datanın gönderileceği yada alınacağı gibi temel ayarları yapılır.






// USART2
USART_InitTypeDef USART_InitStruct;
USART_InitStruct.USART_WordLength = USART_WordLength_8b;
USART_InitStruct.USART_StopBits = USART_StopBits_1;
USART_InitStruct.USART_Parity = USART_Parity_No;
USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_InitStruct.USART_BaudRate = 115200;
USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_Init(USART2, &USART_InitStruct);
USART_Cmd(USART2, ENABLE);

  Rx ve Tx olarak kullanıcağımız pinlerin tanımlamalarını yapıyoruz.  


GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_USART2);//PA2->Tx
GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_USART2);//PA3->Rx

//GPIOA
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOA, &GPIO_InitStruct);


Bilgisayardan STM32F4’e veri göndermek için kullanılacak fonksiyonu yazıyoruz.



uint16_t USART_GetChar()
{

    while (!USART_GetFlagStatus(USART2, USART_FLAG_RXNE));

    return USART_ReceiveData(USART2);
}




STM32F4’ten bilgisayara veri gönderimini sağlayacak fonksiyonları yazıyoruz. 



void USART_PutChar(char c)
{

   while (!USART_GetFlagStatus(USART2, USART_FLAG_TXE));

   USART_SendData(USART2, c);
}

void USART_PutString(char *s)
{
  // stringi gönder
   while (*s)
   {
        USART_PutChar(*s++);
   }
}




Fonksiyonları ve tanımlamaları main.c dosyasında birleştirerek örnek programı yazıyoruz. Program da bilgisayardan STM32F4'e H karakteri gönderilirse PE7 pini high olacak ve led yanacak, L karakteri gönderilirse PE7 pini low olacak, S karakteri gönderilirse STM32F4'ten bilgisayara Hello World stringi gelecek ve ekrana yazılacak.



#include "stm32f4xx.h"


uint16_t USART_GetChar()
{
    // Data alinana kadar bekle
    while (!USART_GetFlagStatus(USART2, USART_FLAG_RXNE));
    // Alinan datayi oku
    return USART_ReceiveData(USART2);
}


void USART_PutChar(char c)
{
    // Data registeri bosalana kadar bekle 
    while (!USART_GetFlagStatus(USART2, USART_FLAG_TXE));
    // USART1 ile c datasini gönder
    USART_SendData(USART2, c);
}

void USART_PutString(char *s)
{
    // stringi gönder
    while (*s)
    {
         USART_PutChar(*s++);
    }
}



int main(void)
{
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);


    GPIO_InitTypeDef GPIO_InitDef;
    GPIO_InitDef.GPIO_Pin = GPIO_Pin_8;
    GPIO_InitDef.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitDef.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitDef.GPIO_OType = GPIO_OType_PP;
    GPIO_InitDef.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOE, &GPIO_InitDef);


    GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_USART2);//PA2->Tx
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_USART2);//PA3->Rx

    //GPIOA
    GPIO_InitTypeDef GPIO_InitStruct;
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_Init(GPIOA, &GPIO_InitStruct);

    // USART2
    USART_InitTypeDef USART_InitStruct;
    USART_InitStruct.USART_WordLength = USART_WordLength_8b;
    USART_InitStruct.USART_StopBits = USART_StopBits_1;
    USART_InitStruct.USART_Parity = USART_Parity_No;
    USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    USART_InitStruct.USART_BaudRate = 115200;
    USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_Init(USART2, &USART_InitStruct);
    USART_Cmd(USART2, ENABLE);



    while (1)
    {


        uint16_t data = USART_GetChar(); //bilgisayardan input al 

        if (data == 'H')//H karakteri gelirse PD13 High olsun
        {
            GPIO_SetBits(GPIOE, GPIO_Pin_8);
        }
        else if (data == 'L')//L karakteri gelirse PD13 Low olsun 
        {
            GPIO_ResetBits(GPIOE, GPIO_Pin_8);
        }
        else if (data == 'S')//L karakteri gelirse PD13 Low olsun 
        {
            USART_PutString("Hello, World\n");
        } 
 
     }
}


Programın örnek videosu aşağıdadır.  Sorularınızı yorum olarak belirtirtebilirsiniz.









Hiç yorum yok:

Yorum Gönder