e
sv

Yenilikçi STM32 Geliştirme Rehberi

468 Okunma — 13 Şubat 2024 18:25
STM32 Geliştirme
avatar

Admin

  • e 0

    Mutlu

  • e 0

    Eğlenmiş

  • e 0

    Şaşırmış

  • e 0

    Kızgın

  • e 0

    Üzgün

STM32, mikrodenetleyici dünyasında büyük bir etkiye sahip olan güçlü bir platformdur. Bu rehberde, STM32’nin temellerinden başlayarak adım adım geliştirme ortamının kurulumunu, GPIO kontrolünü, USART arayüzü ve UART haberleşmesini, ADC kullanımını ve diğer temel konuları öğreneceksiniz. Bu rehberi takip ederek, stm32 platformunda kendinizi geliştirirken aynı zamanda projelerinizi de kusursuz bir şekilde hayata geçirebileceksiniz.

STM32 Nedir?

STM32, STMicroelectronics tarafından geliştirilen ve ARM tabanlı mikrodenetleyicileri içeren bir seridir. Bu serinin öne çıkan özellikleri şunlardır:

  • Yüksek Performans: STM32 serisi, yüksek saat hızları ve işlemci çekirdekleri ile yüksek performans sunar.

  • Düşük Güç Tüketimi: Bataryalı cihazlar için ideal olan düşük güç tüketimi, STM32’nin avantajlarından biridir.

  • Çeşitli Uygulama Alanları: STM32, endüstriyel otomasyon, tüketici elektroniği, tıbbi cihazlar ve otomotiv gibi çeşitli uygulama alanlarına hitap eder.

  • Entegre Periferikler: Genellikle entegre edilmiş sensörler, iletişim arabirimleri ve diğer periferikler sayesinde dış bileşenlere olan ihtiyacı azaltır.

STM32, geliştiricilere geniş bir donanım ve yazılım ekosistemi ile birlikte gelir. Bu da onu mühendislerin ve üreticilerin tercih ettiği bir mikrodenetleyici haline getirir. STM32’nin sağladığı bu avantajlar, hızlı prototipleme ve ürün geliştirme süreçlerini kolaylaştırır. STM32, genellikle profesyonel uygulamalarda, endüstriyel kontrol sistemlerinde ve akıllı ev cihazlarında kullanılır. Bu özellikleriyle STM32, geniş bir kullanıcı kitlesi tarafından tercih edilen bir mikrodenetleyici çözümüdür. Bu geliştirme rehberinde, STM32’nin kullanımıyla ilgili temel konulara odaklanacağız. Bu kılavuz, STM32 kullanarak projeler geliştirmek isteyenler için faydalı olacaktır.

STM32 Geliştirme Ortamı Kurulumu

STM32 mikrodenetleyici geliştirme ortamını kurmak, projelerinizi başlatmanın ilk adımıdır. Bu süreç, doğru yazılım ve sürücülerin yüklenmesini içerir. İşte STM32 geliştirme ortamı kurulumu adımları:

  1. IDE (Entegre Geliştirme Ortamı) Seçimi: Öncelikle, geliştirme için bir IDE seçmelisiniz. popüler seçenekler arasında Keil uVision, STM32CubeIDE ve Atollic TrueSTUDIO bulunmaktadır.
  2. STM32 Yazılım Kütüphanesi Kurulumu: Seçtiğiniz IDE’ye bağlı olarak, resmi STM32 yazılım kütüphanesini indirip kurmanız gerekecektir. Bu kütüphane, STM32 mikrodenetleyiciler için hazır kod parçacıkları sağlar.
  3. Sürücülerin Yüklenmesi: STM32 kartınızı bilgisayarınıza bağladığınızda, uygun sürücülerin yüklendiğinden emin olmalısınız. Genellikle, sürücüler otomatik olarak yüklenir, ancak bazen manuel olarak yüklenmesi gerekebilir.
  4. Kod Yazmaya Başlama: Kurulum tamamlandığında, artık STM32 için kod yazmaya başlayabilir ve projelerinizi geliştirmeye başlayabilirsiniz.

STM32 geliştirme ortamını kurmak, projelerinizi başlatmak için hayati bir adımdır. Bu adımları dikkatlice izleyerek, STM32 mikrodenetleyicileri için hazır hale getirebilir ve projelerinizi geliştirmeye başlayabilirsiniz. Bu süreç, başlangıçta zor gibi görünebilir, ancak doğru kaynaklar ve rehberlik ile kolaylıkla uygulanabilir. Bu aşamada, her adımı dikkatlice takip etmek, sorunsuz bir geliştirme süreci için önemlidir.

