Atollic TrueSTUDIO (TS) , GCC tabanlı Eclipse IDE
kullanan , ARM mikroişlemciler için geliştirilmiş bir derleyici. Detaylı
bilgileri aşağıdaki linkten bulabilirsiniz.
Bu yazıda STM32VL Discovery ile
UART ve LED leri kullanmak hakkında bir şeyler paylaşacağım.
Öncelikle TS programını Atollic web sayfasından
indirip kurulumunu yapmamız gerekiyor. Kurulum ile ilgili dokümanlar Atollic
web sayfasında var.
Yeni proje başlatmak için ,
File / New / C Project seçiyoruz.
Gelen pencerede projemize isim
verip, Embedded C Project ve Atollic ARM Tools seçiyoruz. Sonra NEXT..
Gelen pencereden (Build setting) ,
İşlemci , Development Board seçeneklerinden kendi boardumuzu seçiyoruz. Bu
seçin sayesinde , derleyici işlemcimizin
ROM ve RAM yapısını , bazı start up dosyalarını hazırlıyor. Eval board seçtiğimiz için board üzerindeki
led button gibi pinler içinde gerekli dosyaları hazırlıyor.
Resimdeki
seçenekleri işaretleyip Next diyoruz....
Bir
sonraki pencere Debug ile ilgili araçları seçmemize yarıyor. Discovery üzerinde debugger olarak Stlink sabit olduğundan
ST-Link Seçili olmalı. Sonrasında yine
Next diyoruz. Bir sonra gelen pencereyede next diyeceğiz.. Runtime library
seçeneklerinde Use tiny printf... seçili olmalı.
TS
, discovery board üzerinde User butonuna basıldığında Toggle yapan bir örnek
programı ( Discovery Board ile gelen default Program) hazırlıyor.
Buid
all yapıp derleme işleminden sonra , Debug yaparak programı STM32 Discovery
board a yükleyip, kurulumun , ST link driverlarının doğru bir şekilde
yapıldığını test edebilirsiniz.
TS
, projeyi hazırlarken , başka eval boardlar ile ilgili tanımlamaları da #ifdef
ifadeleri ile main dosyasına ekliyor. Yeni başlayanlar için kafa karıştırıcı
geldi bana .. Bu yüzden ben gereksiz gördüğüm bu satırları sildim. Proje
dosyasını paylaşacağım için burda bütün kodu yazmıyorum. Kısaca Main.c dosyası
aşağıdaki gibi oluyor.
#include <stddef.h>
#include "stm32f10x.h"
#include "STM32vldiscovery.h"
// Değikenleri tanımla..
int main(void)
{
// GPIO kur
// USart Kur
while (1)
{
// Program..
}
}
İşlemcinin
, hangi portun IO , hangi portun USART olduğunu anlayabilmesi için gerekli olan
tanımlamalar. "STM32vldiscovery.h" dosyasında belirtilmekte.
Bu dosyaya erişmek için sol CTRL tuşuna basılı tutup main.c dosyasında üzerini tıklamanız yeterli olur.
"STM32vldiscovery.h" içeriğinde ise Discovery Board üzerinde bulunan Led ler ve buton için gerekli
tanımlama satırlarını görebiliriz. Bu tanımlamalar , programda kullanmak
isteğimiz tanımları ve buna karşılık Standart STM32 kütüphanelerinde olan
karşılıklarını içeriyor.
Örneğin,
Discovery üzerinde LED için ( yeşil olan) yapılmış tanımlamalar. PIN, port ve
clok için , standart kütüphanede ( örn , stm32f10x_rcc.h) dosyasındaki
karşılıklarını içeriyor.
#define LED3_PIN GPIO_Pin_9
#define LED3_GPIO_PORT GPIOC
#define LED3_GPIO_CLK RCC_APB2Periph_GPIOC
STM32vldiscovery.h
ve C dosyaları TS tarafından , build setting
adımında STM32VLDiscovery boardu seçtiğimiz için TS tarafından projeye eklendi.
STM32vldiscovery.h
ve c dosylarında aynı zamanda GPIO hazırlamak ve kullanmak için gerekli olan
tanımlamalar ve fonksiyonlar bulunmakta.
Main.c
de bu fonksiyonları çağırarak. STM32 çevre birimlerini aktif hale getiriyoruz.
Seri
Port , entegrasyonu içinse GPIO lar gibi bir hazırlama ve kullanma işlemleri
gerekli. Discovery board üzerinde , donanım olarak bir RS232 port olmadığından
TS seri port için gerekli tanımlamaları ve fonksiyonları STM32vldiscovery.h ve
.c dosyalarının içerisine eklemiyor.
Bu
yüzden , benzer başka bir örnek projeyi açıp oradan gerekli satırları kopyaladım. Bana en uygun olarak (STM3210E-EVAL_XL_USART_Printf)
projesini uygun gördüm. Bu projedeki, stm3210e_eval.h
ve c dosylarını açtığımızda aşağıdaki tanımlamaları göreceğiz.
/** @addtogroup
STM3210E_EVAL_LOW_LEVEL_COM
* @{
*/
#define COMn 2
/**
* @brief Definition for COM port1, connected
to USART1
*/
#define EVAL_COM1 USART1
#define EVAL_COM1_CLK RCC_APB2Periph_USART1
#define
EVAL_COM1_TX_PIN
GPIO_Pin_9
#define
EVAL_COM1_TX_GPIO_PORT GPIOA
#define
EVAL_COM1_TX_GPIO_CLK
RCC_APB2Periph_GPIOA
#define
EVAL_COM1_RX_PIN GPIO_Pin_10
#define
EVAL_COM1_RX_GPIO_PORT GPIOA
#define
EVAL_COM1_RX_GPIO_CLK
RCC_APB2Periph_GPIOA
#define EVAL_COM1_IRQn USART1_IRQn
/**
* @brief Definition for COM port2, connected
to USART2
*/
#define EVAL_COM2 USART2
#define EVAL_COM2_CLK RCC_APB1Periph_USART2
#define
EVAL_COM2_TX_PIN
GPIO_Pin_2
#define
EVAL_COM2_TX_GPIO_PORT GPIOA
#define
EVAL_COM2_TX_GPIO_CLK
RCC_APB2Periph_GPIOA
#define
EVAL_COM2_RX_PIN
GPIO_Pin_3
#define
EVAL_COM2_RX_GPIO_PORT GPIOA
#define
EVAL_COM2_RX_GPIO_CLK
RCC_APB2Periph_GPIOA
#define EVAL_COM2_IRQn USART2_IRQn
/** @defgroup
STM3210E_EVAL_LOW_LEVEL_Exported_Functions
* @{
*/
void STM_EVAL_COMInit(COM_TypeDef COM, USART_InitTypeDef* USART_InitStruct);
stm3210e_eval.h
dosyasındaki bu tanımlamaları, STM32vldiscovery.h içerisine ve
stm3210e_eval.c
dosyasındaki ,aşağıdaki tanımları ve fonksiyonu STM32vldiscovery.c dosyası içerisine
kopyalıyoruz.
USART_TypeDef* COM_USART[COMn] =
{EVAL_COM1, EVAL_COM2};
GPIO_TypeDef* COM_TX_PORT[COMn] =
{EVAL_COM1_TX_GPIO_PORT, EVAL_COM2_TX_GPIO_PORT};
GPIO_TypeDef* COM_RX_PORT[COMn] =
{EVAL_COM1_RX_GPIO_PORT, EVAL_COM2_RX_GPIO_PORT};
const uint32_t COM_USART_CLK[COMn]
= {EVAL_COM1_CLK, EVAL_COM2_CLK};
const uint32_t
COM_TX_PORT_CLK[COMn] = {EVAL_COM1_TX_GPIO_CLK, EVAL_COM2_TX_GPIO_CLK};
const uint32_t
COM_RX_PORT_CLK[COMn] = {EVAL_COM1_RX_GPIO_CLK, EVAL_COM2_RX_GPIO_CLK};
const uint16_t COM_TX_PIN[COMn] =
{EVAL_COM1_TX_PIN, EVAL_COM2_TX_PIN};
const uint16_t COM_RX_PIN[COMn] =
{EVAL_COM1_RX_PIN, EVAL_COM2_RX_PIN};
/**
* @brief Configures COM port.
* @param COM: Specifies
the COM port to be configured.
* This parameter can be one of
following parameters:
* @arg COM1
* @arg COM2
* @param USART_InitStruct:
pointer to a USART_InitTypeDef structure that
* contains the configuration
information for the specified USART peripheral.
* @retval None
*/
void STM_EVAL_COMInit(COM_TypeDef COM, USART_InitTypeDef* USART_InitStruct)
{
GPIO_InitTypeDef GPIO_InitStructure;
/*
Enable GPIO clock */
RCC_APB2PeriphClockCmd(COM_TX_PORT_CLK[COM] | COM_RX_PORT_CLK[COM] |
RCC_APB2Periph_AFIO, ENABLE);
/*
Enable UART clock */
if (COM == COM1)
{
RCC_APB2PeriphClockCmd(COM_USART_CLK[COM], ENABLE);
}
else
{
RCC_APB1PeriphClockCmd(COM_USART_CLK[COM], ENABLE);
}
/*
Configure USART Tx as alternate function push-pull */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin = COM_TX_PIN[COM];
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(COM_TX_PORT[COM], &GPIO_InitStructure);
/*
Configure USART Rx as input floating */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Pin = COM_RX_PIN[COM];
GPIO_Init(COM_RX_PORT[COM], &GPIO_InitStructure);
/*
USART configuration */
USART_Init(COM_USART[COM], USART_InitStruct);
/*
Enable USART */
USART_Cmd(COM_USART[COM], ENABLE);
}
Kopyalama işlemleri
bittikten sonra , main.c içerisinde Ledleri ve USART birimini STM32vldiscovery_LEDIni() ve STM_EVAL_COMInit(COM1,
&USART_InitStructure) fonksiyonlarını kullanarak hazırlıyoruz.
Daha sonra PA9 ve PA10
pinlerine bağladığımı Level Transreciver devresi ile STM32VL Discovery
boardumuzdan Bilgisayarımıza bağlıyoruz. Hyper Terminal penceresinde , i değişkeninin
butona bastığımız andaki değerini seri porta göndermekte.
Programda , printf
fonksiyonunu da kullanabiliyoruz. Programımız içerisinde bununla ilgili
tanımlamaları Atollic project wizardı kullanırken runtime library
seçeneklerinde tiny printfin işaretli olması lazım. Proje dosyasını linkten
indirebilir siniz.
Proje Dosyası,
No comments:
Post a Comment