Ayhan 15 Temmuz 2013 ARM

USART
Merhaba arkadaşlar bu yazımda her mikro denetleyici temel bir bağlantı birimi olan UART çalışması yapacağız. Öncelikle STM32VLDiscovery kitini kullanacağım. Özellikle ucuz olması ve taşınabilirliği kitin kullanılmasında en büyük etmendir.Daha ileriki dönemlerde vakit olursa kitin bir incelemesini de yayınlamaya çalışacağım. Ancak o zamana kadar çalışmalarda yararlanmak için STM32VLDiscovery Kod Örneklerini buradan indiriniz. Gerekli kod örnekler ve template bulunuyor içinde işinize yarayacaktır. Derleyici olarak da ben IAR kullanacağım. Siz istediğinizi tercih edersiniz artık.Ancak IAR üstünden kodları inceler ve onları düzenleyerek giderseniz benle aynı işi yapmış olursunuz.

Öncelikle kodu koyunca göreceğiniz gibi fazlaca kaydediciler ile uğraşmadan kütüphane dosyalarını kullanarak gerçekleme yapacağız.Ayrıca bu kodun amacı öncelikle UART1 üstünden veri basmak olsa da aynı zamanda saat ve pin ayarlamalarını kod içinde açıkça görebileceksiniz.Kodu yeterince açıklamalı yazdım zaten.Yine de aklına soru takılan olursa yorumlar kısmından sorabilir.
<br/>
Öncelikle kitimizde kullanılan mikro denetleyicinin UART1 için gerekli pinleri bilmemiz gerekir.Buna göre;

Rx–>PA.10
Tx–>PA.09

Artık bilmemiz gereken temel bilgiyi bildiğimize göre kodumuzu inceleyebiliriz.Kodu açıklamalı yazdım.Yine de sorusu olan varsa yorumlar kısmından ulaşabilir.

/************************************************
*                                               *
*@Dosya          :UART.c                        *
*@Açıklama       :UART Veriyi gönderir, kesme   *
*                ile alır.                      *
*@Versiyon       :v1.0.0                        *
*                                               *
*@Yazar          :Ayhan KORKMAZ                 *
*                  www.ayhankorkmaz.net         *
*@İletişim       :info@ayhankorkmaz.net         *
*@Tarih          :15.07.2013/23:59              *
*Test            :STM32VLDiscovery Üstünde      * 
*                Test Edilmiştir                *  
*************************************************/

#include "stm32f10x.h"
 
unsigned char Veri[255],i=0,tx_index=0,deneme[16]="AyhanKorkmaz.Net";
 
/**************************************************************************************
Fonksiyon:RCC_Configuration
Amaç     :Kullanılan sistemin clock ayarlamalarını yapar
Kullanım :RCC_Configuration();
***************************************************************************************/
void RCC_Configuration(void)
{
/* GPIO CLOCK Ayari */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
/* UART CLOCK Ayari */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
}

/**************************************************************************************
Fonksiyon:GPIO_Configuration
Amaç     :Kullanılan sistemin GPIO ayarlamalarını yapar
Kullanım :GPIO_Configuration();
**************************************************************************************/ 
void GPIO_Configuration(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  /* USART TX Pın Ayarı */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;  // PA.09 USART1.TX-
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
 
  /* USART RX Pin Ayarı */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; // PA.10 USART1.RX-
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
}
 
/***************************************************************************************
Fonksiyon:USART_Configuration
Amaç     :Kullanılan sistemin USART1 ayarlamalarını yapar
Kullanım :USART_Configuration(BaudRate);
***************************************************************************************/ 
void USART_Configuration(unsigned int BaudRate)
{
  //
  USART_InitTypeDef USART_InitStructure;
  USART_InitStructure.USART_BaudRate = BaudRate;
  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 ilk ayar */
  USART_Init(USART1, &USART_InitStructure);
  /* USART1 Aktif et */
  USART_Cmd(USART1, ENABLE);
  /*USART1 RX kesme Aktif et*/
  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
}
 