Unutmayın ki, STM32 geliştirme ortamını kurarken sabırlı olmalı ve adımları doğru bir şekilde takip etmelisiniz. Bu, ilerideki projeleriniz için sağlam bir temel oluşturacaktır.

STM32 Proje Oluşturma

STM32 proje oluşturma süreci oldukça önemlidir çünkü doğru bir temel oluşturmak, ilerleyen süreçte karşılaşabileceğiniz sorunların çözümüne de katkı sağlar. İşte STM32 proje oluşturma adımları:

  • IDE Seçimi: İlk adım olarak, projenizi geliştirmek için hangi entegre geliştirme ortamını (IDE) kullanacağınıza karar vermelisiniz. STM32 için yaygın olarak kullanılan IDE’lerden biri, mükemmel özelliklere sahip olan STM32CubeIDE’dir. Bununla birlikte, Keil, IAR Embedded Workbench gibi diğer popüler IDE’ler de tercih edilebilir.

  • Proje Oluşturma: IDE’niz üzerinden yeni bir proje oluşturduğunuzda, hangi STM32 serisi mikrodenetleyici tipini kullanmak istediğinizi seçmeniz istenecektir. STM32F4, STM32F7 gibi seriler arasından seçim yaparak projenizi oluşturabilirsiniz.

  • Proje Yapılandırması: Proje oluşturulduktan sonra, projenizin genel yapılandırmasını yapmanız gerekecektir. Burada, kullanacağınız pin konfigürasyonları, clock ayarları, hedef donanım platformu gibi temel konuları belirlemeniz gerekmektedir.

  • Kod Geliştirme: Oluşturduğunuz projeye başlamadan önce, temel kodlama adımlarını belirlemelisiniz. Hangi programlama dili ve kütüphaneleri kullanacağınızı seçerek, projenizin temel yapısını oluşturmalısınız. Burada, özellikle stm32 için HAL (Hardware Abstraction Layer) kitaplıklarını kullanarak projenizi geliştirebilirsiniz.

STM32 proje oluşturma süreci, temel bir yapı oluşturarak başlamak ve ardından detayları belirlemek ile devam etmek gerektirir. Bu adımları takip ederek, başarılı bir şekilde stm32 projenizi oluşturabilirsiniz.

GPIO (Genel Giriş/Çıkış) Kontrolü

STM32 Geliştirme
Yenilikçi STM32 Geliştirme Rehberi 5

STM32 geliştirme rehberimizin bu bölümünde, GPIO’nun (Genel Giriş/Çıkış) nasıl kontrol edileceğini öğreneceğiz. GPIO, mikrodenetleyicinin dijital giriş ve çıkış pinlerini kontrol etmemizi sağlayan temel bir özelliktir. Bu, mikrodenetleyicinin farklı modüllerle etkileşimini sağlamanın temelidir.

STM32 ve GPIO

STM32 mikrodenetleyiciler, genellikle birden fazla GPIO pinine sahiptir. Bu pinler, veri iletimi için kullanılabilir ve mikrodenetleyicinin dijital I/O yeteneklerini temsil eder.

GPIO Kontrolü

STM32 üzerinde GPIO kontrolü, genellikle şu adımları içerir:

  • Pin Konfigürasyonu: STM32, her GPIO pini için farklı konfigürasyon seçenekleri sunar. Bu seçenekler arasında giriş, çıkış, alternatif fonksiyon atama gibi işlemler bulunur.
  • Durum Kontrolü: GPIO pininin durumu, yazma ve okuma işlemleriyle kontrol edilir. Bu durum, pinin yüksek veya düşük olup olmadığını belirtir.
  • Kesme Kullanımı: GPIO pinleri için kesme (interrupt) kullanarak, harici olayları algılamak ve buna göre işlem yapmak mümkündür.

STM32 ve Diğer Mikrodenetleyicilerle Karşılaştırma

Aşağıdaki tablo, STM32’nin GPIO yeteneklerini diğer mikrodenetleyicilerle karşılaştırmaktadır:

ÖzelliklerSTM32Diğer Mikrodenetleyiciler
GPIO Pin SayısıYüksekDeğişken
Geliştirme Ortamı DesteğiGenişSınırlı
GPIO Konfigürasyon SeçenekleriÇok yönlüSınırlı

