Arduino ile "çalışıyor" demek kolaydır. digitalWrite(13, HIGH) yazarsınız, LED yanar. Peki arkasında ne oldu? Hangi register değişti, hangi saat kaynağı açıldı, hangi pin modu yapılandırıldı? Arduino bunları sizden gizler — bu hem en büyük gücü hem de gizli tuzağıdır.
STM32'ye geçmeyi düşünüyorsanız, asıl soru "hangisi daha iyidir?" değildir. Asıl soru: donanımı anlamak mı istiyorsunuz, yoksa donanımı kullanmak mı?
Gömülü sistemlere yeni başlayan herkes bir noktada bu soruyla karşılaşır: Arduino mu, STM32 mi? İkisi de popüler, ikisi de makul fiyatlı, ikisi de LED yakıp söndürebilir. Ama aralarındaki fark, bir hesap makinesiyle bir mühendislik iş istasyonu arasındaki fark kadar büyük olabilir — doğru veya yanlış bir cevap yoktur, ama projenize göre doğru bir seçim vardır.
"Arduino" iki şeyi birden ifade eder: bir donanım ailesi ve bir yazılım ekosistemi.
Klasik Arduino Uno, Atmel'in (şimdi Microchip) ATmega328P mikrodenetleyicisini çalıştırır:
Arduino'nun asıl gücü donanımda değil, ekosisteminde yatar. Arduino IDE, Wire, SPI, Serial gibi kütüphaneler ve binlerce hazır "shield" (genişleme kartı) sayesinde bir LED'i saniyelerde yakabilirsiniz:
void setup() {
pinMode(13, OUTPUT);
}
void loop() {
digitalWrite(13, HIGH);
delay(500);
digitalWrite(13, LOW);
delay(500);
}
Bu kod çalışır, ama arkasında ne olduğunu bilmiyorsunuzdur: pinMode(13, OUTPUT) aslında ATmega328P'nin DDRB register'ına bir bit yazar. digitalWrite(13, HIGH) ise PORTB register'ının ilgili bitini 1 yapar. Arduino bu detayları sizden gizler — bu hem bir avantaj hem bir dezavantajdır.
STM32, STMicroelectronics'in ARM Cortex-M çekirdekli mikrodenetleyici ailesidir. Yüzlerce farklı modeli bulunur; bu platformda kullandığımız STM32F070RB (Nucleo-F070RB kartı) şu özelliklere sahiptir:
Aynı LED yakıp söndürme işi, STM32'de register düzeyinde şöyle görünür:
#include "stm32f0xx.h"
int main(void) {
/* GPIOA saat kaynağını aç */
RCC->AHBENR |= RCC_AHBENR_GPIOAEN;
/* PA5'i çıkış olarak yapılandır */
GPIOA->MODER |= (1 << 10); /* MODER5 = 01 → general purpose output */
GPIOA->MODER &= ~(1 << 11);
while (1) {
GPIOA->ODR ^= (1 << 5); /* PA5'i toggle et */
for (volatile int i = 0; i < 100000; i++);
}
}
Hiçbir şey gizlenmez: hangi register'ı, hangi biti, neden değiştirdiğinizi bilmeniz gerekir.
Arduino bir soyutlama katmanı sunar. analogWrite() çağırırsınız, altta PWM donanımı devreye girer. Hızlı prototipleme için mükemmeldir; ancak zamanlamayı hassas kontrol etmek, kesintileri (interrupt) yönetmek veya DMA kullanmak istediğinizde soyutlama bir engele dönüşür.
STM32 bare-metal programlamada soyutlama katmanı yoktur. Register'lara doğrudan yazarsınız. Bu, öğrenme eğrisini artırır ama davranışı tamamen öngörülebilir kılar.
Not: STM32 için de HAL (Hardware Abstraction Layer) mevcuttur. STM32 HAL, Arduino'nun sunduğuna benzer bir soyutlama sağlar — ancak çok daha ince ayarlıdır ve altta yatan donanıma erişimi her zaman açık bırakır.
| Kriter | Arduino Uno (ATmega328P) | STM32F070RB |
|---|---|---|
| Çekirdek | 8-bit AVR | 32-bit ARM Cortex-M0 |
| Saat | 16 MHz | 48 MHz |
| Flash | 32 KB | 128 KB |
| SRAM | 2 KB | 16 KB |
| Kayan nokta | Yazılımsal (yavaş) | Yazılımsal (hızlı) |
| Tipik GPIO geçiş hızı | ~100 ns | ~20 ns |
ATmega328P'nin 2 KB SRAM'i, bir dizi veya birkaç string tanımladığınızda hızla dolabilir. STM32F070RB'nin 16 KB SRAM'i çok daha büyük veri yapılarına izin verir.
Arduino Uno üzerinde bir tane donanımsal UART, bir tane SPI ve bir tane I2C arabirimi bulunur. STM32F070RB'de birden fazla USART, SPI ve I2C birimi mevcuttur — aynı anda birden fazla cihazla haberleşebilirsiniz.
STM32 serisinin büyük çoğunluğu gelişmiş güç yönetimi modlarına sahiptir: Stop modu, Standby modu. Bataryayla çalışan bir ürün geliştiriyorsanız bu fark kritiktir. ATmega328P de uyku modlarına sahiptir, ama STM32'nin esnekliği çok daha geniştir.
Arduino'nun topluluğu ve kütüphane ekosistemi çok daha büyüktür. Hemen her sensör için hazır bir Arduino kütüphanesi bulabilirsiniz. STM32 ekosistemi daha çok profesyonel geliştiricilere yönelik olduğundan kütüphaneler daha sınırlıdır — ama protokolleri (I2C, SPI) kendiniz yazıyorsanız zaten bu kütüphanelere ihtiyacınız yoktur.
Bu sık sorulan bir sorudur ve cevabı kişinin hedefine bağlıdır.
Eğer gömülü sistem mühendisi olmak istiyorsanız, doğrudan STM32 ile başlamak daha verimlidir. Arduino'nun soyutladığı katmanlar — GPIO register'ları, saat kaynakları, timer yapılandırması — tam olarak bir gömülü sistemci'nin anlaması gereken şeylerdir. Arduino ile "çalışıyor" demek mümkündür, ama neden çalışıyor sorusunun cevabını vermek güçleşir.
Eğer hızlı prototipleme veya hobby amaçlıysa, Arduino makul bir başlangıç noktasıdır. Ancak bir süre sonra donanıma daha yakın olmak istediğinizde STM32'ye geçiş sizi sıfırdan öğrenmek zorunda bırakacaktır — çünkü Arduino ve STM32'nin zihinsel modelleri birbirinden çok farklıdır.
Pratik öneri: Eğer zaman kısıtlamanız yoksa doğrudan STM32 ile başlayın. İlk birkaç hafta daha yavaş gidebilirsiniz, ama register seviyesinde kazanılan sezgi uzun vadede çok daha değerlidir.
| Kriter | Arduino | STM32 |
|---|---|---|
| Öğrenme eğrisi | Düşük | Orta–Yüksek |
| Donanım kontrolü | Sınırlı | Tam |
| Performans | Düşük | Yüksek |
| Ekosistem | Zengin | Daha sınırlı |
| Ürün geliştirme | Zor | Uygun |
| Güç yönetimi | Temel | Gelişmiş |
| İdeal kullanım | Prototip, eğitim (genel) | Gömülü sistem öğrenimi, ürün geliştirme |
STM32'ye geçmek veya bare-metal programlamayı derinlemesine öğrenmek istiyorsanız, bu platformdaki STM32 kurs serisine göz atabilirsiniz — register seviyesinden başlayarak gerçek donanım üzerinde adım adım ilerleyen bir müfredat sunulmaktadır.
Kitap serisini incele →