Anasayfa Gömülü Sistemler ARM STM32F1xx UART Çalışması
ARM

STM32F1xx UART Çalışması

7 Dakikada Okunur
4
0
44
usart

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
/**************************************************************************************/
Daha fazla ilgili makale
Yazardan daha fazla Ayhan KORKMAZ
Load More In ARM

4 Yorumlar

  1. Peyton

    17 Ocak 2014 at 12:23 am

    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.

    Cevapla

  2. ali

    24 Kasım 2014 at 12:43 pm

    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?

    Cevapla

    • Ayhan

      24 Kasım 2014 at 1:27 pm

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

      Cevapla

  3. Yusuf

    25 Nisan 2016 at 11:36 pm

    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?

    Cevapla

Cevap Yaz