Bu bölümdeki bilgileri kullanarak, stm32 GPIO kontrolünü başarıyla gerçekleştirebilirsiniz. Bu adımlar, mikrodenetleyicinin genel performansını ve projelerinizdeki esnekliği artırabilir.

Analog-Girişli Dijital Çıkış (PWM) Kullanımı

STM32 Geliştirme
Yenilikçi STM32 Geliştirme Rehberi 6

STM32 geliştirme kiti, PWM (Pulse Width Modulation – Darbe Genişlik Modülasyonu) sinyalleri oluşturmak için genellikle kullanılır. Bu, mikrodenetleyicinin dijital bir sinyal üretebilmesine ve analog benzeri davranabilmesine olanak tanır. STM32, bu işlevi gerçekleştirmek için dahili donanım PWM kanallarına sahiptir. PWM kullanımıyla ilgili detayları aşağıdaki gibi sıralayabiliriz:

  • STM32’nin PWM Yetenekleri: STM32, birden fazla donanım PWM kanalına sahiptir. Örneğin, STM32F407 Discovery kartı, dört adet donanım PWM kanalı sağlar. Bu kanallar, farklı bağlantı noktalarına sahip olan çeşitli periferiklerle bağlantı kurabilir.

  • PWM Kullanımıyla Aydınlatma Kontrolü: STM32, led aydınlatma kontrolü için idealdir. PWM sinyalleri, LED parlaklığını ayarlamak için kullanılabilir. Bu sayede, kullanıcılar farklı aydınlatma seviyeleri elde edebilir.

  • Motor Sürücüleri ve Güç İnvertörleri: STM32’nin PWM çıkışları, motor sürücüleri ve güç invertörleri gibi uygulamalarda hız ve güç kontrolü için kullanılabilir. Bu, kesintisiz güç ve hassas kontrol gerektiren uygulamalarda oldukça faydalıdır.

STM32 geliştirme ortamında PWM kullanımı, analog girişli dijital çıkışın sağladığı esneklik nedeniyle birçok uygulama için tercih edilen bir seçenektir. Bu özellik, STM32’nin geniş kullanım alanlarından sadece biridir. Bu şekilde, mikrodenetleyicinin çok yönlü potansiyelini kullanarak farklı projeler oluşturmak mümkün hale gelir.

  • PWM İşlem Kodu:
    • İçe aktarılan kod içerisinde, PWM timer’ını başlatmak ve PWM çıkışını kontrol etmek için gerekli kodları ekleyin. Örneğin, TIM_HandleTypeDef yapılandırmasını kullanarak bir PWM sinyali başlatma örneği aşağıda verilmiştir:
#include "stm32f4xx_hal.h"

TIM_HandleTypeDef htim1;

void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_TIM1_Init(void);

int main(void)
{
  HAL_Init();
  SystemClock_Config();

  MX_GPIO_Init();
  MX_TIM1_Init();

  while (1)
  {
    // PWM işlemleri buraya eklenir
    HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1); // PWM başlatma
    __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 50); // PWM duty cycle ayarlama (örneğin, %50)
  }
}

void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  __HAL_RCC_PWR_CLK_ENABLE();
  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLM = 8;
  RCC_OscInitStruct.PLL.PLLN = 336;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  RCC_OscInitStruct.PLL.PLLQ = 4;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

  if (HAL_PWREx_EnableOverDrive() != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }
}