/***************************************************************************************
Fonksiyon:NVIC_Configuration
Amaç     :Kullanılan sistemin KESME ayarlamalarını yapar
Kullanım :NVIC_Configuration();
***************************************************************************************/ 
void NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
  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);
}
 
/***************************************************************************************
Kesme ALT PROGRAMI
Amaç     :RX Bufferına gelen değerleri Veri[] dizisine alır
***************************************************************************************/ 
void USART1_IRQHandler(void)
{

  if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) // Received characters modify string
  {
    Veri[i] = USART_ReceiveData(USART1);
	i++;
    if (i >= 255)
      i=0;
  }
}
/***************************************************************************************
Fonksiyon:USART_Yaz
Amaç     :Gönderilmek istenen Yazıyı USART üstünden basar
Kullanım :USART_Yaz("Yazı Buraya Gelecek");
***************************************************************************************/
void USART_Yaz(unsigned char *string){
 
    while(*string){
        // wait until data register is empty
        while( !(USART1->SR & 0x00000040) );
        USART_SendData(USART1,*string);
        *string++;
    }
}
/***************************************************************************************
Fonksiyon:Main
Amaç     :Main Fonksiyonudur
***************************************************************************************/
 int main(void)
 {
  
  RCC_Configuration();
  GPIO_Configuration();
  NVIC_Configuration();
  USART_Configuration(9600);

  

   USART_Yaz("AyhanKorkmaz.Net UART1 Calismasi");
while(1)
  {
USART_Yaz("AyhanKorkmaz.Net");
  }
}
 
/**************************************************************************************/
 
#ifdef  USE_FULL_ASSERT

void assert_failed(uint8_t* file, uint32_t line)
{
  while (1)
  {
  }
}
#endif
 
/**************************************************************************************/
Yazar :

Elektrik-Elektronik mühendisiyim. 2 yıldır bu blogda yazıyorum. Ve 6 aydır aktif olarak internet siteleri yönetiyorum. Kişisel olarak da teknoloji ve fotoğrafçılıkla ile ilgileniyorum.



Beni sosyal medya hesaplarım üzerinden takip edin:

YORUMLAR

  1. 3 sene ago  

    As expected you did an good job evaluating the problem and coming up with a good solution. I will keep watching for more updates on your site.

  2. ali

    2 sene ago  

    Merhaba hocam,

    Elimdeki fm1188 ses chipine uart kanalıyla “FC F3 3B 1E 34 00 55” gibi bir data yazmak istiyorum.
    Ses chipinin datasheetinde datanin nasil olacağı formatı belirtilmiş.
    Ses çipinin registerları 0x25 ve 0x26 olarak verilmiş.
    Yukardaki örneği kendim için uygulamak istedim ama neresinden başlayacağımı bilemedim. Ben eclipse te C de yazıyorum sakıncasi olur mu?

    • Ayhan

      2 sene ago  

      Eğer Eclipse üzerinden STM32 balantısını yaparsanız problem olmaz. Aynen kullanmanız gerekli.Datayı basarsanız gidecektir.

  3. Yusuf

    7 ay ago  

    Slm Hocam
    Kodları aynen çalıştırdım yalnız serial monitörde değişik karakterler görülüyor. Sanırım baudrate ile ilgili sorun var. Yardımcı olurmusunuz?

Daha fazla ARM
stlink
ST-Link Windows 8’e nasıl yüklenir?

Merhabalar, ARM ile uğraşan herkes eninde sonunda bir adet geliştirme kartı alıp yazılım çalışmalarını gerçekte gözlemlemek isteyecektir.Eğer sizde benim gibi...

ARM
ARM Mimarisi ve Cortex-M Serisi

Merhabalar arkadaşlar, İlk gerçek yazımda sizlere ARM mimarisi ve Cortex-M serisi hakkında kısa bilgiler vermeye çalışacağım. Bu yazım bundan sonra...

Kapat