Sosyal Medya  

FacebookTwitterDiggLinkedinRSS Feed
   

Bu yazımda, Adım Adım ARM Programlama 2-GPIO isimli makalemde anlatmış olduğum STM32F107VC mikrodenetleyicisinin GPIO birimine yönelik ufak bir örnek yapacağız. Örneğimizde; STM32F10C-EVAL geliştirme kartı kullanacağız. Örneğimizde kullanacağım, geliştirme kartı ve işlemciyle alakalı kütüphaneleri, programları ve dökümanları Adım Adım ARM Programlama-1 isimli makalemde paylaşmıştım. Uygulamaları gerçeklemek ve öğrenmek açısından, paylaşmış olduğum dosyaları indirmenizi tavsiye ederim.

ARM Programlama

ARM programlama aslında kütüphane okumaktan başka birşey değildir. Kullandığınız ARM mikrodenetleyicisinin kütüphaneleri ve dökümanları, üretici firmanın sitesinde bulabiliriniz. ARM programlamaya başlamadan önce elimizin altında 3 şeyin bulunması gerekmekte.

  • Kullanacağınız mikroişlemcinin veya mikrodenetleyicinin kütüphaneleri
  • Program yazıp derleyebileceğiniz bir kütüphane
  • Kullanacağınız mikroişlemcinin veya mikrodenetleyicinin "Referance Manuel" olarak adlandırılan kitapcık

Bu üç şey elimizde olduktan sonra, her türlü programı geliştirebilirsiniz. Burada kilit nokta, kütüphaneleri okuyup kullanabilmekte. ARM'da her bir birim adına ayrı bir kütüphane bulunmakta. GPIO, CRC, CAN, I2C, SPI vb. bir çok birim. Kullanacağınız kütüphanenin header dosyasını açıp, sayfanın en sonuna gittiğinizde, yazılmış olan fonksiyonlarının tamamının tanımını görürsünüz. Header dosyasında yukarılara doğru çıkıldıkça, fonksiyonlarda kullanılan değişkenleri de görürsünüz. Geriye sadece, o kütüphaneyi projeyi ekleyip, oradaki fonksiyonları kullanmak kalır. Ama bu değildir ki işin temelini öğrenmeyelim. İşin temelini de öğrenmeliyiz çünkü bazen bir projenin öyle bir yerinde hiç beklenmedik bir hata oluştuğunda, hata çözümüne yönelik fikirler üretebilelim.

STM3210C-EVAL GPIO Programlama

Bu uygulamada Keil derleyicisini kullanacağız. Öncelikle size vermiş olduğum kütüphanelerin içerisinde yer alan Project klasörüne giriyoruz ve STM32F10x_StdPeriph_Template dosyasını kopyalayıp, STM32F10x_Uygulama_1_GPIO ismiyle yapıştıralım. ST tarafından bize verilmiş olan hazır temayı kullanıyoruz. İlerleyen makalelerimde sizlere Keil'da sıfırdan proje açmayı anlatacağım ama şimdilik konumuz bu değil.

STM32F10x_Uygulama_1_GPIO klasörünün içerisinde bulunan MDK-ARM klasörüne girip, proje dosyamızı çalıştırıyoruz. Daha sonra açılan projede, main dosyasının içerisinde yer alan kodların tümünü silip, aşağıdaki kodları yapıştıralım.

/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
#include "stm32_eval.h"
#include <stdio.h>

/**
  * @brief  Main program.
  * @param  None
  * @retval None
  */
int main(void)
{
  /* Infinite loop */
  while (1)
  {
  }
}

#ifdef  USE_FULL_ASSERT

/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t* file, uint32_t line)
{ 
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

  /* Infinite loop */
  while (1)
  {
  }
}
#endif

Kodu main dosyanıza kopyaladıktan sonra Project->Build sekmesinden derleyelim. Artık program yazmaya hazırız...

GPIO Kütüphanesi

STM32F107VC GPIO birimi için yazılmış header dosyasını açıp, en alt satıra baktığımızda kullanacağımız fonksiyonları göreceğiz.