static void MX_TIM1_Init(void)
{
  TIM_OC_InitTypeDef sConfigOC = {0};

  __HAL_RCC_TIM1_CLK_ENABLE();

  htim1.Instance = TIM1;
  htim1.Init.Prescaler = 8399; // Örneğin, 10kHz PWM frekansı elde etmek için
  htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim1.Init.Period = 99; // PWM periyodu (örneğin, 100Hz)
  htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim1.Init.RepetitionCounter = 0;

  if (HAL_TIM_PWM_Init(&htim1) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

  sConfigOC.OCMode = TIM_OCMODE_PWM1;
  sConfigOC.Pulse = 0; // Başlangıçta PWM duty cycle'ı
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;

  if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

  HAL_TIM_MspPostInit(&htim1);
}

static void MX_GPIO_Init(void)
{
  __HAL_RCC_GPIOA_CLK_ENABLE();

  GPIO_InitTypeDef GPIO_InitStruct = {0};
  GPIO_InitStruct.Pin = GPIO_PIN_8; // TIM1_CH1
  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  GPIO_InitStruct.Alternate = GPIO_AF1_TIM1;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}

void _Error_Handler(char *file, int line)
{
  while (1)
  {
    // Hata durumunda yapılacaklar
  }
}

Bu örnek, TIM1 kullanarak PWM sinyali üreten basit bir programdır. PWM frekansını ve duty cycle’ı ihtiyacınıza göre ayarlayabilirsiniz. HAL_TIM_PWM_Start ve __HAL_TIM_SET_COMPARE fonksiyonları, PWM çıkışını başlatmak ve duty cycle’ı ayarlamak için kullanılır.

USART Arayüzü ve UART Haberleşme

USART (Universal Synchronous Asynchronous Receiver Transmitter), STM32 mikrodenetleyicilerde sıkça kullanılan bir seri iletişim protokolüdür. USART, hem senkron hem de asenkron veri iletimini destekler ve genellikle UART (Universal Asynchronous Receiver Transmitter) modunda kullanılır. UART modu, haberleşme hattının asenkron olarak çalıştığı bir iletişim şeklidir.

STM32’de USART Kullanımı

STM32 üzerinde USART kullanırken dikkate alınması gereken bazı önemli noktalar bulunmaktadır:

  • USART’ın yapılandırılması için GPIO ayarlarının doğru bir şekilde yapılması gerekir.
  • Bağlantı hızı, veri biti sayısı, dur biti sayısı gibi parametreler dikkatlice belirlenmelidir.
  • Transmit ve receive işlemleri için gerekli kesmelerin (interrupts) doğru bir şekilde yapılandırılması gereklidir.

USART ve STM32F4 Karşılaştırması

Aşağıdaki tablo, STM32F4 serisi mikrodenetleyicilerin farklı USART özelliklerini karşılaştırmaktadır:

ÖzellikSTM32F4 USART1STM32F4 USART2STM32F4 USART3
Maksimum Hız10 Mbps5 Mbps5 Mbps
Veri Bit Sayısı8, 98, 9, 128, 9, 12
Dur Bit Sayısı1, 21, 0.5, 21, 0.5, 2

Bu tablo, farklı STM32F4 USART modüllerinin teknik özelliklerini kıyaslayarak, hangi modülün hangi durumda daha uygun olduğuna karar vermede yardımcı olabilir.

USART ve UART haberleşme, STM32 geliştirme sürecinde önemli bir role sahiptir. Doğru bir biçimde yapılandırıldığında, güvenilir veri iletimi sağlayarak projelerin başarılı bir şekilde tamamlanmasına yardımcı olur.

ADC (Analog-Dijital Dönüştürücü) Kullanımı

STM32 mikrodenetleyiciler, ADC (Analog-Dijital Dönüştürücü) modülleri aracılığıyla çevresel sensörlerden analog verileri dijital verilere dönüştürmek için kullanılır. Bu modül, hassas analog veri yakalama ve işleme için oldukça önemlidir. STM32 üzerinde ADC kullanırken dikkate almanız gereken bazı önemli noktalar vardır:

  • DMA (Direct Memory Access) Kullanımı: STM32’de ADC modülü, DMA ile entegre şekilde çalışabilir. Bu sayede CPU’nun yönlendirmesi gerekmeden veri transferi gerçekleştirilebilir, bu da sistem performansını artırır.

  • Çok Kanallı ADC Kullanımı: STM32, birden fazla ADC kanalı üzerinden veri toplama imkanı sunar. Bu özellikle birden fazla analog sensörün aynı anda izlenmesi gereken uygulamalarda avantaj sağlar.

  • Yüksek Hassasiyet ve Doğruluk: STM32 ADC modülleri, yüksek çözünürlüklü dönüşüm özelliği sayesinde yüksek hassasiyetli veri sağlar. Ayrıca, dahili kalibrasyon işlevleri ile doğruluk da artırılabilir.

ADC modülünün sağladığı bu önemli özellikler sayesinde, STM32 mikrodenetleyicileri, geniş bir yelpazedeki gerçek zamanlı veri toplama ve işleme uygulamalarında başarılı bir şekilde kullanılabilir.

Bu özelliklerin yanı sıra, STM32’nin rakip ürünlere göre daha düşük güç tüketimi, geniş yonga yelpazesi ve zengin geliştirme ortamı gibi avantajları da dikkate alındığında, STM32 mikrodenetleyicilerin ADC modülü, birçok endüstriyel uygulama için ideal bir çözüm sunar.

STM32 ADC Yapimi

STM32 mikrodenetleyicilerinde ADC kullanımı genelde şu adımları içerir:

  1. ADC Periferini Başlatma ve Ayarlama:
    • Öncelikle, kullanmak istediğiniz ADC periferini başlatmanız gerekir. Bu, RCC (Reset and Clock Control) register’larını kullanarak ilgili saat sinyallerini ayarlamayı içerir. Bu işlem, mikrodenetleyicinin başlatılmasından önce gerçekleştirilmelidir.
RCC->AHBENR |= RCC_AHBENR_ADC1EN; // ADC1 clock enable

ADC Ayarlarını Yapma:

  • ADC’nin çözünürlüğü, örnekleme hızı, çalışma modu gibi ayarlar bu adımda yapılır.
ADC1->CR &= ~ADC_CR_ADEN; // Disable ADC
ADC1->CFGR1 &= ~ADC_CFGR1_RES; // Clear resolution bits
ADC1->CFGR1 |= ADC_CFGR1_RES_1; // Set 8-bit resolution
ADC1->CFGR1 |= ADC_CFGR1_CONT; // Enable continuous mode
ADC1->CFGR1 |= ADC_CFGR1_OVRMOD; // Enable overrun mode
ADC1->CFGR1 |= ADC_CFGR1_ALIGN; // Right align the result
ADC1->CFGR2 &= ~ADC_CFGR2_LFTRIG; // No left trigger for regular conversions
ADC1->CFGR1 &= ~ADC_CFGR1_SCANDIR; // Scan mode disabled
ADC1->CFGR1 &= ~ADC_CFGR1_DMACFG; // Direct mode enabled
ADC1->CFGR1 &= ~ADC_CFGR1_DMAEN; // DMA disabled
ADC1->CFGR2 &= ~ADC_CFGR2_CKMODE; // Use ADC clock (divided by 1)

ADC Kanallarını Konfigüre Etme:

  • Kullanmak istediğiniz ADC kanallarını belirtmeniz gerekir. Kanal seçimi ve diğer özellikler bu adımda belirlenir.
ADC1->CHSELR |= ADC_CHSELR_CHSEL0; // Enable Channel 0
  • ADC’yi Başlatma ve Dönüşüme Başlama:
    • ADC’yi başlatın ve dönüşüme başlamak için bu adımda ilgili biti setleyin.
ADC1->CR |= ADC_CR_ADEN; // Enable ADC
while (!(ADC1->ISR & ADC_ISR_ADRDY)); // Wait until ADC is ready
ADC1->CR |= ADC_CR_ADSTART; // Start ADC conversion

Dönüşüm Tamamlanmasını Bekleme:

  • Dönüşüm tamamlanana kadar bu adımda beklemeniz gerekir.
while (!(ADC1->ISR & ADC_ISR_EOC)); // Wait for conversion complete

Veriyi Okuma:

  • Dönüşüm tamamlandığında, ADC’den okuma işlemini gerçekleştirin
uint16_t adcValue = ADC1->DR; // Read ADC converted value

ADC’yi Kapatma (Opsiyonel):

  • ADC kullanımı tamamlandıktan sonra, ADC’yi devre dışı bırakabilirsiniz.
ADC1->CR |= ADC_CR_ADSTP; // Stop ongoing conversion
while (ADC1->CR & ADC_CR_ADSTP); // Wait until ADC stops
ADC1->CR |= ADC_CR_ADDIS; // Disable ADC
while (ADC1->CR & ADC_CR_ADEN); // Wait until ADC is disabled

Bu örnekler, STM32 mikrodenetleyici için ADC kullanımını genel bir şekilde açıklar. Ancak, kullanılan STM32 modeline ve geliştirme ortamına bağlı olarak kodunuzda farklılıklar olabilir. Mikrodenetleyici modelinizin reference manual’ını ve CubeMX veya HAL kütüphanesinin belgelerini incelemek, spesifik ayarları ve fonksiyonları daha iyi anlamanıza yardımcı olacaktır.

STM32 ADC Prorami

STM32 mikrodenetleyicilerde ADC kullanımını örnekleyen bir C programı aşağıda verilmiştir. Bu örnek, STM32CubeMX ve HAL kütüphanesi kullanılarak oluşturulmuştur. STM32CubeMX, mikrodenetleyici konfigürasyonunu kolaylaştırmak için kullanılan bir araçtır.

#include "stm32f4xx_hal.h"

ADC_HandleTypeDef hadc1;

void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_ADC1_Init(void);

int main(void)
{
  HAL_Init();

  SystemClock_Config();

  MX_GPIO_Init();
  MX_ADC1_Init();

  while (1)
  {
    // Başlatma işlemleri
    HAL_ADC_Start(&hadc1);
    HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);

    // ADC'den veriyi okuma
    uint16_t adcValue = HAL_ADC_GetValue(&hadc1);

    // ADC'yi durdurma
    HAL_ADC_Stop(&hadc1);

    // Yapılacak işlemler
  }
}

void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  __HAL_RCC_PWR_CLK_ENABLE();
  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLM = 8;
  RCC_OscInitStruct.PLL.PLLN = 336;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  RCC_OscInitStruct.PLL.PLLQ = 4;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }

  if (HAL_PWREx_EnableOverDrive() != HAL_OK)
  {
    Error_Handler();
  }

  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK)
  {
    Error_Handler();
  }
}

static void MX_ADC1_Init(void)
{
  ADC_ChannelConfTypeDef sConfig = {0};

  __HAL_RCC_ADC1_CLK_ENABLE();

  hadc1.Instance = ADC1;
  hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
  hadc1.Init.Resolution = ADC_RESOLUTION_12B;
  hadc1.Init.ScanConvMode = DISABLE;
  hadc1.Init.ContinuousConvMode = DISABLE;
  hadc1.Init.DiscontinuousConvMode = DISABLE;
  hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
  hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  hadc1.Init.NbrOfConversion = 1;
  hadc1.Init.DMAContinuousRequests = DISABLE;
  hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;

  if (HAL_ADC_Init(&hadc1) != HAL_OK)
  {
    Error_Handler();
  }

  sConfig.Channel = ADC_CHANNEL_0;
  sConfig.Rank = 1;
  sConfig.SingleDiff = ADC_SINGLE_ENDED;
  sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES;

  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }
}