void GPIO_DeInit(GPIO_TypeDef* GPIOx);
void GPIO_AFIODeInit(void);
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct);
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);
void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_EventOutputConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);
void GPIO_EventOutputCmd(FunctionalState NewState);
void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState);
void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);
void GPIO_ETH_MediaInterfaceConfig(uint32_t GPIO_ETH_MediaInterface);

 Bu fonksiyonlarla istediğimiz işlemleri yapabiliriz. Fonksiyon içerisinde kullanılan değişken isimleri de GPIO header dosyasının üst kısımlarında yer almaktadır.

Uygulama

Uygulamamızda; PORTD'nin 13. ve 14. pinini çıkış olarak ayarlayıp, belli bir sürede bir her iki çıkışı da tersleyen bir program yazalım. ARM'da GPIO birimini kullanmak için öncelikle ilgili pinlerin ayarlanması gerekmektedir. Bunun için şu adımları izlemeliyiz:

  1. İlgili pinin bağlı olduğu portun saat ayarını aktif etmeliyiz
  2. İlgili pinleri belirtmeliyiz
  3. İlgili pini giriş ya da çıkış olarak ayarlamalıyız
  4. Pinin hızını belirtmeliyiz

Daha sonra da bu pinleri istediğimiz doğrultusunda kullanabiliriz. Burada şunu unutmamak gerekir ki; yukarıdaki fonksiyonlar programcının işini kolaylaştırmak için kullanılmıştır. Bunun yanın eğer dilerseniz, ilgili pinin ayarlarını direk olarak kayıt edicilere erişerek de yapabilirsiniz.

Şimdi yukarıdaki adımları programa dökelim. Dikkat ederseniz, fonksiyonların bazılarının parametreleri GPIO_TypeDef pointer tipinde. Bu yüzden, öncelikle GPIO_TypeDef tipinde bir değişken yapı(struct) tanımlayalım.

GPIO_InitTypeDef GPIO_InitStructure;

 Şimdi bu yapıyı kullanarak, yukarıdaki adımları tek tek programa işleyelim. Programda kullanılan tüm değişkenler GPIO header dosyasının içerisinde yer almaktadır. Ben de oradan bakarak yazıyorum.

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); //D portuna saat bağlandı
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14; // Pinler belirtildi
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // Pinler push-pull çıkış olarak ayarlandı
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // Pinlerin çalışma frekansı 50MHz ayarlandı
GPIO_Init(GPIOD, &GPIO_InitStructure); //Tüm ayarlar kaydediliyor

 Bu ayarlar ile PORTD'nin 13. ve 14. pinleri çıkış olarak ayarlanmış oldu. Bunları yukarıdaki GPIO_SetBits ve GPIO_ResetBits fonksiyonları ile lojik 1 ve lojik 0 yapabiliriz. Programın tamamı aşağıda verilmiştir.

 

#include "stm32f10x.h"

GPIO_InitTypeDef GPIO_InitStructure;

void _Delay(uint16_t t)
{
	uint8_t i=0;
	while(t--)
		for(i=0;i<10;i++);
}

int main(void)
{
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_Init(GPIOD, &GPIO_InitStructure);
   
  while (1)
  {
		GPIO_SetBits(GPIOD,GPIO_Pin_13|GPIO_Pin_14);
		_Delay(500);
		GPIO_ResetBits(GPIOD,GPIO_Pin_13|GPIO_Pin_14);
		_Delay(500);
	}
}

 Elbette böyle fonksiyonlar kullanmak yerine GPIO Bit Set-Reset kayıt edicilerini kullanarak da ayarlamaları yapıp, pinleri lojik 1 ve lojik 0 yapapbilirdik. Makalemin temel amacı GPIO header dosyasında yer alan fonksiyonları kullanarak program yazmak olduğu için, programı bu yöntemle geliştirdim.

Gördüğünüz gibi ARM ile program yazmak o kadar da zor değil. Sadece kullanacağınız birimin kütüphanesini doğru şekilde okuyup, yorumlamanız yeterli. Bu makalemde ARM'ın GPIO birimini nasıl kullanacağınızı anlattım. Amacım size ilk adımı nasıl atacağınızı göstermekti. Umarım sizin için hayırlı bir ilk adım olur.

Bir sonraki makalemde görüşmek üzere, sağlıcakla kalın...

Yorumlar   

0 # Serhat 21-05-2013 10:33
Çok faydalı bir makale , başlangıç için çok ideal . Kütüphane kullanılarak işlemlerin yapılması ise kütüphane kullanımını öğrenmek açısından çok iyi olmuş .
Emeklerine sağlık kardeşim.

Paylaşımlarının devamını bekliyoruz ...
Cevap
0 # Super User 21-05-2013 21:22
Sağolasın kardeşim.
Cevap
+1 # Yılmaz DAŞ 09-10-2013 19:27
Muhammed ellerine sağlık çok güzel bir makale emeğine sağlık...
Cevap
0 # Ozan 25-07-2014 07:40
Makalelerinin çok faydasını gördüm Muhammet, ellerine,emeğin e sağlık.
Cevap
0 # İbrahim 25-09-2014 17:59
iyi günler ilk kısmı yaptım build kısmına kadar build dediğimde 22 hata artı 1 hata verdi sebep de belirli bir header dosyasını açamaması oldu bunun bilinen bir çözümü mevcut mudur yoksa atladığım bir kısımdan mı olur acaba?
C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_type.h(23): error: #256: invalid redeclaration of type name "s32" (declared at line 312 of "C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x.h")
ilk 22 buna benzer,
stm32f10x_rcc.c: Error: #5: cannot open source input file "..\..\..\Libra ries\STM32F10x_ StdPeriph_Drive r\src\stm32f10x _rcc.c": No such file or directory
son hata da bu şekilde.
teşekkürler kolay gelsin
Cevap
0 # Super User 26-09-2014 11:51
İbrahim Bey Merhaba,
Sorununuzu 2yoldan çözebilirisniz:

1. Yol
Keil programında; Option For Target -> C/C++ -> Include Paths kısmına gelip, inc ve source dosyalarının yolunu belirtmelisin.
Daha sonra da solda bulunan tüm dosyaları silip, tekrar belirtmiş olduğunuz dosya içersinden aynı dosyaları ekleyin.
Sorun ortadan kalkacaktır.


2. Yol
Projenize ekli .c ve .h dosyalarının klasörünü açın ve üstten dosya yolunu kopyalayın.
Daha sonra da projede ekli olan .c ve .h dosyalarının üzerine sağ tıklayıp Option For File "" -> Paths sekmesine kopyaladığınız yolu yazınız ve "\" sonuna da dosya ismini yazın.
Eğer doğru yapmışsanız dosyanızın üzerinde nokta nokta işaret gelir.
Cevap
0 # kadir 09-07-2015 21:53
Build target 'Target 1'
compiling main.c...
main.c(1): error: #5: cannot open source input file "stm32f4xx.h": No such file or directory
#include
main.c: 0 warnings, 1 error
compiling stm32f4xx_gpio.c...
stm32f4xx.h(245): error: #5: cannot open source input file "core_cm4.h": No such file or directory
#include "core_cm4.h" /* Cortex-M4 processor and core peripherals */
stm32f4xx_gpio.c: 0 warnings, 1 error
compiling stm32f4xx_rcc.c...
stm32f4xx.h(245): error: #5: cannot open source input file "core_cm4.h": No such file or directory
#include "core_cm4.h" /* Cortex-M4 processor and core peripherals */
stm32f4xx_rcc.c: 0 warnings, 1 error
".\Objects\proje1.axf" - 3 Error(s), 0 Warning(s).
Target not created. bu hatanın sebebi ne acaba
Cevap
0 # yasin kaya 19-08-2016 12:13
Teşekkürler güzel bir kaynak olmuş...
Cevap
0 # Mehmet Taş 25-02-2018 11:04
Allah razı olsun çok teşekkürler bayağı işime yaradı soylediklerin kardeşim.
Cevap

Yorum ekle


Güvenlik kodu
Yenile

   
© muhammetefe.com