static void MX_GPIO_Init(void)
{
  __HAL_RCC_GPIOA_CLK_ENABLE();
}

void Error_Handler(void)
{
  while (1)
  {
    // Hata durumunda yapılacaklar
  }
}

#ifdef USE_FULL_ASSERT
void assert_failed(uint8_t *file, uint32_t line)
{
}
#endif

Bu program, STM32F4 serisi bir mikrodenetleyici için örnek bir ADC kullanımını göstermektedir. Kodun bazı bölümlerini anlamak için HAL kütüphanesi ve CubeMX belgelerini incelemeniz faydalı olacaktır. Ayrıca, kullanılan mikrodenetleyici modeline göre bazı konfigürasyon ayarlarını değiştirmeniz gerekebilir.

STM32 I2C ve SPI Haberleşme Protokolleri

STM32 mikrodenetleyiciler, I2C ve SPI gibi popüler haberleşme protokollerini destekler. Bu protokoller, farklı cihazlar arasında veri iletişimini sağlamak için kullanılır. Hem I2C hem de SPI, STM32 geliştirme sürecinde genellikle kullanılan ve oldukça faydalı olan haberleşme yöntemleridir.

STM32’de I2C ve SPI Karşılaştırması

ÖzellikI2CSPI
BağlantıÇoklu cihaz bağlantısına izin verirÇoklu cihaz bağlantısına izin verir
HızDaha yavaşDaha hızlı
Pim SayısıDaha az pim gerektirirDaha fazla pim gerektirir
Kullanım AlanıSensörler, EEPROM gibi cihazlar içinEkranlar, SD kartlar gibi cihazlar için

STM32’de I2C Kullanımı

STM32 Geliştirme
Yenilikçi STM32 Geliştirme Rehberi 7
  • I2C, sensörler ve EEPROM gibi cihazlarla iletişim kurmak için kullanılır.
  • HAL_I2C_Master_Transmit ve HAL_I2C_Master_Receive gibi STM32 kütüphaneleri I2C ile iletişimi sağlar.
  • Birden fazla cihazın aynı veri yolunu paylaşmasını sağlar.

STM32 mikrodenetleyicilerinde I2C (Inter-Integrated Circuit) iletişimi, bir dizi I2C donanım periferini kullanarak gerçekleştirilir. I2C, düşük hızlı seri bir iletişim protokolüdür ve bir mikrodenetleyici ile çeşitli sensörler, EEPROM’lar, ekranlar ve diğer entegre devreler arasında veri iletimi için kullanılır. İşte STM32 mikrodenetleyicilerinde I2C kullanımını başlatmak için genel adımlar:

  • Clock Konfigürasyonu:
    • Öncelikle, mikrodenetleyici sistem saatini ayarlamanız gerekiyor. Bu adım, mikrodenetleyici çalışma frekansını belirler.
RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_I2C1;
PeriphClkInit.I2c1ClockSelection = RCC_I2C1CLKSOURCE_SYSCLK;
HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);

GPIO Ayarları:

  • I2C hattının SDA ve SCL pinlerini tanımlayarak ve uygun alternatif fonksiyonları seçerek GPIO pinlerini ayarlamanız gerekiyor.
__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();

GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_6 | GPIO_PIN_7; // SDA ve SCL pinleri
GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; // Open-drain, alternatif fonksiyon
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF4_I2C1;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  • I2C Periferini Başlatma:
    • I2C periferini başlatmak için uygun parametreleri ayarlamanız gerekiyor.
I2C_HandleTypeDef hi2c1;

hi2c1.Instance = I2C1;
hi2c1.Init.ClockSpeed = 100000; // I2C hızı (örneğin 100kHz)
hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
hi2c1.Init.OwnAddress1 = 0x00;
hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
hi2c1.Init.OwnAddress2 = 0x00;
hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;

if (HAL_I2C_Init(&hi2c1) != HAL_OK)
{
  // Hata durumunda işlemler
  Error_Handler();
}

I2C İletişimi:

  • I2C iletişimini gerçekleştirmek için HAL_I2C_Master_Transmit() ve HAL_I2C_Master_Receive() fonksiyonlarını kullanabilirsiniz. Örneğin, bir veri gönderme işlemi şu şekilde yapılabilir:
uint8_t data_to_send[2] = {0x01, 0x02};
uint8_t device_address = 0x3C;

HAL_I2C_Master_Transmit(&hi2c1, device_address, data_to_send, 2, HAL_MAX_DELAY);

Bu örnek, STM32CubeMX ve HAL kütüphanesi kullanılarak oluşturulmuş basit bir I2C iletişimini göstermektedir. Gerçek projelerde, kullanılan sensör veya entegre devre belgelerine bakarak I2C parametrelerini ve iletişimini doğru bir şekilde yapılandırmanız önemlidir.

STM32’de SPI Kullanımı

  • SPI, ekranlar, SD kartlar gibi yüksek hız gerektiren cihazlarla iletişim kurmak için tercih edilir.
  • HAL_SPI_Transmit ve HAL_SPI_Receive gibi kütüphaneler, SPI ile veri iletimini kolaylaştırır.
  • Yüksek hızlı veri iletimi için kullanılır.

STM32, I2C ve SPI gibi haberleşme protokollerini destekleyerek geniş bir uygulama yelpazesi için esneklik sağlar. Bu protokoller, projelerinizde farklı cihazlar arasında veri iletişimini sağlamanıza yardımcı olur.

DMA (Direct Memory Access) Kullanımı

DMA (Direct Memory Access), mikrodenetleyicilerde veri transferini hızlandırmak için kullanılan bir tekniktir. STM32 mikrodenetleyicilerinde DMA kullanarak veri transferi işlemlerini daha verimli bir şekilde gerçekleştirebilirsiniz. DMA’nın avantajları arasında CPU’nun işlemci yoğunluğunu azaltması, veri transfer hızını artırması ve enerji tüketimini optimize etmesi bulunmaktadır.

STM32 mikrodenetleyicilerinde DMA kullanımı oldukça yaygındır ve pek çok uygulama alanında öne çıkmaktadır. DMA’nın kullanıldığı bazı uygulama alanları şunlardır:

  • Yüksek hızlı veri transferi gerektiren sensör verilerinin toplanması
  • Ses ve görüntü işleme uygulamaları
  • Gerçek zamanlı veri işleme ve kontrol uygulamaları

DMA’nın kullanımı, veri transferi süreçlerini optimize etmek ve mikrodenetleyiciyi diğer görevlere odaklanmaya teşvik etmek adına oldukça önemlidir. Ayrıca, DMA’nın kullanımıyla enerji tüketimi de minimize edilerek daha verimli bir sistem oluşturulabilir.

STM32 mikrodenetleyicilerinde DMA kullanarak veri transfer işlemlerini hızlandırmak ve sistem performansını artırmak mümkündür. DMA’nın uygun şekilde yapılandırılması, veri transfer süreçlerini verimli hale getirir ve mikrodenetleyici performansını artırır. Bu da özellikle yüksek performans gerektiren uygulamalarda önemli bir avantaj sağlar.

Periferik Kesme (Interrupt) Kavramı

Periferik kesmeler (interrupt) STM32 geliştirme sürecinde oldukça önemli bir rol oynar. Bu kavram, mikrodenetleyiciyi sürekli olarak belirli bir işlemi takip etmekten kurtarır ve beklenmeyen olaylar meydana geldiğinde mikrodenetleyiciyi uyandırarak işlem yapmasını sağlar. Periferik kesmelerin kullanılması, mikrodenetleyicinin işlem gücünü artırır ve enerji tüketimini azaltır.

STM32’de Periferik Kesmelerin Avantajları

Periferik kesmelerin kullanılması, birçok avantajı beraberinde getirir:

  • Daha Az CPU Kullanımı: Periferik kesmeler, CPU’nun belirli bir olayın gerçekleşmesini sürekli olarak kontrol etmesi ihtiyacını ortadan kaldırır ve CPU’nun diğer işlemlere odaklanmasını sağlar.
  • Düşük Gecikme Süresi: Kesme talepleri hemen işlenir ve bu sayede gecikme süresi en aza indirilir.
  • Enerji Verimliliği: Kesme kullanımı, gereksiz enerji tüketimini önler ve güç verimliliğini artırır.

Karşılaştırma Tablosu: Periferik Kesmeler ve Sürekli Kontrol

Aşağıda STM32’de periferik kesmelerin sürekli kontrol yöntemine göre avantajlarını karşılaştıran bir tablo bulunmaktadır:

 Periferik KesmelerSürekli Kontrol
CPU KullanımıDaha azDaha fazla
Gecikme SüresiDaha azDaha fazla
Enerji VerimliliğiDaha yüksekDaha düşük

Periferik kesmelerin kullanımı, STM32 geliştirme sürecinde performansı artırırken enerji verimliliğini de göz önünde bulundurur. Bu nedenle, periferik kesmelerin doğru bir şekilde kullanılması, projelerinizin daha verimli ve optimize edilmiş olmasını sağlar.

Sıkça Sorulan Sorular

STM32 nedir?

STM32, STMicroelectronics tarafından üretilen ve genellikle gömülü sistemlerde kullanılan bir mikrodenetleyici ailesidir. Yüksek performans, düşük güç tüketimi ve geniş bağlantı seçenekleri sunar.

STM32 geliştirme için hangi ortamlar kullanılabilir?

STM32 geliştirme için Arduino IDE, STM32CubeIDE, Keil uVision, PlatformIO gibi popüler geliştirme ortamları kullanılabilir. Her bir ortamın kendi avantajları ve dezavantajları bulunmaktadır.

STM32 programlama dili nedir?

STM32 mikrodenetleyiciler, C ve C++ programlama dilleriyle programlanabilir. Geliştirme yaparken genellikle bu diller kullanılır ve bu diller için uygun derleyiciler bulunur.

STM32’nin enerji tüketimi ne kadar?

STM32 mikrodenetleyiciler, düşük güç tüketimi ile bilinir. Bazı modelleri uykuda sadece birkaç mikroamperlik güç tüketimi sağlayabilirler. Bu özellik, pil ile çalışan cihazlar için idealdir.

STM32 ile hangi tür projeler geliştirilebilir?

STM32 mikrodenetleyiciler ile otomasyon sistemleri, tıbbi cihazlar, endüstriyel kontrol sistemleri, robotik uygulamalar, akıllı ev sistemleri ve daha birçok farklı türde proje geliştirilebilir.

STM32

Gömülü Sistemler

etiketlerETİKETLER
Üzgünüm, bu içerik için hiç etiket bulunmuyor.
okuyucu yorumlarıOKUYUCU YORUMLARI

Yorum yapabilmek için giriş yapmalısınız.

Sıradaki içerik:

Yenilikçi STM32 Geliştirme Rehberi

Araç çubuğuna atla