You are on page 1of 102

ARM TEMEL MİMARİSİ

ARM 1990 yılının kasım ayında kuruldu. ARM (Acorn RISC Machines) şirketinin genel merkezi
İngiltere Cambridge dir. Tüm dünyada satış destek ve mühendislik ofisi vardır. RISC işlemci
çekirdek mimarisi dir. RISC: Reduced Instruction Set Computing ve CMSIS ise Cortex
MicrocontroIIer Software Interface Standard ifadesinin kısaltılmasıdır. ARM mimarisi (orijinal adı
Acorn RISC Machine) RISC tabanlı bir işlemci mimarisidir, 32 ve 64 bit versiyonları vardır, genel
itibarıyla düşük güç tüketimi, diğer RISC tabanlı işlemcilere göre yüksek performanslı oluşu ve
x86-x64 işlemcilere göre daha hesaplı olmasından dolayı gömülü sistemlerde, taşınabilir
aygıtlarda kullanılan yonga setlerinde genelde ARM işlemci tercih edilir.

ARM firması kendi başına işlemci üretmez, dizayn ve lisansı satar, CISC tabanlı işlemcilere göre
özelleştirilebildiğinden aynı jenerasyon işlemci farklı üreticilerden değiştirilmiş olarak çıkabilir,
bağlı olarak da performans farklılıkları görülür. Bu yüzden işlemci jenerasyonları ve
karakteristikleri incelenirken ARM referans tasarımı ele alınır.

Bazı kullanım alanları: Tele parking cihazı, robotlar, yangın dedektörleri, koşu bantları, ekzersiz
bantları, buz dolapları, çamaşır makineleri, ekzersiz bantları, akıllı ısıtıcılar, cep telefonları, printer
1ar, oyun konsolları, navigasyon cihazları, harddiskler, laptop 1ar, bilgisayar kasaları, tabletler,
televizyonlar...
Cortex M serisinde numara arttıkça performans, fonksiyon, kapasite artar.
Cortex-M4 > Cortex-M3 > Cortex-Ml > Cortex-M0+ > Cortex-M0
Cortex-M: Donanımsal bölümlendirilmiş mikrokontrolörler. Elektronik sektöründe kullanılır.
Cortex-R: Real Time (gerçek zamanlı) donanımsal bölümlendirilmiş. Yazıcı, kamera, harddiskler
de kullanılır.
Cortex-A: Applications NEON (NEON uygulamaları)anlamına gelir. Yüksek hız istenen yerlerde
kullanılır. Telefon, bilgisayar, otomotiv sektörlerinde kullanılır.
ARM V7 Mimarisinin Özellikleri:
ARM V7-A Uygulama Özlükleri:
1 - Hafıza yönetimini destekler (MMU).
2 - Yüksek performans ve düşük güç tüketimi.

3 - Güvenli bölge, geniş 1 eti lebi 1 ir sistem.


4 - İsteğe bağlı geniş fiziksel adresleme ve gerçek hat.

1
ARM V7TC Gerçek Zaman Özellikleri
1 - Korumalı hafıza(MPU).

- Düşük gecikme süresi ve gerçek zamanlı öngörülme ihtiyacı


ARM V7-M Mikrokontrolör Özellikleri:
1 - Düşük kapılı sayılabilir giriş noktası.

2 - Rastgele olmayan ve tahmin edilebilen davranış anahtarı.

3 - Derinden gömülü kullanım.

ARM RISC mimarisine sahiptir.


> Öğrendiğini tek bir döngü içinde yürütür, orthogonal kayıtçısı vardır. ARM 32 bit yükleme
depolama mimarisine sahiptir.
> Sadece hafıza erişimine izin veren yüklemeler ve depolamalar vardır.
> Geniş 32 bitlik iç kayıtçılar vardır.
> Eski çekirdekler yalnızca 16 bit Thumd talimatlarını destekler. Thumb-2 teknolojisi gerekli
çekirdekleri ekler 32 bitlik talimat komutları artan esnekliği ile kod yoğunluğunu korur.

Bu kartın kullanımı için gereken temel bilgiler:


> Robotik sistem bilgisi
> Bilgisayar mimarisi
> Biraz Assembly dili
Kesme gecikme süresi:
Cortex-M0 16 cycle
Cortex-M0+ 15 cycle
Cortex-M3 12cycle
Cortex-M4 12 cycle
Cortex-M7 12 cycle

Cortex-M Karşılaştırılması:

2
İşlemci Modu:
Her bir mod kendine özgü yığın boşluğuna ve farklı alt küme kayıtçısına sahiptir.
 Bazı işlemler sadece ayrıcalıklı modda yürütülebilir.
ARM çekirdeği 7 temel çalışma moduna sahiptir.
Mod 1 Supervisor (SVC) Modu: Resetlemeden sonra ve bir süpervisor talimatı çağırıldığında
yürütülür.
Mod 2 FIQ Modu: Yüksek öncelikli kesme yükseltildiğinde girilir.
Mod 3 IRQ Modu: Normal Öncelikli kesme yükseltildiğinde girilir.
Mod 4 Abort (Durdurma) Modu: Bellek erişimi ihlallerini engellemek için kullanılır.
Mod 5 Undef (Belirsiz) Modu: Tanımlanmamış komutları işlemek için kullanılır.
Mod 6 System Modu: Bazı register ların kullanım modu ayrıcalıklı mod olarak kullanılır.
Mod 7 User (Kullanıcı) Modu: Uygulama görevleri altında çalışacak olan mod.
M-Cortex inin işlemci modları:
1-iş parçacığı modu: Kod uygulama modu.
2- İşleyîcİ modu: İstisnai durum işleme modu.
Register Kullanıcı Modu:

Bellek ve Veri Yolu Mimarisi


Sistem Mimarisi
Düşük, orta, yüksek ve XL yoğunluklu cihazlarda ana sistem şunlardan oluşur:
• Dört Ana bileşen (Masters):
- Cortex®-M3 çekirdekli DCode bus (D-bus) ve Sistem bus (S-bus)
- GP-DMA1 & 2 (genel amaçlı DMA)
• Dört yardımcı bileşen:
- Dahili SRAM
- Dahili flash bellek
- FSMC
- Tüm APB çevre birimlerini bağlayan APBx'e (APB1 veya APB2) AHB
Bunlar, Şekil 1'de gösterildiği gibi çok katmanlı bir AHB veri yolu mimarisi kullanılarak birbirlerine
bağlanır:

3
Şekil 1. Sistem mimarisi (düşük, orta, XL yoğunluklu cihazlar

DCode veri yolu


Bu veri yolu, Cortex®-M3 çekirdeğinin DCode veri yolunu (haritalama yükü ve hata ayıklama
erişimi) Flash bellek Veri arabirimine bağlar.
Sistem veri yolu
Bu veri yolu, Cortex®-M3 çekirdeğinin (çevre birimleri veri yolu) sistem veri yolunu çekirdeği ve
DMA arasındaki tahkimatı yöneten bir BusMatrix'e bağlar.

DMA Veri Yolu


Bu veri yolu, DMA'nın AHB ana ara yüzünü CPU DCode ve DMA'nın SRAM'a, Flash belleğine ve
çevre birimlerine erişimini yöneten BusMatrix'e bağlar.

4
BUS Matrix
BusMatrix, çekirdek sistem veri yolu ve DMA ana veri yolu arasındaki erişim tahkimatını yönetir.
Tahkim, Round Robin algoritması kullanmaktadır. Bağlantı hattı aygıtlarında, BusMatrix beş ana
(CPU DCode, Sistem veri yolu, Ethernet DMA, DMA1 ve DMA2 veri yolu) ve üç yardımcı hattan
(FLITF, SRAM ve AHB2APB köprüsü) oluşur. Diğer aygıtlarda BusMatrix dört ana (CPU DCode,
Sistem veri yolu, DMA1 veri yolu ve DMA2 veri yolu) ve dört bağımlı (FLITF, SRAM, FSMC ve
AHB2APB köprüsü) hattan oluşur.

AHB çevre birimleri, DMA erişimine izin vermek için bir BusMatrix aracılığıyla sistem veri yoluna
bağlanır.

AHB / APB köprüleri (APB)

İki AHB / APB köprüsü AHB ve 2 APB arasında tam senkron bağlantı sağlar. APB1 36 MHz ile
sınırlıdır, APB2 tam hızda çalışır (cihaza bağlı olarak 72 MHz'e kadar çıkabilir). Her bir köprüye
bağlı çevre birimlerinin adres haritalaması için Şekil'1 bakın. Her aygıt sıfırlandıktan sonra, tüm
çevresel saatler devre dışı bırakılır (SRAM ve FLITF hariç). Bir çevre birimini kullanmadan önce
saatini RCC_AHBENR, RCC_APB2ENR veya RCC_APB1ENR kayıt cihazında etkinleştirmeniz
gerekir.

Not: Bir APB kaydında 16 veya 8 bitlik bir erişim yapıldığında, erişim 32 bitlik bir erişim haline
dönüştürülür: köprü, 32 bitlik vektörü beslemek için 16 veya 8 bitlik verileri çoğaltır.

Bellek Organizasyonu

Program belleği, veri belleği, kayıtlar ve G / Ç bağlantı noktaları aynı 4 GB doğrusal adres alanıyla
aynıdır. Baytlar Bellekte Little Endian formatında kodlanır. Bir kelimedeki en düşük numaralı bayt,
sözcüğün en düşük anlamlı baytı ve en yüksek sayıdaki bayt en önemlisi olarak kabul edilir.
Adreslenebilir bellek alanı her biri 512 MB olmak üzere 8 ana bloğa ayrılmıştır. Çip yongaları ve
çevre birimleri için ayrılmayan tüm bellek alanları "Ayrılmış" olarak kabul edilir.

5
STM32F103R8Tx MİKRO KONTROLCÜ

Mainstream Performans hattı, 64 Kbyte Flash, 72 MHz CPU, motor kontrolü, USB ve CAN özellikli
ARM Cortex-M3 MCU
10kU (US $) Birim Fiyat: 2.214
LQFP64
STM32F103xx orta yoğunlukta performans serisi ailesi, 72 MHz frekansta, yüksek hızlı gömülü
hafızalarda (128 Kb'a kadar flash bellek ve 20 Kb'ye kadar SRAM) yüksek performanslı ARM®
Cortex®-M3 32-bit RISC çekirdeği, ve iki APB veriyoluna bağlı kapsamlı I / O'lar ve çevre birimleri
serisi. Tüm cihazlar iki adet 12 bit ADC, üç adet genel amaçlı 16 bit zamanlayıcı ve bir adet PWM
zamanlayıcı ile standart ve gelişmiş iletişim arabirimleri sunar: iki I2C ve SPI, üç adet USART, bir
USB ve bir CAN vardır. Cihazlar 2.0 ila 3.6 V'luk bir güç kaynağı ile çalışır. -40 ila +85 ° C sıcaklık
aralığında ve -40 ila +105 ° C geniş sıcaklık aralığında bulunurlar. Kapsamlı bir güç tasarruf modu
seti ile düşük güçlü uygulamaların tasarımını sağlar. STM32F103xx orta yoğunlukta performans
serisi ailesindendir, 36 pinden 100 pine kadar altı farklı pakete sahiptir. Seçilen aygıta bağlı olarak,
farklı çevre birimleri kümeleri bulunur, aşağıdaki açıklama bu ailede önerilen çevre birimlerinin
genel bir görünümünü verir. Bu özellikler, STM32F103xx orta yoğunluklu performans hattı mikro
denetleyici ailesini, motor sürücüleri, uygulama kontrolü, tıbbi ve el ekipmanı, PC ve oyun çevre
birimleri, GPS platformları, endüstriyel uygulamalar, PLC'ler, invertörler, yazıcılar, tarayıcılar gibi
geniş bir uygulama yelpazesi için uygundur, ayrıca alarm sistemleri, video interkomlar ve HVAC'ler
içinde ugundur.

ÖZELLİKLER
ARM® 32-bit Cortex®-M3 CPU Çekirdeği
- 0 bekleme durumu bellek erişiminde 72 MHz maksimum frekans, 1.25 DMIPS / MHz (Dhrystone
2.1) performansı
- Tek çevrim çoğaltma ve donanım bölüşümü
Hafızalar
- 64 veya 128 Kbyte Flash bellek - 20 Kbyte SRAM
Saat, sıfırlama ve tedarik yönetimi
- 2.0 ila 3.6 V uygulama kaynağı ve I / O'lar
- POR, PDR ve programlanabilir gerilim dedektörü (PVD)
- 4 ila 16 MHz kristal osilatör
- Dahili 8 MHz fabrika çıkışı RC

6
- Dahili 40 kHz RC
- CPU saati için PLL
- Kalibrasyonlu RTC için 32 kHz osilatör
Düşük güç
- Uyku, Durdur ve Bekleme modları - RTC ve yedek kayıt için VBAT kaynağı
2 x 12 bit, 1 μs A / D dönüştürücü (16 kanala kadar) - Dönüştürme aralığı: 0 - 3.6 V - Çift örnek ve
tutma özelliği - Sıcaklık sensörü
DMA
- 7 kanallı DMA denetleyicisi
- Desteklenen çevrebirim aygıtları: Zamanlayıcılar, ADC'ler, SPI'ler, I2C'ler ve USART'lar
80'e kadar hızlı G / Ç bağlantı noktası
Hata ayıklama modu
7 zamanlayıcı
- Her biri 4 IC / OC / PWM veya darbe sayacı ve kareleme enkoder girişi olan üç 16 bitlik
zamanlayıcı
- 16 bit, motor kontrolü PWM zamanlayıcı, acil stop ile ölü zaman üretme
- 2 izleme sayacı (bağımsız ve Pencere) - SysTick zamanlayıcı 24-bit sayaç
9 iletişim arabirimi
- En fazla 2 SPI (18 Mbit / s)
- CAN arabirimi (LIN, IrDA yeteneği, modem kontrolü)
- 3 adede kadar I2C arabirimi (SMBus / PMBus) 2.0B Aktif)
- USB 2.0 tam hızlı arabirim
CRC hesaplama birimi, 96 bitlik benzersiz kimlik
Paketler ECOPACK®'tir

7
STM32CUBEMX
Stm32cubemx yeni başlayan ve ileri düzey yazılımcılar için son derece esnek ve kolay kullanım
sağlamaktadır. Bilgisayar yazılımı ile yapılandırma yapılabilir. Kullanıcının isteğine uygun C kodu
üretir.
1. Adım: Mikro kontrolörün seçimi. Filtreleme seçenekleri sayesinde kullanacağımız mikro

kontrolörü kolaylıkla seçebiliriz.


2. Adım: Mikro kontrolörün yapılandırma ayarlarının yapılması. Burada 4 adet genel sekme

bulunur.
a) Pinout sihirbazı (wizard)
b) Clocktree wizard
c) Peripherals and middleware wizard
d) Power consumption wizard
3. Adım : Kod üretici kurulumu. Kullandığımız arayüz için standart kod üretir.
STM32CubeMx gömülü yazılım katmanları.
a) Kullanıcı Kodu: Kullanıcının isteğine bağlı kod yazılım katmanı.
b) STM32Cube katmanı: TCP/IP Yığını: Standart açık kaynak kodludur.
USB Kütüphanesi: Hazır kütüphanesi mevcuttur. Ayrıca kendi kütüphanemizi oluşturmamızı
sağlar.
Grafikler: StmWin için.
Dosya sistemi: FatFS standar açık kaynak kodlu.
RTOS: FreeRTOS standart açık kaynak kodlu.
Touch Sensing Library: Dokunmatik ekran kütüphanesi.
c) STM32 Cube HAL&&LL: Portlar için HAL, optimizasyon için LL kullanılır.
Tüm çevresel birimleri kapsar.
Hazır kod üretir.

STM32CubeMX Özellikleri

STM32CubeMX başlatıldığında kullanıcı önceden kaydedilmiş bir projeyi yükleyebilir, yeni bir
proje oluşturmayı seçebilir. STM32Cube MX ‘. ioc ‘ uzantılı dosya oluşturulur. Bu uzantılı dosya
açılır vey-a oluşturduğumuz programı ‘. ioc’ uzantısı şeklinde kayıt eder. Her proje için sadece bir
‘. ioc’ dosyası oluşturulur. Mikro işlemci Cube de sadece bir sonraki işlem için ayarlama şeklinde
kullanıla bildiği gibi ikinci olarak C kodu üretilerek de yapılandırılabilir. İşlemci veya bord seçimi
oldukça kolaydır.

8
Yeni bir proje başlatılırken özel bir pencere açılarak mikro işlemci veya bord listesinden filtreleme
yapılarak istenen seçim çok kolay yapılabilir. Pin seçimi ve yapılandırması çok kolaydır. Periferik
modda pin seçim listesinden bu seçim çok kolay yapılabilir, Daha gelişmiş kullanıcılar için
doğrudan bir çevresel birimler seçim haritası kullanılabilir.
Bu işlem bir başka pin çakışma çözücü olarak seçilebilir. Pin çıkış ayarları dışarı csv dosyası
olarak dışarı aktarılabilir. STM32CUBE MX temeli gömülü yazılım kütüphanelerine dayanır.
STM32CUBE Başlangıç C kodu üretir. Sonuçlar oluşturulan ‘marn, c’ dosyasına aktarılır. Kullanıcı
tanımlı C kodu üretilerek oluşturulan kaynak dosyaları değiştirebilir.
Kullanıcı tanımlı şablon dosyaları ‘. fiti’ uzantılı dosya oluşturulur.
Proje ayarları menüsünden kullanıcı geliştirme aracı seçilerek C kodu elde edilir. Doğrudan
üçüncü parti arayüzü Keil MDK-ARM, IAR EWARM. Atolic True STUDIO...sistemi
İçerisine yeni proje yazılımı olarak aktarılır. Güç tüketimi hesaplanmasına olanak sağlar. Frekans
seçimi, çevre birimleri, adım süresi, pil ömrünü tahmini olarak sağlar. Saat frekans ağaç
yapılandırmasına olanak verir. STM32CubeMX yapılandırılabilir otomatik güncellemeleri
destekler. Ayrıca önceden yüklenmiş paketlerin silinmesine olanak verir. Pdf ve csv raporlarının
oluşturulmasına olanak verir.

STM32CUBEMX Kullanıcı Ara Yüzü

STM32CubeMX ana penceresinde bir menü çubuğu, araç çubuğu, dört pencereden oluşur. Pin
yapılandırma, saat yapılandırma (frekans ayarı), güç tüketimi hesaplama, yardım penceresi,
mikroişlemci penceresi, güncelleme menüsü bulunmaktadır. C kodu üretimi için farklı kullanıcılar
arasında geçiş yapılabilir.
• Pin çıkış penceresinden gerekli pin ayarlarını seçin.
• Frekans saat ağacından gerekli frekans ayarlarım yapın.
• Pin çıkış penceresinden RCC yapılandırma ayarlarını yapın.
• Yapılandırma penceresinden gerekli İP ayarlarını yapın.
• Başlangıç C kodunu oluşturun.
Hos geldin Ana Sayfası:
Üç menü görünür. New Project, Load Project ve Help menüsü.

9
a) New Project Menüsü: Yeni proje oluşturmayı başlatma sekmesidir. İşlemci ve bord seçimi
yapılandırmasına olanak sağlar.
b) Load Project Menüsü: Daha önceden kayıtlı bulunan \ ioc’ uzantılı dosyayı açmak için
kullanılır.
c) Help Menüsü: Kullanım kılavuzunu açar.

New Project Sekmesi: Bu sekme seçildiği zaman iki seçenekli yeni sekme açılır. Hedef işlemcilerin
listesini gösteren işlemci seçme sekmesi ve bord seçim tablosunu gösteren sekme açılır.
Kullanacağımız İşlemci veya bordu uygun filtreleme yaparak seçeriz. Bu tabloda Giriş/Çıkış sayısı,
işlemci özellikleri, bellek boyutu, kullanılan çevre birimleri göz önünde bulundurulacak seçim
yapma ve filtreleme imkanı sunar.
Ana Menü STM32Cube MX bileşenlerini ve menülerini içerir. File, Project, Pinout, window, Help
(Toolbar menüsü), MCU Chip, Pinout alt menüsü, clock confîguration, Configuratian ve Power
consumption Calculator menülerini içerir.
1. File Menüsü:
a] Ne w Project sekmesi ve ikonu: Yeni proje açına işlemi. Tüm İşlemcilerin ve bordların
listesini görüntüler.
c) İmport Project sekmesi: Proje alma işlemi. Önceden yapılandırılmış dosyayı yeni
pencerede açmak, yüklemek için kullanılır.

10
d) Save Project As sekmesi ve ikonu: Projeyi farklı kaydetme işlemi. Oluşturduğumuz bir
projeyi tüm ayarlarıyla (Pinout, Clocktree, IP, PCC) kayıt eder. Bunu ioc’ uzantılı bir dosya
oluşturarak yapar.
e) Save Project sekmesi ve ikonu: Proje kaydetme işlemi yapar. Mevcut projeyi kayıt eder.
f) Close Project sekmesi: Projeyi kapatma işlemi. O an açık olan projeyi kapatır.
g) Recent Projects sekmesi: Daha önceden açılmış, kaydedilmiş son 5 projeyi listeler.
h) Exit sekmesi: Projeden çıkış işlemi. Açık olan projeyi kapatır ve çıkar.
2. Project Menüsü ve ikonu: Üç adet alt sekmesi bulunmaktadır.
Generate code, Generate Report, Settings.
a) Generate Code sekmesi ve ikonu: Kod üretme işlemi. Bu sekme açılınca 3 alt tablo
görüntülenir.
Project Tablosu
Code Generator tablosu
3. Advanced Settİng Tablosu
a) Project Tablosu: Proje ayar tablosudur.
Proiect Name: Projemize isim verebileceğimiz bölümdür.

Project Location: Projemizi bilgisayarımıza kayıt edeceğimiz dosya ve directory yerini gösterir.
Toolchain Folder Location: Dosyamızın kayıt edileceği tüm yeri görüntüler. Toolchain/IDE: Üçüncü
parti yazılım ara yüzünü seçeceğimiz bölümdür. Biz burada kullanacağız.

STM İÇİN SYSTEM WORKBENCH (SW4STM) VE STM32CUBEMX

SW4STM32 olarak adlandırılan System Workbench araç zinciri (tool chain), tüm STM32 mikro
denetleyicilerini ve ilgili kartları destekleyen Eclipse tabanlı ücretsiz çoklu işletim sistemi yazılım
geliştirme ortamıdır.

SW4STM32 araç seti forumlar, bloglar ve teknik destek için eğitimler içeren www.openstm32.org
web sitesinden edinilebilir. Bu siteye kayıt olduktan sonra, kullanıcılar ücretsiz araç zincirinin
indirilmesine devam etmek için menülerden System Workbench for STM32 sayfasında kurulum
talimatlarını izleyerek indirme ve kurma işlemi yapılabilir.

11
System Workbench araç zinciri ve birlikte çalıştığı web sitesi, gömülü sistemlerde eğitim ve
danışmanlık hizmeti veren bir hizmet şirketi olan AC6 tarafından kurulmuştur. Bu ürün, ST
firmasına bağlı olmayan üçüncü bir taraf bir kuruluş tarafından verilmektedir. Yazılım geliştirme
özellikleri ile ilgili en son bilgiler için ilgili kuruluşun web sitesine bakın: www.ac6.fr.

System Workbench for STM32 (SW4STM) Yazılımı Temel Özellikleri


STM32 mikro denetleyicileri, STM32 Nucleo kartları, Discovery kitleri ve Değerlendirme kartları ve
STM32 ürünleri (Standard Peripheral library veya STM32Cube HAL) için kapsamlı destek
sağlamaktadır Bunlar;
 GCC C / C ++ derleyicisi
 GDB tabanlı hata ayıklayıcı
 Ekip çalışması yönetimi ile Eclipse IDE
 Eclipse eklentileri ile uyumlu
 ST-LINK desteği
 Kod boyutu sınırı yok
 Çoklu işletim sistemi desteği: Windows ® , Linux ve OS X ®
 İndirme Linki: http://www.ac6-tools.com/downloads/SW4STM32/install_sw4stm32_win_64bits-
v2.4.exe

STM32CubeMX

StmCube programını http://www.st.com/en/development-tools/stm32cubemx.html bağlantısından


indirin ve kurun. İndirme işlemi için oturum açmanız gerekebilir. StmCubeMx kurulduktan sonra,
çalışmak istediğiniz her stm32 serisi için MCU yazılım paketleri yüklemeniz gerekir. StmCubeMx
ve stm32 serisi paketler iki farklı şeydir. Her stm32 serisi paketi ayrı olarak kurulmalıdır. Ayrıca,
StmCubeMx yazılımında MCU seri paketlerini kurmak için Help -> Manage Embedded Software
Packages adımlarını tıklayarak Stm32f103’ten başlayacağımız için stm32f1 serisi için paketi
yüklemeliyiz. Aşağıdaki resimleri paketlerin kurulumu hakkında bir yok göstermektedir.

12
Stm32f103C8 geliştirme kartı bitirme projesinde kullanılacaktır.

13
Mevcut deney kartımız port-c pin #2'e bağlı bir led'e sahiptir. İlk uygulamamızda bir led yakma
işlemi yapacağız. Stm32 mikro denetleyici tek bir pin üzerinde çok sayıda özellik sunar. Bunun
için birini seçmek ve diğerlerini devre dışı bırakmak gerekir ve bunun için dikkatli olunmalıdır.
Stm32 mikro denetleyiciler I / O pinleri beş modda kullanılabilir. Bunlar;
 Giriş modu
 Analog mod
 Çıktı modu
 Alternatif fonksiyon modu
 Harici kesme / olay hatları
Amacımız için çıkış olarak port-c pin 2'yi kullanacağız. Hemen hemen tüm stm32 pinleri, içten Pull
Up ve Pull Down dirençlerine sahiptir. GPIO'yu giriş modunda kullanmadığımız için Pull Up ve Pull
Down dirençler kullanmıyoruz. STM32 pinleri farklı frekanslarda çalışabilir, istediğimiz pini düşük
frekansta çalıştırabiliriz. Stm32 pinleri önyüklemeden sonra düşük veya yüksek olarak
başlatılabilir. 2 no'lu ucu yüksek yapalım.

Not: Mikrodenetleyici için harici 8Mhz RC osilatörünü kullanacağız

STM32CubeMX’de yeni proje oluşturma

Yeni bir proje oluşturmak çok basittir. File > New Project adımlarını uygulayın. Mikrodenetleyici
serilerini ve paketini seçmek için bir pencere belirecektir. Paketi seçtikten sonra, projeniz için
kullandığınız mikro denetleyiciyi tıklayın. Kullandığımız işlemcimiz STM32F103R8Tx’dir.

14
Şekil. StmCubeMx yeni Proje oluşturma işlemi

Şekil Mikrokontroller paket trendi (Kaynak:


https://img.ozdisan.com/content/library/IC_Packages.pdf)

Mikrodenetleyici olarak STM32F103R8Tx'i seçtikten sonra mcu diyagramını içeren bir pencere
açılacaktır. Buradan RCC olarak harici osilatör seçilir ve SYS sekmesi altından Timebase Source
15
SysTick seçilir. Daha sonra işlemci görüntüsü üzerinden C2 numaralı pini tıklayarak ve GPIO çıktı
olarak ayarlanır.

Aşağıdaki tabloda MCU yapılandırmada kullanılan saat/zamanlama için kullanılan kısaltmalar


bulunmaktadır.

Kısaltma Tanımı
Yüksek Hız İç osilatör: sıfırlamadan sonra etkin, HSE'DEN daha düşük
HSI
doğruluk:
HSE Yüksek Hız Harici osilatör: harici bir saat devresi gerektirir.
Faz Kilitli Döngüsü: Yukarıdaki saat kaynaklarından çarpmak için
PLL
kullanılır.

16
Düşük Hız Dahili saat: düşük güç saatleri genellikle bekçi zamanlayıcılar
LSI
(Watchdog) için kullanılır
LSE Düşük Hız Harici saat: Harici bir saatle çalışır.
SYSCLK Sistem saati
HCLK Dahili AHB saat frekansı
FCLK Cortex serbest çalışan saat
AHB Gelişmiş Yüksek Performanslı Veri Yolu
APB1 Düşük Hız Gelişmiş Çevresel Veri Yolu
APB2 Yüksek Hızlı Gelişmiş Çevresel Veri Yolu

Şekil. STM32F103R8Tx MCU pin yapılandırma işlemi

GPIO'yu yapılandırmak için yapılandırma sekmesini ve ardından GPIO düğmesini tıklayın.

17
SAAT (ZAMANLAMA) KONFİGÜRASYON İŞLEMLERİ (CLOCK CONFIGURATION)

Yüksek hızlı saat, CPU gibi yüksek hızlı cihazlar için kullanılır ve düşük hız saati, çevre birimleri
gibi düşük hızlı cihazlar için kullanılır. Bu saat modu, düşük güç tüketen işlemleri gerçekleştirmek
için kullanılır. Düşük güç gereksinimi nedeniyle, STM32 mikro denetleyicisinin her modülü saatleri
bağımsız olarak kullanır.

Bu yüzden, bir çevre birimini kullandığımızda öncelikle saatini etkinleştirmeliyiz. Aksi takdirde, işe
yaramaz. Genel olarak, gömülü bir sistem çalışmaya başlamadan önce başlatılmalıdır. Gömülü
sistem başlatmada sistem kurulmalıdır. Saat kaynağı, saat ayarında dikkate alınmalı ve PLL de
dikkate alınmalıdır. Ardından dahili veri yolu, harici veri yolu ve çevre birimleri saati ayarlanmalıdır.
Saat ayarı akış şeması aşağıdaki şekilde gösterilmektedir.

Enable HSE clock

Set up AHB clock according to the


system clock RCC_HCLKConfig

Set up APB2 clock according to


AHB clock RCC_HCLK2Config

Set up APB1 clock according to


AHB clock
RCC_HCLK1Config

Select HIS, HSE or PLL as the system


Set up system clock
clock

Enable peripherals RCC_AHBPeriphClockCmd

STM32F103'ün sıfırlama ve saat ayarı 10 kayıt tutucu (Register) içerir: Bunlar şunlardır;
1. Reset and Clock control register (RCC_CR)
2. Clock configuration register (RCC_CFGR)
3. Clock interrupt register (RCC_CIR)
4. APB2 peripheral reset register (RCC_APB2RSTR)

18
5. APB1 peripheral reset register (RCC_APB1RSTR)
6. AHB Peripheral Clock enable register (RCC_AHBENR)
7. APB2 peripheral clock enable register(RCC_APB2ENR)
8. APB1 peripheral clock enable register(RCC_APB1ENR)
9. Backup domain control register (RCC_BDCR)
10. Control/status register (RCC_CSR)

Sıfırlama ve Saat Konfigüsrasyon Kayıtları (Reset and Clock Configuration Registers, RCC)

Saat (zaman) yapılandırması RCC (Sıfırlama ve Saat Yapılandırması) ile başlar. Üretici, yazılım
kütüphanesinde (firmware library) RCC kayıt tutucuları (registers) RCC_TypeDef yapısı
kullanılarak tanımlar.

STM32CubeMX Saat ağacı yapılandırma işlevleri

STM32CubeMX’de oluşturulan projede harici saat kaynakları (HSE) kullanıldığında, kullanıcı


önceden RCC çevrebirimi altında bulunan Pinout görünümünden etkinleştirmelidir.

Çevre Birimleri Saat Yapılandırma Seçenekleri (Clock Configuration)

19
Program içerisinde saat çevre birimlerine karşılık gelen diğer bazı yollar gri renkte görüntüler. Aktif
hale gelmek için çevresel Pinout görünümünde (ör. USB) doğru şekilde yapılandırılmış olmalıdır.
Bu görünüm şunları sağlar:
• İşlemci Saati (HCLK), veri yolu veya çevre saatleri için bir frekans değeri girin
STM32CubeMX, ön sıkıştırıcıları ve bölücüleri ayarlarken ve diğer çevresel kısıtlamaları (USB
saati minimum değeri gibi) dikkate alarak istenen frekansa erişen bir saat ağacı yapılandırması
önermeye çalışır. Herhangi bir çözüm bulunamazsa, STM32CubeMX farklı bir saat kaynağına
geçmeyi önerir veya istenen frekansı hiçbir çözümün eşleştirmediği sonucuna bile varabilir.

• Sistem saatini sürecek saat kaynağını seçin (SYSCLK)


- Kullanıcı tanımlı frekans için harici osilatör saati (HSE).
- Tanımlanan sabit frekans için iç osilatör saati (HSI).
- Ana PLL saati
• İkincil kaynakları seçin (ürün için mevcut olduğu gibi)
- Düşük hızlı dahili (LSI) veya harici (LSE) saat
- I2S giriş saati
• Prescaler, bölücü ve çarpanlar değerlerini seçin.
MCU tarafından desteklendiğinde HSE üzerindeki Saat Güvenlik sistemi (CSS) etkinleştirin
Bu özellik yalnızca HSE saati PLL aracılığıyla doğrudan veya dolaylı olarak sistem saati kaynağı
olarak kullanıldığında kullanılabilir. Bu durum HSE arızasının tespit edilmesine ve yazılım
hakkında bilgi verilmesine, böylece MCU'nun kurtarma işlemlerini gerçekleştirmesine izin verir.

• MCU tarafından desteklendiğinde LSE'de CSS'yi etkinleştirin


Bu özellik yalnızca LSE ve LSI etkinleştirildiğinde ve RTC veya LCD saat kaynakları LSE veya LSI
olarak seçildikten sonra kullanılabilir.

• Saat ağacı varsayılan ayarlarını araç çubuğunun Sıfırla düğmesini () kullanarak sıfırlayın:
Bu özellik STM32CubeMX varsayılan saat ağacı yapılandırmasını yeniden yükler.

• Araç çubuğunu kullanarak kullanıcı yapılandırma adımlarını geri al / Yinele düğmeleri kullanılarak
yapılabilir.

20
• Yapılandırma sorunlarını algılama ve çözme
Hatalı saat ağacı yapılandırmaları, kod üretmeden önce algılanır. Hatalar şunlar:
kırmızı renkte vurgulanır ve Saat Yapılandırma görünümü kırmızı bir renkle işaretlenir.

Resolve Clock Issues, Saat Sorununu Çöz ü tıklayarak sorunlar manuel veya otomatik olarak
çözülebilir.

Bu düğme yalnızca sorun tespit edildiğinde etkinleşir.


Altta yatan çözüm süreci belirli bir sırayı izlemektedir:
a) HSE frekansını maksimum değere ayarlama (isteğe bağlı).
b) HCLK frekansını, ardından periferik frekansları maksimum veya minimuma ayarlama
değeri (isteğe bağlı).
c) Çoklayıcı girişlerini değiştirme (isteğe bağlı).
d) Sonunda, sorunu çözmek için çarpan / bölücüler değerleriyle yineleme. Saat ağacı
bir çözüm bulursanız, kırmızı renkte silinirse vurgulanır. Aksi takdirde bir hata mesajı
Görüntülenir.
Not: Pin ağacı görünümünde RCC yapılandırmasında saat ağacından erişilebilir olmak için harici
saatler, I2S giriş saati ve ana saatler etkinleştirilir.

21
Aşağıdaki şekilde projemizde kullanacağımız örnek bir yapılandır verilmiştir.
Bunlar:
PLL Source Mux: HSE
System Clock Mux: PLLCLK
PLLMul: x4 ayarlandığında harici zaman darbe kaynağı seçilmiş ve çevre birimleri hızları 32 MHz
olarak ayarlanmıştır.

Bu işlemden sonra “Configuration” Yapılandırma sekmesi seçilir ve buradan MCU ile ilgili
yapılandırmalar yapılabilir. Buradan GPIO tıklanır.

22
Stm32cubemx GPIO Yapılandırması

GPIO sekmesi altında önceden tanımlamış olduğumu port-c pin 2 GPIO çıkış seviyesi (GPIO
Output Level) Low (düşük) ve GPIO Mode Output Push-Pull, Maksimum output Speed ise High
(Yüksek) seçilir. GPIO etiketine bir isim verilir örneğin “LAMBA” daha sonra uygula butonuna
basın. İşlem kod üretmek için hazır.

23
24
1. GPIO FONKSİYON TANIMLARI
STM32F103 mikrodenetleyicisinde GPIO biriminde; 2 adet 32 bitlik port konfigürasyon kayıt
tutucusu (GPIOx_CRL, GPIOx_CRH), 2 adet 32 bitlil data kayıt edicisi(GPIOx_IDR,
GPIOx_ODR), 1 adet 32 bitlik set-reset kayıt edicisi(GPIOx_BSRR), 1 adet 16 bit reset kayıt
edicisi(GPIOx_BRR), 1 adet 32 bit locking kayıt edicisi(GPIOx_LCKR) bulunmaktadır.
Ayrıca; her bir giriş çıkış pini 7 farklı modda kontrol edilebilmektkedir.
 Input floating: Pini giriş olarak ayarlayıp, dışarıdan hiçbir değer gelmediğinde pin girişinde belirli
bir gerilim bulunmaz. Çok hassas sensör devrelerinde veya güç tüketiminin önemli olduğu
devrelerde kullanılır. Dijital sinyallerde, en ufak gürültüden bile etkilenerek, pin girişini high ya da
low yapabilir. Normal uygulamalarda genellikle tercih edilmez.
 Input pull-up: Giriş olarak ayarlanan pinden herhangi bir sinyal gelmediğinde, girişi High
seviyesinde tutar.
 Input pull-down: Giriş olarak ayarlanan pinden herhangi bir sinyal gelmediğinde, girişi Low
seviyesinde tutar.
 Analog: Pinin analog sinyalleri işlemesi için kullanılır.
 Output open-drain: Pinin çıkış bacağı, P-Mos ile N-Mos mosfetleri arasında bulunmaktadır. Eğer
çıkışı open-drain ayarlarsanız, pin bacağı GND'ye bağlanır. VDD ile arasında sonsuz empedans
oluşur. Bu durumda pini high olarak çıkış vermek için dışarıdan pull-up dirençleri eklemeniz
gerekmekte. Bu özellikle, çıkışa bağlanacak olan devre elemanının daha fazla akım çekmesi
sağlanabilmektedir. Röle gibi akım gerektiren devre elemanlarını sürmek için kullanılır. Akım
mikroişlemciden değil, pull-up direnci üzerinden çekilir.
 Output push-pull: Pin bacağı P-Mos mosfeti ile VDD pinine bağlanır. Akım gerektirmeyen
işlemlerde, çıkışı logik 1 yapmak için bu mod kullanılır.
 Alternate function push-pull: Pinin diğer özelliklerini mikroişlemci içerisinden lojik 1 veya lojik 0
olarak ayarlanarak kullanılmasını sağlar.
 Alternate function open-drain: Pinin diğer özelliklerini, dışarıdan push pull direnci eklenerek
kullanılması sağlanır.

25
Şekil. Standart I/O port bitlerinin temel yapısı (RM0008 Reference manual, P:159)

STM32CubeMX ile Proje Kodlarını Üretmek

Yapmış olduğumuz yapılandırmanın proje kodunu üretmek üretmek için dişli çark simgesini
tıklayın.

Dişli simgesini tıkladıktan sonra bir pencere görüntülenir. Projeye isim verin ve proje dosyaları için
yeri seçin. Projenin yazılım geliştirme kısmında SW4STM32 kullandığımızdan ToolChain / IDE'de
SW4STM32 IDE arabirimini seçin. Kodu oluşturmak için Tamam'ı tıklayın.

26
27
Tüm ayarlar ve kod sizin belirlediğiniz yerde oluşturulduktan sonra Tamam'ı tıklayın.

Daha sonra menülerden “Generate source codes based on user settings” simgesi tıklarak proje
kodlarının oluşturulması sağlanır.

28
Open Project’i tıklayarak yapmış olduğumuz konfigürasyonun AC6 yani SW4STM32 IDE
arayüzünde açılması sağlanmış oldu. Programım gezinti bölmesinde aşağıdaki gibi bir dosya

yapısı karşımıza gelir.

Bundan sonra yapılacak olan işlem bazı konfigürasyonları yapılmasıdır. Bunun için proje sağ
tıklanır ve özelliklerden ,

29
30
31
32
33
APPLY - RUN butonları tıklandıktan sonra program MCU içerisine atılır ve Console aşağıdaki
mesajı verir.

Tanımlamış olduğumuz GPIO çıkış LAMBA etiketi Inc klasörü altında main.h dosyası
içerisindedir.

34
35
SAAT (DARBE) SİNYALLERİ KONFİGÜRASYONU (CLOCK CONFIGURATION)
Sistem saatini (SYSCLK) sürmek için üç farklı saat kaynağı kullanılabilir. Bunlar;
• HSI osilatör saati
• HSE osilatör saati
• PLL saati
Aşağıdaki iki adet ikincil saat kaynağı kullanılmaktadır.
1. Bağımsız bekçi sürücüyü (Watchdog) çalıştıran ve isteğe bağlı olarak Dur / Bekleme
(Stop/Standby) modundan Otomatik Uyandırma (Auto-wakeup) için kullanılan RTC’yi
çalıştıran 40 kHz düşük hızlı dahili RC (LSI RC).
2. İsteğe bağlı olarak gerçek zamanlı saati (RTCCLK) tahrik eden 32.768 kHz düşük hızlı
harici kristal (LSE kristali).
Her bir saat kaynağı, kullanılmadığında, güç tüketimini optimize etmek için bağımsız olarak
açılabilir veya kapatılabilir

Zamanlayıcı saat frekansları donanım tarafından otomatik olarak sabitlenir. İki durum var:
1. APB ön bölücüsü 1 ise, zamanlayıcı saat frekansları, zamanlayıcıların bağlı olduğu APB
alanınınki ile aynı frekansta ayarlanır.
2. aksi takdirde, zamanlayıcıların bağlı olduğu APB alanının frekansı iki katına (× 2) ayarlanır.
FCLK, Cortex®-M3'ün serbest çalışan saati gibi davranır.

HSE Harici Saat Sinyali

HSE hızlı harici saat sinyali (HSE), olası iki saat kaynağından oluşturulabilir:
• HSE dış kristal / seramik rezonatör
• HSE kullanıcı harici saat kaynağı
Rezonatör ve yük kondansatörleri, çıkış bozulmasını ve başlatma stabilizasyon süresini en aza
indirgemek için osilatör pimlerine olabildiğince yakın yerleştirilmelidir. Yükleme kapasitesi
değerleri seçilen osilatöre göre ayarlanmalıdır.

Harici kaynak (HSE bypass)


Bu modda harici bir saat kaynağı sağlanmalıdır. 25 MHz'e kadar bir frekans olabilir. Saat kontrol
kaydındaki (RCC_CR) HSEBYP ve HSEON bitlerini ayarlayarak bu modu seçebilirsiniz. ~% 50
görev döngüsüne sahip harici saat sinyali (kare, sinüs veya üçgen) OSC_IN pimini sürmek
zorundayken OSC_OUT pini hi-Z'den ayrılmalıdır

36
Dış kristal / seramik rezonatör (HSE kristali)
4 ila 16 MHz harici osilatör, ana saatte çok doğru bir sinyal oranı üretme avantajına sahiptir. İlişkili
donanım konfigürasyonu Saat kontrol kayıtındaki (RCC_CR) HSERDY bayrağı, yüksek hızlı harici
osilatörün kararlı olup olmadığını gösterir. Başlangıçta, saat bu bit donanım tarafından
ayarlanıncaya kadar serbest bırakılmaz. Saat kesme kaydında (RCC_CIR) etkinleştirilmişse bir
kesme üretilebilir. HSE Kristali, Saat kontrol kaydındaki (RCC_CR) HSEON bitini kullanarak
açılabilir ve kapatılabilir.

HSI saat
HSI saat sinyali bir dahili 8 MHz RC Osilatöründen üretilir ve doğrudan bir sistem saati olarak
kullanılabilir veya PLL girişi olarak kullanılacak 2'ye bölünebilir. HSI RC osilatörünün düşük
maliyetli bir saat kaynağı (harici bileşenler yok) sağlama avantajı vardır. Ayrıca, HSE kristal
osilatöründen daha hızlı başlatma süresine sahiptir, ancak kalibre etme ile bile frekans, harici bir
kristal osilatör veya seramik rezonatörden daha az doğrudur.

Kalibrasyon
RC osilatör frekansı üretim işlemindeki farklılıklardan dolayı bir çipten diğerine değişebilir, bu
nedenle her cihaz AT = 25 ° C'de% 1 doğruluk için ST tarafından fabrika ayarlı kalır. Sıfırlamadan
sonra, fabrika ayar değeri, Saat kontrol kaydındaki (RCC_CR) HSICAL [7: 0] bitlerine yüklenir.
Uygulama voltaja veya sıcaklığa bağlı olarak değişirse, RC osilatör hızını etkileyebilir. Clock
control register (RCC_CR) içindeki HSITRIM [4: 0] bitlerini kullanarak uygulamadaki HSI
frekansını değiştirebilirsiniz.

Saat denetim registerındaki (RCC_CR) HSIRDY bayrağı, HSI RC'nin kararlı olup olmadığını
gösterir. Başlangıçta, bu bit donanım tarafından ayarlanıncaya kadar HSI RC çıkış saati serbest
bırakılmaz. HSI RC, Saat kontrol kaydındaki (RCC_CR) HSION biti kullanılarak açılabilir veya
kapatılabilir. HSE kristal osilatörü başarısız olursa, HSI sinyali yedek bir kaynak (Yardımcı saat)
olarak da kullanılabilir.

PLL
Dahili PLL, HSI RC çıkışını veya HSE kristal çıkış saat frekansını çarpmak için kullanılır. Saat
denetim kaydı (RCC_CR). PLL yapılandırması (HSI osilatörünün 2'ye bölünmesi veya PLL giriş
saati için HSE osilatörü ve çarpım faktörü seçimi), PLL'yi etkinleştirmeden önce yapılmalıdır. PLL

37
etkinleştirildikten sonra, bu parametreler değiştirilemez. Saat kesme kaydında (RCC_CIR)
etkinleştirildiğinde PLL hazır olduğunda bir kesme üretilir. Uygulamada USB arabirimi
kullanılıyorsa, PLL 48 veya 72 MHz çıkışına programlanmalıdır. 48 MHz USBCLK sağlamak için
gereklidir.

LSE saati
LSE kristali 32.768 kHz Düşük Hız Dış kristal veya seramik rezonatördür. Saat / takvim veya diğer
zamanlama işlevleri için gerçek zamanlı saat çevre birimine (RTC) düşük güç ancak yüksek
hassasiyette bir saat kaynağı sağlayan bir avantaja sahiptir. LSE kristali, Yedek etki alanı denetim
kaydı (RCC_BDCR) içindeki LSEON bitini kullanarak açılır ve kapanır. Yedek etki alanı denetim
kaydı (RCC_BDCR) içindeki LSERDY bayrağı, LSE kristalinin kararlı olup olmadığını gösterir.
Başlangıçta, bu bit donanım tarafından ayarlanana kadar LSE kristal çıkış saati sinyali serbest
bırakılmaz. Saat kesme kaydında (RCC_CIR) etkinleştirilmişse bir kesme üretilebilir.

Harici kaynak (LSE bypass)


Bu modda harici bir saat kaynağı sağlanmalıdır. 1 MHz'e kadar bir frekansa sahip olabilir. Bu
modu, Yedek etki alanı denetim kaydı (RCC_BDCR) içindeki LSEBYP ve LSEON bitlerini
ayarlayarak seçin. ~% 50 görev döngüsüne sahip harici saat sinyali (kare, sinüs veya üçgen)
OSC32_IN pimini sürmek zorundayken OSC32_OUT pimi Hi-Z'den ayrılmalıdır. Şekil 9'a bakınız.

LSI saat
LSI RC, bağımsız bekçi köpeği (Watchdog) (IWDG) ve Otomatik uyandırma ünitesi (AWU) için
Durdurma ve Bekleme modunda çalışmaya devam edebilen düşük güçte bir saat kaynağı gibi
davranır. Saat frekansı 40 kHz civarındadır (30 kHz ila 60 kHz arasında). LSI RC Kontrol / durum
kaydındaki LSION bitini (RCC_CSR) kullanarak açıp kapatabilir. Kontrol / durum kaydedicideki
(RCC_CSR) LSIRDY bayrağı, düşük hızlı dahili osilatörün kararlı olup olmadığını gösterir.
Başlangıçta, saat bu bit donanım tarafından ayarlanıncaya kadar serbest bırakılmaz. Saat kesme
kaydında (RCC_CIR) etkinleştirilmişse bir kesme üretilebilir.

Not: LSI kalibrasyonu yalnızca yüksek yoğunluklu, XL yoğunluklu ve bağlantı hatlı cihazlarda
mevcuttur.

38
LSI kalibrasyonu
Düşük Hızlı Dahili RC (LSI) osilatörünün frekans dağılımı, doğru bir RTC zaman aralığı ve / veya
IWDG zaman aşımı süresine (LSI bu çevre birimleri için saat kaynağı olarak kullanıldığında) kabul
edilebilir bir doğrulukta kalacak şekilde kalibre edilebilir.
Bu kalibrasyon LSI saat frekansını TIM5 giriş saatine (TIM5CLK) göre ölçerek yapılır. HSE
osilatörünün hassasiyetinde yapılan bu ölçüm uyarınca yazılım doğru bir zaman aralığı elde etmek
için RTC'nin programlanabilir 20 bitlik ön yükleyiciyi ayarlayabilir veya doğru IWDG zaman aşımı
hesaplayabilir.

LSI'yı kalibre etmek için aşağıdaki yordamı kullanın:


1. TIM5 zamanlayıcıyı etkinleştirin ve giriş yakalama modunda kanal4'ü yapılandırın.
2. LSI saatini kalibrasyon amacıyla TIM5 kanal4 giriş yakalama işlemine dahili olarak bağlamak
için AFIO_MAPR kaydındaki TIM5CH4_IREMAP bitini ayarlayın.
3. TIM5 Capture / compare 4 olayı veya kesme işlemini kullanarak LSI saat frekansını ölçün.
4. İstenilen zaman tabanına ve / veya IWDG zaman aşımını hesaplamak için RTC'nin 20 bit ön
ölçekleyici güncellemek için ölçülen LSI frekansını kullanın.

Sistem Saati (SYSCLK) Seçimi


Sistem sıfırlandıktan sonra, HSI osilatörü sistem saati olarak seçilir. Bir saat kaynağı doğrudan
veya sistem saati olarak PLL aracılığıyla kullanıldığında durdurulması mümkün değildir. Bir saat
kaynağından diğerine geçiş, ancak hedef saat kaynağı hazır olduğunda (başlatma gecikmesinden
sonra saat sabit veya PLL kilitli) gerçekleşir. Henüz hazır olmayan bir saat kaynağı seçilirse, saat
kaynağı hazır olduğunda aktif olur. Saat kontrol kaydındaki (RCC_CR) durum bitleri, hangi
saatlerin hazır olduğunu ve hangi saatin şu an sistem saati olarak kullanıldığını gösterir.

Saat Güvenlik Sistemi (CSS)


Saat Güvenlik Sistemi yazılımı ile etkinleştirilebilir. Bu durumda, saat dedektörü HSE osilatörü
başlatma gecikmesinden sonra etkinleştirilir ve osilatör durduğunda devre dışı bırakılır. HSE
saatinde bir hata tespit edilirse, HSE osilatörü otomatik olarak devre dışı bırakılır, gelişmiş kontrol
zamanlayıcılarının (TIM1 ve TIM8) kesme girişine bir saat arızası olayı gönderilir ve yazılımı arıza
hakkında bilgilendirmek için bir kesme oluşur (Saat Güvenlik Sistemi Kesme CSSI), MCU'nun
kurtarma işlemlerini gerçekleştirmesine izin verir. CSSI Cortex®-M3 NMI (Maskelemesiz Kesme)
özel durum vektörüyle bağlantılıdır.

39
Not: CSS etkinleştirildikten ve HSE saati başarısız olursa, CSS kesmesi oluşur ve bir NMI otomatik
olarak oluşturulur. NMI, CSS kesme bekleyen biti temizlenmedikçe süresiz olarak yürütülecektir.
Sonuç olarak, NMI ISR kullanıcısı CSSc bitini Saat kesme kaydında (RCC_CIR) ayarlayarak CSS
kesmesini silmelidir.
HSE osilatörü, sistem saati olarak doğrudan veya dolaylı olarak kullanılırsa (dolaylı olarak PLL
giriş saati olarak kullanılırsa ve PLL saati sistem saati olarak kullanılırsa), tespit edilen bir arıza
sistem saatinin HSI osilatörüne geçmesine neden olur ve HSE osilatörünün devre dışı bırakılması.
HSE saati (bölünmüş veya bölünmemiş) hata oluştuğunda sistem saati olarak kullanılan PLL'nin
saat girişi ise, PLL de devre dışı bırakılmıştır.

RTC saati
RTCCLK saat kaynağı, HSE / 128, LSE veya LSI saatleri olabilir. Bu, Yedek etki alanı kontrol
kaydındaki (RCC_BDCR) RTCSEL [1: 0] bitlerinin programlanmasıyla seçilir. Bu seçim,
Yedekleme alanını sıfırlamadan değiştirilemez. LSE saati Yedekleme alanındayken, HSE ve LSI
saatleri geçerli değil.
Sonuç olarak:
• Eğer LSE RTC saati olarak seçilirse:
- RTC, VDD beslemesi kapalı olsa bile VBAT beslemesi korunurken çalışmaya devam eder.
• Otomatik Uyandırma ünitesi (AWU) saati olarak LSI seçilirse:
- VDD beslemesi kapalıysa, AWU durumu garanti edilemez. LSI kalibrasyonu hakkında daha
fazla ayrıntı için Kısım 7.2.5: LSI saatine bakın.
• RTC saati olarak bölünen HSE saati 128 ise:
- VDD beslemesi kapalıysa veya dahili voltaj regülatörü kapalıysa (1.8 V alanından güç
çıkartırken) RTC durumu garanti edilemez.
- Güç denetleyicisinde DPB biti (yedek etki alanı yazma korumasını devre dışı bırak)
kayıt 1'e ayarlanmalıdır (bkz. Kısım 5.4.1: Güç kontrol kaydı
(PWR_CR)).
Bağımsız bekçi köpeği (Watchdog) saati
Bağımsız bekçi köpeği (IWDG) donanım seçeneği veya yazılım erişimi vasıtasıyla başlatılıyorsa,
LSI osilatörü açık durumdadır ve devre dışı bırakılamaz. LSI osilatörü geçicileştirildikten sonra
saat IWDG'ye verilir.
Saat Çıkış Yeteneği

40
Mikrodenetleyici saat çıkışı (MCO) kapasitesi, saatin harici MCO pimine çıkışına izin verir. İlgili
GPIO portunun konfigürasyon kayıtları, alternatif fonksiyon modunda programlanmalıdır. MCO
saati olarak 4 saat sinyalinden biri seçilebilir.
• SYSCLK
• HSI
• HSE
• PLL saati 2'ye bölünür Seçim, Saat yapılandırma kaydının (RCC_CFGR) MCO [2: 0] bitleri
tarafından kontrol edilir

RCC kayıtları (Registers) Saat Kontrol Kaydı (RCC_CR)


Referans Kitabı sayfa 98.
Adres ofseti: 0x00
Reset değer : 0x0000 XX83 Burada X tanımsız demektir.

Bit 17 HSERDY: Harici yüksek hızlı saat hazır bayrağı Donanım tarafından, HSE osilatörünün
kararlı olduğunu belirtmek için ayarlanır. Bu bit, HSEON sıfırlamasından sonra düşen kenar için
HSE osilatör saatinin 6 çevrimine ihtiyaç duyar.
0: HSE osilatörü hazır değil
1: HSE osilatörü hazır

Bit 16 HSEON: HSE saat etkinleştirmesi Yazılım tarafından ayarlanır ve silinir.


Durdur veya Bekleme moduna girerken HSE osilatörünü durdurmak için donanım tarafından
silinir. Bu bit, HSE osilatörü sistem saati olarak doğrudan veya dolaylı olarak kullanıldığında
sıfırlanamaz.
0: HSE osilatörü KAPALI
1: HSE osilatörü AÇIK

ÖRNEK :

41
RCC->CR |= 0x00030000; //HSEON=1 16. Ve 17. Bitler set edildi
while(!(RCC->CR & 0x00020000)); //Harici osilatörün stabil olması için
bekleniliyor(6 komut çevrimi)
RCC->CIR |= 0x00080000; //HSERDYC: HSE ready interrupt cleared
RCC->CR |= 0x00080000; //Clock security system Enabled.
RCC->CIR |= 0x00800000; //CSSC: Clock security system interrupt cleared.
// RCC->CR |= 0x00040000; //HSE bypassed. Kullanmadık
RCC->CFGR |= 0x00000080; //AHB configuration -> 1000: SYSCLK divided by 2
RCC->CFGR |= 0x00002000; //APB2 configuration -> 100: HCLK divided by 2
RCC->APB2ENR |= 0x1C; //PORT C,A,B Clock Enabled.

Uygulmamda portB yi kullanmadım ve bunu gereksiz yere aktif ettiğim için fazladan güç tüketimi
oluşacaktır. Birde eğer benim işimi 2MHz bir hız işimi görebilecekken ben 8MHz ile çalışma
yaparsam yine gereksiz yere fazladan güç tüketimi oluşacaktır.

Clock configuration register (RCC_CFGR)


Address offset: 0x04
Reset value: 0x0000 0000
Access: 0 ≤ wait state ≤ 2, word, half-word and byte access
1 or 2 wait states inserted only if the access occurs during clock source switch

42
Kayıtlar (Regısters) İle Saat Konfigürasyonu Örnek Yazılım
#include "stm32f1xx.h"
void Delay(__IO uint32_t nCount);
void led_kontrol(void);
void led_kontrol_1(void);
void buton_kontrol(void);
char Buton = 0;
int main(void)
{
RCC->CR = 0x30000; // //HSEON=1 16. ve 17. bitler 1
while(!(RCC->CR & 0x20000));//Harici osilatörün stabil olması için bekleniliyor(6 komut çevrimi)
RCC->CR |= 0x00080000; //Clock security system aktif hale getirildi.
// RCC->CR |= 0x00040000; //HSE bypass edildi. Burada kullanmadık
RCC->CFGR |= 0x00040000; // 18. bit= 1: PLL input clock x 3 24 Mhz
RCC->CFGR |= 0x00010000; // Bit 16=1: HSE oscillator clock selected as PLL input clock
RCC->CFGR |= 0x00000080; //AHB configuration -> 1000: SYSCLK 2 ye bölünde AHB 12 Mhz
RCC->CFGR |= 0x00002000; //APB2 configuration -> 100: HCLK 2 73 bölünde APB2 6 Mhz
RCC->CIR |= 0x00080000; //HSERDYC: HSE hazır interrupt temizlendi
RCC->CIR |= 0x00800000; //CSSC: Clock security system interrupt temizlendi.
RCC->APB2ENR |= 0x1C; //PORT C,A,B Clock Enabled. Uygulmamda portB yi kullanmadım ve bunu gereksiz yere
aktif // ettiğim için fazladan güç tüketimi oluşacaktır.Birde eğer benim işimi 2MHz bir hız //işimi
görebilecekken ben 8MHz ile çalışma yaparsam yine gereksiz yere fazladan güç tüketimi oluşacaktır.
GPIOA->CRL = 0x44444422; //Port A1 PUPD Input, A0 ise Push-Pull Output olarak ayarlandi.
//GPIOA->CRL = 0x44444484; // A1 Buton girişi olarak kullanılacak Input PullDown
GPIOC->CRL = 0x44442244; //Port c2 ve c3 Push-Pull Output olarak ayarlandi.
while (1)
{
if(GPIOA->IDR & 0x00000002) //eğer PA1'a basıldıysa.
GPIOC->ODR=0x0000000C; //PC2 VE PC3 set ediliyor
else
GPIOC->BRR=0x0000000C; // basılı değilse işlem yok.
}
}
void led_kontrol() // ODR registerleri ile ledlerin sıra ile yakulması
{
GPIOC->ODR = 0x0004;
Delay(100000);
GPIOC->ODR = 0x0008;
Delay(100000);
GPIOC->ODR = 0x0000;
GPIOA->ODR = 0x0001;
Delay(100000);
GPIOA->ODR = 0x0002;
Delay(100000);
GPIOA->ODR = 0x0000;
Delay(100000);
}
void led_kontrol_1() // ODR registerleri ile ledlerin sıra ile yakulması
{
GPIOC->ODR = 0x0004;
Delay(100000);
GPIOC->ODR = GPIOC->ODR <<1;
Delay(100000);//Delay 1second
GPIOC->ODR = 0x0000;
GPIOA->ODR = 0x0001;
Delay(100000);
GPIOA->ODR = GPIOA->ODR <<1;
Delay(100000);
GPIOA->ODR = 0x0000;
Delay(100000);
}

void buton_kontrol() // IDR ve ODR ile buton ve led kontrolü


{
if(GPIOA->IDR & 0x00000002) //eğer PA1'a basıldıysa.
GPIOC->ODR=0x0000000C; //PC2 VE PC3 set ediliyor
else
GPIOC->BRR=0x0000000C; // basılı değilse işlem yok.
}

void Delay(__IO uint32_t nCount)


{
for(; nCount != 0; nCount--);
}

43
Standart Kütüphane Kullanarak Saat Konfigürasyonu ve GPIO Örnek Yazılım
#include "stm32f10x.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_conf.h"
#include "stm32f10x_gpio.h"

int main(void)
{
int i;
int j;
SetSysClockTo72();
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_CikisYapilandir;
GPIO_CikisYapilandir.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_CikisYapilandir.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;
GPIO_CikisYapilandir.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOC,&GPIO_CikisYapilandir);

GPIO_InitTypeDef GPIO_GirisYapilandir;
GPIO_GirisYapilandir.GPIO_Mode = GPIO_Mode_IPD;
GPIO_GirisYapilandir.GPIO_Pin = GPIO_Pin_1;
// GPIO_Yapilandir.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOA,&GPIO_GirisYapilandir);

for(i=0; i<6; i++)


{
GPIO_SetBits(GPIOC, GPIO_Pin_2 | GPIO_Pin_3);
for(j=0;j<1000000;j++);
GPIO_ResetBits(GPIOC, GPIO_Pin_2 | GPIO_Pin_3);
for(j=0;j<1000000;j++);
}
while (1) {
if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1) != 0) {
GPIOC->ODR ^= GPIO_Pin_2 | GPIO_Pin_3; // C2 Pini terslenmektedir.
/* Saymaya bağlı gecikme */
for(i=0;i<0x100000;i++);
/* PC2 pinine bağlı LED butona basıldığı sürece yanıp sönecek*/
GPIOC->ODR ^= GPIO_Pin_2 | GPIO_Pin_3;
/* Saymaya bağlı gecikme */
for(i=0;i<0x100000;i++);
}
else {
GPIO_ResetBits(GPIOC, GPIO_Pin_2 | GPIO_Pin_3);
}
}
}

void SetSysClockTo72(void)
{
ErrorStatus HSEStartUpStatus;
/* SYSCLK, HCLK, PCLK2 ve PCLK1 konfigürasyon işlemi yapılmaktadır.*/
/* RCC system reset (for debug purpose) */
RCC_DeInit();
/* HSE Aktifle */
RCC_HSEConfig( RCC_HSE_ON);
/* HSE hazır oluncaya kadar bekle */
HSEStartUpStatus = RCC_WaitForHSEStartUp();
if (HSEStartUpStatus == SUCCESS)
{
/* Prefetch Bufferı aktifle */
FLASH_PrefetchBufferCmd( FLASH_PrefetchBuffer_Enable);
/* Flash 2 bekleme durumu, eğer sistem saati 48 MHz <SYSCLK ≤ 72 MHz */
FLASH_SetLatency( FLASH_Latency_2);
/* PLLCLK = 8MHz * 9 = 72 MHz */
// PLL kaynağı olarak RCC_PLLSource seçilmiştir. .
RCC_PLLConfig(0x00010000, RCC_PLLMul_9);
/* PLL aktifle- */
RCC_PLLCmd( ENABLE);

44
/* PLL hazır oluncaya kadar bekle (RCC_FLAG sıfır oluncaya kadar) */
while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
{
}
/* system clock source olarak PLL seçildi*/
RCC_SYSCLKConfig( RCC_SYSCLKSource_PLLCLK);

/* PLL sistem saat kaynağı oluncaya kadar bekle */


while (RCC_GetSYSCLKSource() != 0x08)
{
}

/* HCLK = SYSCLK */
RCC_HCLKConfig( RCC_SYSCLK_Div1); //RCC_SYSCLK: AHB saat bölücüsü
/* PCLK2 = HCLK */
RCC_PCLK2Config( RCC_HCLK_Div2); // RCC_HCLK: APB2 saat bölücüsü
/* PCLK1 = HCLK/2 */
RCC_PCLK1Config( RCC_HCLK_Div2); //RCC_HCLK: APB1 saat bölücüsü
}
else
{ /* Eğer HSE başlatma başarısız olursa, uygulamada hatalı saat yapılandırması olacaktır. Bunun için
buraya hata durum bildirim kodları yazılabilir. Örneğin HSI ile Buzzer */

/* Sonsuz döngüye girer ve yazılacak .diğer kodlar işletilir*/


while (1)
{
}
}
}

45
STM32 GPIO PORTLARI
Herhangi bir mikro denetleyicide en az bir genel amaçlı giriş-çıkış bağlantı noktası
bulunur. STM32 Serisinde bu konuda diğer mikro kontrolcülerden farklı değildir. Bilindiği gibi
çeşitli GPIO portlarına sahiptir. Bu bağlantı noktaları genellikle GPIOA, GPIOB vb. harf
değerinde artarak adlandırılır, ancak çoğu 8/16 bit mikro kontrolcülerden farklı olarak bu
bağlantı noktaları 16 bit genişliğindedir. Böylece, genel olarak, her bir portun 16 I/O pini
vardır. Bu port pinleri birkaç çalışma moduna sahiptir ve bu onları başlangıçta hem sağlam
hem de karmaşık hale getirir. Geliştirme kartlarında I/O port pin adlandırma kısaltılır ve
GPIOA0, GPIOB12 vb. Yerine PA0, PB12 vb. ifadeler kullanılır. STM32FReferans el
kitaplarında bile bu kısa adlandırma yaygın şekilde kullanılmaktadır. Her I / O pini varsayılan
olarak genel amaçlıdır.
STM32'nin GPIO'su ile ilgili önemli noktalar
 Sıfırlama (Resetleme) olayı durumu dikkate alındığında, tüm GPIO'lar kayan (Floating)
girişlerdir. Bu, acil durumlarda GPIO'lara kazara zarar vermesini önler.
 Tüm GPIO kayıtlarına (Register) 32 bit kelimelerle erişilmesi gerekir. Bu zorunludur.
 Herhangi bir GPIO kaydı için ayrılmış bitler 0 sıfırlama değerlerinde tutulur.
 Her GPIO portu için yedi kayıt tutucu (Register) vardır, ancak ilk dördü en
önemlisidir. Gerisi çoğu zaman göz ardı edilebilir.
 Bağlantı noktası başına bu önemli GPIO kayıtları CRL, CRH, IDR ve
ODR'dir. Başlangıç düzeyinde GPIO portları için geri kalan üç kayıt tutucusu göz ardı
edilebilir.
 Bit seti ve bit temizleme için sırasıyla REGx | = (1 << bit) ve REGx & = ~ (1 <<
bit) işlemleri çok kullanışlı ve verimlidir. Bununla birlikte, registerlere bit düzeyinde
erişmek kontrol sürecini hızladırır.
 Bazı I/O'lar 5V toleranslıdır ancak 3.3V işlemi sürekli olarak sağlansa daha iyi olacaktır.
STM32'nin maksimum VDD toleransı 4V'dır, ancak bu değer, güvenli çalışma için
herhangi bir durumda kullanılmamalıdır. En iyisi, mümkün olduğunda GPIO'larla 5V
kullanımını önlemektir. Bu, genel hatalar nedeniyle mikro işlemciye kazara zarar
verebilir.
 Kullanılmayan GPIO pimleri, sıfırlama durumunda tutulmalı ya da 10kΩ'luk dirençlerle
GND’ye bağlanmalı ve böylece bunlar kayan girdiler olarak kalmalı veya zorunlu
olmamakla birlikte topraklamaya güvenle bağlı olmalıdır.

46
 I/O pinleri 25mA'a kadar source veya sink akım çekebilir. Bu sebeple doğrudan LED
sürülebilir. Bu değerden daha fazla yük gerektiren yükleri tahrik etmek için harici
BJT'ler, MOSFETler, optokuplörler, transistör dizileri veya diğer sürücü cihazlarını
kullanmamız gerekir.
 I/O pinleri doğrudan indüktif veya kapasitif yükleri sürmemelidir.
 Çıktıların 50MHz'den fazla sürmemesi için özen gösterilmelidir. Bu maksimum I / O pin
frekansı değeridir.
 CRL / H gerekli GPIO pin çalışma modunu bağımsız olarak aşağıdaki tabloya göre
kaydeder:

PORT BİT KONFİGÜRASYON İŞLEMİ

GPIO Kayıt Ediciler (Registerler)


Kayıt tanımlarında kullanılan kısaltmaların listesi aşağıdaki tabloda verilmiştir.
Read/write (rw) Software can read and write to these bits. Yazılım bu bitleri okuyabilir ve yazabilir.
read-only (r) Software can only read these bits. Yazılım sadece bu bitleri okuyabilir.
Software can only write to this bit. Reading Yazılım sadece bu biti yazabilir. Bitin
write-only (w) the bit returns the reset value. okunması sıfırlama değerini döndürür.

47
Software can read as well as clear this bit by Yazılım bu biti okuyarak yazabilir ve
read/clear writing 1. Writing ‘0’ has no effect onthe bit yazabilir. '0' yazısı bit değerinde bir etkisi
(rc_w1) value. yoktur.
Software can read as well as clear this bit by Yazılım bu biti 0 yazarak okuyabilir ve
read/clear writing 0. Writing ‘1’ has no effect onthe bit okuyabilir. '1' yazısı, bit değerinde bir etkisi
(rc_w0 value. yoktur.
Software can read this bit. Reading this bit Yazılım bu biti okuyabilir. Okurken bu bit
read/clear by automatically clears it to ‘0’. Writing ‘0’has no otomatik olarak '0' olarak temizler. '0' yazma,
read (rc_r) effect on the bit value. bit değerinde bir etkisi yoktur.
Yazılım bu biti okuyabileceği gibi
Software can read as well as set this bit. ayarlayabilir. '0' yazma, bit değeri üzerinde
read/set (rs) Writing ‘0’ has no effect on the bit value. bir etkisi yoktur.
Software can read this bit. Writing ‘0’ or ‘1’ Yazılım bu biti okuyabilir. '0' veya '1' yazmak
read-only write triggers an event but has no effect onthe bit bir olayı tetikler, ancak bit değeri üzerinde
trigger (rt_w) value. herhangi bir etkisi yoktur.
Yazılım yalnızca bu biti "1" yazarak
Software can only toggle this bit by writing değiştirebilir. '0' yazma etkisi
toggle (t) ‘1’. Writing ‘0’ has no effect bulunmamaktadır
Reserved (Res.) Reserved bit, must be kept at reset value. Ayrılmış bit, sıfırlama değerinde tutulmalıdır.

CRL 0 - 7 arası GPIO'ları, CRH 8 - 15'i arasındaki pinleri ayarlar. Tüm I/O portları, PIC veya
AVR gibi yaygın 8 bit mikrodan farklı olarak 16 bit genişliğindedir.

Port Konfigürasyon Kayıt Edicisi Düşük Kayıt Tutucu (GPIOx_CRL) (x=A..G)

Adres ofset: 0x00


Reset değeri: 0x4444 4444

CRL Kayıt:

48
CRH Kayıt:

CNFy[1:0] Port Konfigürasyon Bitleri (L için y = 0…7) (H için y = 8…15)


Giriş (input) modu (MODE[1:0]=00):
00: Analog giriş
01: Kayan giriş (reset sonrası bu durumda oluyor)
10: pull-up / pull-down giriş
11: rezerve(kullanılmıyor)
Çıkış (output) modu (MODE[1:0] > 00):
00: Genel amaçlı çıkış (push-pull)
01: Genel amaçlı çıkış (Open-drain)
10: Alternatif Fonksiyon çıkış (Push-pull)
11: Alternatif Fonksiyon çıkış (Open-drain)

Mod (MODEy[1:0] mode bitleri (L için y = 0…7) (H için y = 8…15)


00: Giriş modu (reset sonrası bu durumda)
01: çıkış modu maksimum 10 mhz
10: çıkış modu maksimum 2 mhz
11:çıkış modu maksimum 50 mhz

49
 Bağlantı noktası yapılandırma tablosundan görüleceği üzere, sıfırlamanın hemen
ardından CRL ve CRH'nin her ikisi de 0x44444444 değerine sahiptir. Bu değer kayan
giriş modu anlamına gelir.
 ODR kayıtları dijital çıkışlardan sorumluyken IDR kayıtları dijital girişlerden
sorumludur. Her iki kayıtta da üst 16 bit her zaman 0 tutulur, çünkü temsil eden kayıtlar
32 bit genişliğinde GPIO 16 bit genişliğindedir. Dolayısıyla yalnızca alt seviyedeki 16
pin ile ilgili çalışma yapılabilir. Kod oluşturma kuralları IDR'ler ve ODR'ler için
0x0000xxxx olacaktır. Üst seviye pinler ayrılmıştır ve sıfır olarak ayarlanır.
 Tıpkı CRL ve CRH gibi, IDR ve ODR 32 kelimeyle erişilmelidir.
 Bir GPIO bağlantı noktasının ODR veya IDR kayıtlarını kullanmadan önce CRL ve CRH
başlangıç işlemi yapılmalıdır.

STM32F103 entegresinde, 2 adet 32 bitlik port konfigürasyon kayıt edicisi bulunmaktadır. Portların
ilk 8 bitlik kısmı(Low bits) GPIOx_CRL, son 8 bitlik kısmı(High bits) GPIOx_CRH kayıt edicileri ile
ayarlanmaktadır. CNFx birimi ile portların giriş-çıkış ayarlarını, MODEx birimi ile de pinlerin
çalışma hızları ayarlanmakta.

Port Giriş Data Kayıt Edicisi (GPIOx_IDR) (x=A..G)


Adres ofset: 0x08h, Reset değeri: 0x0000 XXXX
Bu kaydedici ile portun giriş değeri okunabilir. 0-15 arası bitlerin her biri ilgili pine ait giriş
değerini veriyor. Bu porta yazma işlemi yapılmıyor.

Bu kayıt tutucu (register) ile giriş olarak ayarlanan pinlerdeki lojik seviyeleri okunmaktadır.

Port Çıkış Data Kayıt Edicisi (GPIOx_ODR) (x=A..G)


Adres ofset: 0x0C, Reset değeri: 0x0000 0000
Bu kaydedici ile ilgili porta çıkış değeri atanabilmektedir. Bu kaydediciye bit erişimi
yapılamıyor. Yani çıkış değerini 16 bit birden yazmak gerekiyor. Tek tek bitlere
erişim GPIOx_BSRR kaydedicisiyle yapılıyor.

50
Bu kayıt tutucu (register) ile çıkış pinlerinin lojik değerleri okunmaktadır. Ayrıca; istenildiği taktirde
bu kayıt tutucu (register) yardımıyla çıkışa istediğimiz lojik değeri atayabiliriz.

Port Bit Set-Reset Kayıt Edicisi (GPIOx_BSRR) (x=A..G)


Adres ofset: 0x10, Reset değeri: 0x0000 0000
Bu kaydedicinin ilk 16 biti ile ilgili portun 16 pin bitleri ayrı ayrı 1(set) yapılabiliyor. 17-32 bitleri
ile de ilgili portun pinleri sıfırlanıyor. Eğer ilgili pine ait hem set hem reset biti 1 yapılırsa set
durumunun önceliği var. Bu durumda ilgili pin 1 oluyor.

Bu kayıt tutucu (register) sayesinde çıkış pinlerini lojik 1 veya lojik 0 yapabilirsiniz. İlk 16 bit pinleri
lojik 1 yapmak için, son 16 bit de pinleri lojik 0 yapmak için kullanılır. Eğer aynı anda, aynı pin hem
lojik 1 hem de lojik 0 olarak ayarlanırsa, öncelik lojik 1'de olacağı için, pin lojik 1 değerini alır. Bu
kayıt edicinin bir diğer özelliği; ilgili pin tam lojik 1 veya lojik 0 yapılırken kesme gelirse; öncelikle
pini ilgili değere ayarlayıp, daha sonra kesmeye gitmesidir. Çok hassas işlemler için ideal olan bu
kayıt edici, sadece yazılabilir olduğu için, çıkış değeri bu kayıt tutucu (register) üzerinden
okunamaz.

Port Bit Reset Kayıt Edicisi (GPIOx_BRR) (x=A..G)


Address offset: 0x14, Reset value: 0x0000 0000
Bu kaydedicinin ilk 16 biti ile ilgili portun 16 pin bitleri ayrı ayrı 0 (reset) yapılabiliyor.

51
Bu kayıt tutucu (register) ile ilgili pin lojik 0 seviyesine çekilir. Sadece yazılabilir modda olduğu için,
ilgili pinin değeri okunamaz. Aynı zamanda; ilgili pin lojik 1 veya lojik 0 olarak ayarlanacağı sırada
bir kesme gelirse, önce kesmeye gidilir, daha sonra ilgili pin ilgili değere atanır.

Port Konfigürasyon Kilit Kayıt Edicisi


Bu kayıt tutucu, 16 bitine (LCKK) doğru bir yazma sırası uygulandığında, port bitlerinin
yapılandırmasını kilitlemek için kullanılır. Bitlerin [15: 0] değeri, GPIO'nun yapılandırmasını
kilitlemek için kullanılır. Yazma sırası sırasında, LCKR [15: 0] değeri değiştirilmemelidir. LOCK
dizisi bir port bitine uygulandığında, bir sonraki sıfırlanana kadar port biti değerini değiştirmek artık
mümkün değildir.
Her kilitleme biti kontrol kaydının (CRL, CRH) ilgili 4 bitini dondurur.

Adres ofset: 0x18


Reset değeri: 0x0000 0000

İlk 16 bitlik kısmı kullanılan bu kayıt tutucu (register) ile pinlerin port ayarlarını kilitleyebiliriz.

Bu kaydedici, giriş-çıkış portlarının ayarları bir kere yapıldıktan sonra bir daha yanlışlıkla
değiştirilmesini önlemek için kilitlemeye yarıyor. Kilitleme mekanizması şu şekilde çalışıyor:
– Konfigurasyonu kilitlenmek istenen pinlere ait LCKx biti set edilir.
– LCKK bitine sırasıyla şu işlemler uygulanır: 1 Yazma, 0 yazma, 1 yazma. Kilidin aktif hale
geçti ise sırasıyla 2 okuma işlemi yapıldığında 0 ve 1 değerleri okunacaktır.
Bu işlemler sonunda IO pinleri konfigurasyonu kilitlenmiş olur ve ancak bir sonraki resetten
sonra değiştirilebilir.
IO kullanımı için işlem adımları:
1- İlgili IO portunun saat girişini aktif hale getiriyoruz. (RCC_APB1ENR , RCC_APB2ENR )
2- İlgili IO portunun pinlerinin yön ayarlarını yapıyoruz (giriş veya çıkış,
GPIOx_CRL,GPIOx_CRH)

52
3- IO erişimi için ilgili kaydedicilere erişiyoruz ( GPIOx_IDR, GPIOx_ODR, GPIOx_BRR
,GPIOx_BSRR )
.
GPIO Yazılım Bloğu
GPIO bloğu, GPIO bloğunun belirlenmiş kayıtlardaki bitlerin manipüle edilmesiyle konfigüre
edilebilir. Bununla birlikte, bu, GPIO donanımı hakkında ayrıntılı bilgi sahibi olduktan sonra
yazılımsal işlem yapmak daha uygun olacaktır. CMSIS kütüphanesinde geliştirilmiş mevcut
işlevleri kullanmak çok daha kolaydır. Bitleri işleyen süreçler için "stm32f10x_gpio.c" kaynak
dosyası kullanılır ve bu işlevlere eşlik edecek tanımlar ve veri yapıları "stm32f10x_gpio.h" başlık
dosyasında saklanır. Bunlardan ilki, kullanıcı programına dahil edilmelidir.

GPIO bloğunun yapılandırılmasında tip tanımlaması olarak typedef ifadesini kullanarak veri
türlerini temsil eden kelimeleri (int, char, float, vs.) farklı şekilde tanımlanabilir. Bu şekilde mevcut
bir veri türü için yeni bir isim veya yeni bir veri türü oluşturulabilir. GPIO yapılandırmasında typedef
ifadesinin genel yapısı aşağıdaki şekildedir:

typedef struct
{
uint16_t GPIO_Pin;
/*! <Yapılandırılacak GPIO pinlerini belirtir. Bu parametre, @ref GPIO_pins_define *
değerinin herhangi bir değeri olabilir */

GPIOSpeed_TypeDef GPIO_Speed;
/*! <Seçilen pinlerin hızını belirtir. Bu parametre, @ref GPIOSpeed_TypeDef değeri
olabilir */

GPIOMode_TypeDef GPIO_Mode;
/*! <Seçilen pinlerin çalışma modunu belirtir. Bu parametre @ref GPIOMode_TypeDef *
değeri olabilir.*/
} GPIO_InitTypeDef;

53
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOA, ENABLE);

GPIO_InitTypeDef GPIO_CikisYapilandir;
GPIO_CikisYapilandir.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_CikisYapilandir.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;
GPIO_CikisYapilandir.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOC,&GPIO_CikisYapilandir);

GPIO_InitTypeDef GPIO_GirisYapilandir;
GPIO_GirisYapilandir.GPIO_Mode = GPIO_Mode_IPD;
GPIO_GirisYapilandir.GPIO_Pin = GPIO_Pin_1;
GPIO_Yapilandir.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOA,&GPIO_GirisYapilandir);

GPIO_MODE
GPIO_Mode_AIN = 0x0,
GPIO_Mode_IN_FLOATING = 0x04,
GPIO_Mode_IPD = 0x28,
GPIO_Mode_IPU = 0x48,
GPIO_Mode_Out_OD = 0x14,
GPIO_Mode_Out_PP = 0x10,
GPIO_Mode_AF_OD = 0x1C,
GPIO_Mode_AF_PP = 0x18

GPIO_PIN
#define GPIO_Pin_0 ((uint16_t)0x0001) /*!< Pin 0 selected */
#define GPIO_Pin_1 ((uint16_t)0x0002) /*!< Pin 1 selected */
#define GPIO_Pin_2 ((uint16_t)0x0004) /*!< Pin 2 selected */
#define GPIO_Pin_3 ((uint16_t)0x0008) /*!< Pin 3 selected */
#define GPIO_Pin_4 ((uint16_t)0x0010) /*!< Pin 4 selected */
#define GPIO_Pin_5 ((uint16_t)0x0020) /*!< Pin 5 selected */
#define GPIO_Pin_6 ((uint16_t)0x0040) /*!< Pin 6 selected */
#define GPIO_Pin_7 ((uint16_t)0x0080) /*!< Pin 7 selected */
#define GPIO_Pin_8 ((uint16_t)0x0100) /*!< Pin 8 selected */
#define GPIO_Pin_9 ((uint16_t)0x0200) /*!< Pin 9 selected */
#define GPIO_Pin_10 ((uint16_t)0x0400) /*!< Pin 10 selected */
#define GPIO_Pin_11 ((uint16_t)0x0800) /*!< Pin 11 selected */
#define GPIO_Pin_12 ((uint16_t)0x1000) /*!< Pin 12 selected */
#define GPIO_Pin_13 ((uint16_t)0x2000) /*!< Pin 13 selected */
#define GPIO_Pin_14 ((uint16_t)0x4000) /*!< Pin 14 selected */
#define GPIO_Pin_15 ((uint16_t)0x8000) /*!< Pin 15 selected */
#define GPIO_Pin_All ((uint16_t)0xFFFF) /*!< All pins selected */

GPIO_Speed
GPIO_Speed_10MHz = 1,
GPIO_Speed_2MHz,
GPIO_Speed_50MHz

54
Standart Kütüphane Kullanarak Saat Konfigürasyonu ve GPIO Örnek Yazılım.

#include "stm32f10x.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_conf.h"
#include "stm32f10x_gpio.h"
void SetSysClockTo72(void);

int main(void)
{
int i;
int j;
SetSysClockTo72();

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOA, ENABLE);

GPIO_InitTypeDef GPIO_CikisYapilandir;
GPIO_CikisYapilandir.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_CikisYapilandir.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;
GPIO_CikisYapilandir.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOC,&GPIO_CikisYapilandir);

GPIO_InitTypeDef GPIO_GirisYapilandir;
GPIO_GirisYapilandir.GPIO_Mode = GPIO_Mode_IPD;
GPIO_GirisYapilandir.GPIO_Pin = GPIO_Pin_1;
// GPIO_Yapilandir.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOA,&GPIO_GirisYapilandir);

for(i=0; i<6; i++)


{
GPIO_SetBits(GPIOC, GPIO_Pin_2 | GPIO_Pin_3);
for(j=0;j<1000000;j++);
GPIO_ResetBits(GPIOC, GPIO_Pin_2 | GPIO_Pin_3);
for(j=0;j<1000000;j++);
}
while (1) {

if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1) != 0) {

GPIOC->ODR ^= GPIO_Pin_2 | GPIO_Pin_3; // C2 Pini terslenmektedir.

/* Saymaya bağlı gecikme */


for(i=0;i<0x100000;i++);

/* PC2 pinine bağlı LED butona basıldığı sürece yanıp sönecek*/


GPIOC->ODR ^= GPIO_Pin_2 | GPIO_Pin_3;

/* Saymaya bağlı gecikme */


for(i=0;i<0x100000;i++);
}
else {
GPIO_ResetBits(GPIOC, GPIO_Pin_2 | GPIO_Pin_3);
}
}
}

void SetSysClockTo72(void)
{
ErrorStatus HSEStartUpStatus;
/* SYSCLK, HCLK, PCLK2 ve PCLK1 yapılandırması ----------------------------- */
/* RCC sistemi sıfırlama (hata ayıklama amacı için) */
RCC_DeInit();

/* HSE yi Etkinleştir */
RCC_HSEConfig( RCC_HSE_ON);

/* HSE hazır oluncaya kadar bekle */

55
HSEStartUpStatus = RCC_WaitForHSEStartUp();

if (HSEStartUpStatus == SUCCESS)
{
/* Prefetch Buffer etkinleştir*/
FLASH_PrefetchBufferCmd( FLASH_PrefetchBuffer_Enable);

/* Flash 2 bekleme durumu, eğer sistem saati 48 MHz <SYSCLK ≤ 72 MHz */


FLASH_SetLatency( FLASH_Latency_2);

/* PLLCLK = 8MHz * 9 = 72 MHz */


// RCC_PLLSource olarak PLL saat kaynağını seç.
RCC_PLLConfig(0x00010000, RCC_PLLMul_9);

/* PLL'yi etkinleştir - PLL'nin yeni durumu. Bu parametre şunlar olabilir: ENABLE veya DISABLE */
RCC_PLLCmd( ENABLE);

/* PLL hazır olana kadar bekleyin RCC_FLAG: kontrol edilecek bayrağı belirtir. */
while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
{}

/* Sistem saat kaynağı olarak PLL'yi seçin */


// RCC_SYSCLKSource: sistem saati olarak kullanılan saat kaynağını belirtir.
RCC_SYSCLKConfig( RCC_SYSCLKSource_PLLCLK);

/* PLL sistem saat kaynağı olarak kullanılıncaya kadar bekleyin */


while (RCC_GetSYSCLKSource() != 0x08)
{}
/* HCLK = SYSCLK */
RCC_HCLKConfig( RCC_SYSCLK_Div1);
// RCC_SYSCLK: AHB saat ayırıcısını tanımlar. Bu saat sistem saatinden (SYSCLK) türetilmiştir.

/* PCLK2 = HCLK */
RCC_PCLK2Config( RCC_HCLK_Div2); // RCC_HCLK: APB2 saat ayırıcısını tanımlar.

/* PCLK1 = HCLK/2 */
RCC_PCLK1Config( RCC_HCLK_Div2); //RCC_HCLK: APB1 saat ayırıcısını tanımlar.
}
else
{ /* HSE başlatılamıyorsa, uygulama yanlış saat yapılandırmasına sahip olacaktır.
Kullanıcı bu hatayla başa çıkmak için buraya bir kod ekleyebilir */

while (1) /* Sonsuz çevrime git */


{}
}
}

/* Enable Prefetch Buffer */


/*Bu seçenekler, Flash bellek erişim süresine uygun olarak kullanılmalıdır. Bekleme durumları, SYSCLK
(sistem saati) periyodunun Flash bellek erişimi oranını temsil eder
zaman:
sıfır bekleme durumu, eğer 0 <SYSCLK ≤ 24 MHz
bir bekleme durumu, eğer 24 MHz <SYSCLK ≤ 48 MHz
iki bekleme durumu, eğer 48 MHz <SYSCLK ≤ 72 MHz

Yarım döngü konfigürasyonu, AHB'deki önşarjör ile birlikte kullanılamaz. Sistem saati (SYSCLK) HCLK
saatine eşit olmalıdır. Bu nedenle bu özellik yalnızca 8 MHz veya daha düşük bir düşük frekanslı saat ile
kullanılabilir. HSI veya HSE'den oluşturulabilir, PLL'den üretilemez. AHB saatinde 1'den farklı önşarjör
kullanılırken ön getirme arabelleği açık tutulmalıdır.

Prefetch tamponu yalnızca SYSCLK 24 MHz'den düşük olduğunda ve AHB saatinde herhangi bir prescaler
uygulanmadığında açılmalı / kapatılmalıdır (SYSCLK HCLK'ye eşit olmalıdır). Önceden getirme arabelleği,
başlangıç denetimi sırasında genellikle mikro denetleyici dahili 8 MHz RC (HSI) osilatör üzerinde
çalışıyorken açılır / kapatılır.

DMA Kullanımı: DMA, DCode yolu üzerindeki Flash belleğe erişir ve ICode talimatlarına göre önceliğe
sahiptir. DMA her aktarımdan sonra bir serbest döngü sağlar. Bazı talimatlar DMA aktarımı ile birlikte
gerçekleştirilebilir. */

56
İÇİÇE VEKTÖRLÜ KESME KONTROLÜ
(NESTED VECTORED INTERRUPT CONTROLLER NVIC)

Muhtemelen herhangi bir mikro denetleyicideki temel özelliklerden biri, kesme sistemidir. ARM
Cortex-M3 mikro denetleyicileri en çok 256 kesme kaynağına sahiptir. İlk 15 kesme kaynağına
sistem istisnaları denir. Bu istisnalar, sıfırlama, NMI, sabit hata ve hata, hata ayıklama ve SystTick
zamanlayıcı kesmesi gibi Cortex çekirdeği içinde yükselir. Özel durum tablosunda 0x00000004
adresinden başlarlar ve 1'den 15'e numaralandırılırlar. 0 numaralı bir istisna yoktur (FYI - yığın
tablosunun başlangıç noktasını saklamak için istisna tablo adresinin en üst kısmı kullanılır):

Her özel durum vektörü, istisna oluştuğunda çağrılan dört baytlık servis rutini adresi tutar. İstisna
tablosu genellikle başlangıç kodunda şöyle bulunur:

_attribute__ ((section(".vectors"), used))


void (* const gVectors[])(void) =
{
(void (*)(void))((unsigned long)&_estack),
ResetHandler,
NMI_Handler,
HardFault_Handler,
MemManage_Handler,

57
BusFault_Handler,
UsageFault_Handler,

Linker betiğinde açıklanan ve genellikle flash belleğin çok başında bulunan .vectors bellek
bölümünde bulunur.

Cortex-M3'ün NVIC İçinde


Nested Vectored Interrupt Controller (NVIC) Cortex işlemcinin önemli bir parçasıdır. Kesme işlem
mantığına özen gösteren oldukça karmaşık bir modüldür. Ayrıca SysTick zamanlayıcı ve hata
ayıklama kontrolü için kontrol kayıtlarına sahiptir. Genel olarak konuşmak gerekirse NVIC, 240
adede kadar harici kesmeyi destekleyebilir. Keşif panosunda bulunan STM32F100RB mikro
denetleyiciden bahsetme NVIC, 41 maskelenebilir kesme kanalını ve 16 öncelik seviyesini
destekler. NVIC, işlemci çekirdeği ile sıkı bir şekilde eşleştirildiği için, kesmelerin düşük gecikme
süresiyle işlendiğinden emin olunur. NVIC, kesme önleme, kuyruk zincirleme, geç varış gibi bazı
gelişmiş kesme işlem modlarını desteklemektedir. Bu özellikler düşük gecikme ve daha güçlü
yanıtlara ulaşılmasını sağlar. Bu özellikler, hemen hemen aynı anda gelen çoklu kesmeleri
işlerken yığın ek yükünü önlemeye izin verir. Örneğin kuyruk zincirleme mekanizması, akım
tamamlandıktan sonra başka bir beklemede kesme olursa yığın yığınının atlanmasına izin
verir. Daha fazla bilgi için Cortex-M3 programlama kılavuzuna bakın.

Öncelikle ilgili sözler. Genel olarak her kesme, bir 8-bit öncelik seviyesi kaydına sahiptir. Ancak,
tüm bitler öncelikleri belirlemek için kullanılmaz. STM32F100RB mikro denetleyicisinin 16 öncelik
seviyesi vardır, bu da 4 MSB bitinin öncelikleri belirlemek için kullanıldığı anlamına gelir. Düşük
öncelikli numara daha yüksek önceliğe sahiptir. Gerekirse, bu bitler, her bir önleyici öncelik için
alt öncelik düzeyleri oluşturabileceğiniz iki gruba ayrılabilir. Subpriorite seviyeleri, iki veya daha
fazla aynı öncelik seviyesi kesmesi olduğunda kullanışlıdır. Daha sonra yüksek subpriority olan
biri ilk önce ele alınacaktır:

Harici Kesmeleri İşleme


Harici kesmeler, özel harici kesme denetleyicisi (EXTI) aracılığıyla NVIC'ye bağlanır. Birden çok
GPIO hattını NVIC harici kesme girişlerine eşlemeyi sağlar. STM32F100RB kesme denetleyicisi
18 kenar dedektörü hattından oluşur. Her çizgi, yükselen kenar, düşen kenar veya her ikisi gibi
farklı olaylarda tetiklenmek üzere yapılandırılabilir. Bağlantı noktaları 16-bit genişliğinde

58
olduğundan, 16 bağlantı noktası bağlantı noktası pimlerini eşlemeye adanmıştır. Örneğin, EXTI0
hattı tüm portların pinlerine 0 veya başka bir kombinasyona eşlenebilir.

İlave 3 EXTI hattı, RTC alarmı kesmesine, güç voltaj tespiti (PVD) için belirlenmiştir. EXTI hatları
daha sonra NVIC denetleyicisine bağlanır. EXTI hatları 0..4 ayrı ayrı NVIC'ye bağlanırken, 5 ile
16 arasındaki satırlar NVIC'ye bağlanan iki satıra gruplandırılır. RTC alarm kesme, güç voltajı
tespit hatları da ayrı ayrı NVIC'e bağlanır.

Tüm özel durum işleme işlevlerini kapsamak mümkün değildir. Her bir vakanın kendi kokusu
olduğu için, uygulama sırasında daha fazla şey gelmelidir. Projeleri RTOS tabanlı uygulamalara
zorlarken, bu şeyler gerçekten önemli. Fakat şimdilik, kesmeye dayalı rutinleri uygulayacağımız
başka bir kod örneği yapalım.

59
NVIC (İçiçe Vektörlü Kesme Kontrol) - kesme kontrol modülü. Aşağıdaki işlevleri yerine getirir:

• ARM mimarisinde her bir kesme için bir adres atanmıştır. Birden fazla kesme iç içe
çalışabilmektedir. Kesme işlemi yüksek öncelikliden düşük öncelikliye doğru icra edilir.
• 16 kesme öncelik seviyesine sahiptir. NVIC kesme gecikme süresi çok kısadır.
• Çekirdek direk kesme vektörünün adresine ulaşır.
• Kesme metoduna erken izin verir.
• Geç varma yöntemi yüksek öncelikli kesmelerdedir.
• Zincirleme kesme kuyruklarını destekler. (Art arda bekleyen sıralı kesmeler (IRQ) için.
• Kesmenin durumunu otomatik kayıt eder.
• Kesme giriş yenileme, komutları (kodlar) kesme çıkışına ek yük getirir.

Kesmelere izin verir veya kesmeleri yasaklar, kesmelerin önceliğini belirler (0'dan 15'e. 0 en
yüksek öncelik, 15 düşük önceliktir). tek veya iç içe kesmeler gerçekleştirilirken verileri otomatik
olarak kaydeder.

Bu NVIC denetleyicisi tüm kesmeleri yönetir. STM32'de dahili ve harici kesmenin öncelikleri
vardır. Bu durum daha yüksek önceliğe sahip kesmelerin, daha düşük öncelikli kesme işleminin
yürütülmesine müdahale edebileceği anlamına gelir.

Önceliği değiştirilemeyen kesmeler vardır.

Sıra Kesme Önceliği Tanımı

1 Reset_Handler -3 (highest) Reset

2 NMI_Handler -2 NMI kesmeleri

3 HardFault_Handler -1 Acil durum

NVIC ve işlemci çekirdeği arabirimi, düşük gecikmeli kesme işleme ve geç gelen kesmelerin
verimli bir şekilde işlemesini sağlayan yakından birleştirilmiştir. Çekirdek istisnalar dahil olmak
üzere tüm kesmeler NVIC tarafından yönetilmektedir.

SysTick Kalibrasyon Değeri Kaydı

60
SysTick kalibrasyon değeri, SysTick saati 9 MHz'e ayarlanmış olarak (maks HCLK / 8) 1ms'lik
bir referans zaman tabanı veren 9000 olarak ayarlanır.

Harici kesme / olay denetleyicisi (EXTI, External interrupt/event controller)

Harici kesme / olay denetleyicisi, bağlantı hattı aygıtlarında 20'ye kadar kenar dedektöründen
veya olay / kesme istekleri üretmek için diğer aygıtlarda 19 kenar dedektöründen oluşur.
Her giriş hattı, türü (olay veya kesme) ve ilgili tetikleyici olayı (yükselen veya düşen veya her
ikisini birden) seçecek şekilde bağımsız olarak konfigüre edilebilir. Her satır bağımsız olarak
maskelenebilir. Bekleyen bir kayıt, kesme taleplerinin durum satırını tutar

EXTI denetleyici ana özellikleri şunlardır:


• Her kesme / olay hattında bağımsız tetikleyici ve maske
• Her kesme hattı için özel durum biti
• 20'e kadar yazılım olayı / kesme isteği üretilmesi
• Darbe genişliği APB2 saat periyodundan daha düşük harici sinyal algılanması. Bu parametre
ile ilgili ayrıntılar için veri sayfasındaki elektriksel özellikler bölümüne bakın.

• 23 Kenar çizgileri seziciden (kenar tetikleme bulucu) meydana gelir.


• Kesme isteğini kullanıcı üretir.
• Her darbe bağımsız ayarlanabilir.
• Tetikleme şekli(işaret, darbe şekli) seçilebilir(yükselen, düşen, yükselen/düşen).
• Bağımsız olarak maskelenebilir.
• Kesme isteği kayıtçıda bekletilebilir ve sürdürülebilir.
• EXTI dış, harici işareti kısa darbe genişliğini anlayabilir.
• 16 dış kesme çizgisi vardır.

Blok diyagramı Şekil 20'de gösterilmektedir.

61
Uyandırma olayı yönetimi (Wakeup event management )
STM32F10xxx, çekirdeği (WFE) uyandırmak için harici veya dahili olayları işleyebilir. Uyandırma
olayı aşağıdakiler yoluyla oluşturulabilir:
• periferik kontrol kaydındaki bir kesmeyi etkinleştirmek, ancak NVIC'de değil, Cortex®-M3
Sistem Kontrol kaydındaki SEVONPEND bitini etkinleştirmek. MCU, WFE'den devam ettiğinde,
periferik kesme bekleyen biti ve çevresel NVIC IRQ kanalı bekleyen bitini (NVIC kesme açık
bekleyen kaydı) temizlemek gerekir.
• veya olay modunda bir harici veya dahili EXTI hattını yapılandırma. CPU, WFE'den devam
ederse, olay çizgisine karşılık gelen bekleyen bit ayarlanmadığı için periferik kesme bekleyen biti
veya NVIC IRQ kanalı bekleyen bitini silmek gerekli değildir.
Bağlantı hattı cihazlarında, Ethernet uyandırma olayları WFE uyandırma özelliğine de sahiptir.

Fonksiyonel Açıklama (Functional Description)

Kesmeyi oluşturmak için, kesme hattı yapılandırılmalı ve etkinleştirilmelidir. Bu, istenen kenar
algılama ile iki tetikleyici kaydının programlanmasıyla ve kesme isteğini, kesme maskesi
kaydındaki ilgili bite bir '1' yazarak etkinleştirerek yapılır. Seçilen kenar harici kesme hattında

62
olduğunda, bir kesme isteği oluşturulur. Kesme hattına karşılık gelen bekleyen bit de ayarlanır.
Bu istek bekleyen kayıtta '1' yazarak sıfırlanır.

Olay oluşturmak için etkinlik hattı yapılandırılmalı ve etkinleştirilmelidir. Bu, iki tetikleyici kaydının
istenen kenar algılama ile programlanmasıyla ve olay maskesi kaydındaki ilgili bite bir '1'
yazarak olay talebinin etkinleştirilmesiyle yapılır. Seçilen kenar olay satırında olduğunda, bir olay
darbesi üretilir. Olay satırına karşılık gelen bekleyen bit ayarlanmadı Yazılım kesme / olay
kaydında bir '1' yazarak bir kesme / etkinlik isteği de yazılım tarafından oluşturulabilir.

Donanım kesme seçimi (Hardware interrupt selection)

20 hattı kesme kaynağı olarak yapılandırmak için aşağıdaki yordamı kullanın:


• 20 kesme hattının maske bitlerini yapılandırın (EXTI_IMR)
• Kesme hatlarının Tetikleme Seçimi bitlerini yapılandırın (EXTI_RTSR ve EXTI_FTSR)
• NVIC IRQ kanalını Harici Kesme Denetleyicisine (EXTI) eşleyen denetleyen etkinleştirme ve
maske bitlerini yapılandırarak, 20 hattan birinden gelen bir kesme doğru onaylanabilir.

Donanım etkinliği seçimi (Hardware event selection)

20 hattı olay kaynağı olarak yapılandırmak için aşağıdaki yordamı kullanın:


• Olay satırlarının maske bitlerini yapılandırın (EXTI_EMR)
• Etkinlik satırlarının Tetikleme Seçimi bitlerini yapılandırın (EXTI_RTSR ve EXTI_FTSR)

Yazılım kesme / olay seçimi (Software interrupt/event selection)


20 satır, yazılım kesme / olay hatları olarak yapılandırılabilir. Aşağıdakiler
bir yazılım kesmesi üretmek için prosedür.
• 20 Kesme / Olay satırının maske bitlerini yapılandırın (EXTI_IMR, EXTI_EMR)
• Yazılım kesme kaydının gerekli bitini ayarlayın (EXTI_SWIER)

Harici kesme / olay hattı haritalandırılması (External interrupt/event line mapping)


112 GPIO aşağıdaki şekilde 16 harici kesme / olay hattına bağlanır:

63
Diğer dört EXTI hattı aşağıdaki şekilde bağlıdır;
• EXTI hattı 16 PVD çıkışına bağlıdır,
• EXTI hattı 17, RTC Alarm olayına bağlıdır,
• EXTI hat 18, USB Uyandırma olayına bağlıdır,
• EXTI hat 19, Ethernet Uyandırma olayına bağlıdır (yalnızca bağlantı hat cihazlarında bulunur)

EXTI Kayıtları (EXTI Registers)

Çevresel kayıtlara kelimeleri kullanarak erişmek zorundasınız (32-bit). Aşağıdaki tablo, EXTI
kayıt haritasını ve sıfırlama değerlerini vermektedir. Tüm kayıtlardaki bitler 19, bağlantı hattı
cihazlarında kullanılır ve aksi halde saklıdır.

64
Kesme Maskesi Kaydı (EXTI_IMR, Interrupt mask register)
Adres ofseti: 0x00
Sıfırla değeri: 0x0000 0000

Bit 31:20 Rezerve edilmiştir, sıfırlama değerinde (0) tutulmalıdır.


Bit 19: 0 MRx: Kesme Maskesi satır x'de
0: Satır x'den gelen kesme isteği maskelendi
1: Satır x'den kesme isteği maskelenmiyor
Not: Bit 19 yalnızca bağlantı hattı aygıtlarında kullanılır ve aksi halde rezerve edilmiştir.

Olay Maskesi Kaydı (EXTI_EMR, Event mask register)


Adres Ofseti: 0x04
Sıfırla değeri: 0x0000 0000

65
Bit 31:20 Rezerve edilmştir, sıfırlama değerinde (0) tutulmalıdır.
Bits 19: 0 MRx: x satırındaki olay maskesi
0: Satır x'den gelen olay isteği maskelendi
1: Satır x'den gelen olay isteği maskelenmiyor
Not: Bit 19 yalnızca bağlantı hattı aygıtlarında kullanılır ve aksi halde rezerve edlmiştir.

Yükselen Tetik Seçim Kaydı (EXTI_RTSR, Rising trigger selection register)


Adres kayması: 0x08
Sıfırla değeri: 0x0000 0000

Bit 31:20 Rezerve edildi, sıfırlama değerinde (0) tutulmalıdır.


Bit 19: 0 TRx: Satır x'in yükselen tetikleyici olay yapılandırma biti
0: Giriş hattı için yükselen tetikleyici devre dışı bırakıldı (Etkinlik ve Kesme için)
1: Giriş hattı için Yükselen tetikleyici etkin (Olay ve Kesme için).
Not: Bit 19 yalnızca bağlantı hattı aygıtlarında kullanılır ve aksi halde saklıdır.
Harici uyandırma hatları kenardan tetiklenir, bu hatlarda glitches oluşturulmamalıdır.
EXTI_RTSR kaydının yazılması sırasında harici kesme hattında yükselen bir kenar oluşursa,
bekleyen bit ayarlanmaz. Aynı kesme satırı için Yükselen ve Düşen kenar tetikleyicileri
ayarlanabilir. Bu yapılandırmada, her ikisi de tetikleyici bir durum oluşturur.

Düşen Tetik Seçim Kaydı (EXTI_FTSR, Falling trigger selection register)


Adres kayması: 0x0C
Sıfırla değeri: 0x0000 0000

66
Bit 31:20 Rezerve edildi, sıfırlama değerinde (0) tutulmalıdır.
Bit 19: 0 TRx: x satırının düşen tetikleyici olay yapılandırma biti
0: Düşen tetikleyici devre dışı (Olay ve Kesme için) giriş hattı için
1: Düşen tetik etkin (olay ve kesme için) giriş hattı için.
Not: Bit 19, bağlantı hattı aygıtlarında kullanılır ve aksi halde saklıdır.

Yazılım Kesme Olay Kaydı (EXTI_SWIER, Software interrupt event register )


Adres kayması: 0x10
Sıfırla değeri: 0x0000 0000

Bit 31:20 Rezerve edildi, sıfırlama değerinde (0) tutulmalıdır.


Bit 19: 0 SWIERx: x satırındaki yazılım kesmesi

Kesme, EXTI_IMR'deki bu satırda etkinleştirilirse, '0' olarak ayarlandığında bu bite '1' yazılması,
EXTI_PR'deki ilgili bekleyen biti bir kesme isteği oluşturma ile sonuçlanır.

Bu bit, EXTI_PR'nin ilgili bitini temizleyerek temizlenir (bit içine 1 yazarak).

Not: Bit 19, bağlantı hattı aygıtlarında kullanılır ve aksi halde saklıdır.

67
Bekleme Kaydı (EXTI_PR, Pending register)
Adres kayması: 0x14
Değeri sıfırlayın: undefined

Bit 31:20 Rezerve edildi, sıfırlama değerinde (0) tutulmalıdır.


Bit 19: 0 PRx: Bekleyen bit
0: tetikleme isteği oluşmadı
1: seçilen tetikleme isteği oluştu
Bu bit, seçilen kenar olayı harici kesme hattına geldiğinde ayarlanır. Bu bit, bit içine '1' yazarak
silinir.
Not: Bit 19 yalnızca bağlantı hattı aygıtlarında kullanılır ve aksi halde saklıdır.

NVIC Yazılım Bloğu


NVIC kesme bloğu, NVIC bloğunun kayıt tutucularındaki bitlerin manipüle edilmesiyle konfigüre
edilebilir. NVIC donanımı hakkında ayrıntılı bilgi sahibi olduktan sonra yazılımsal işlem yapmak
daha doğru olacaktır. CMSIS kütüphanesinde geliştirilmiş mevcut işlevleri kullanmak çok daha
kolaydır. Bitleri işleyen süreçler için "stm32f10x_exti.c" kaynak dosyası kullanılır ve bu işlevlere
eşlik edecek tanımlar ve veri yapıları "stm32f10x_exti.h" başlık dosyasında saklanır. Bunlardan
ilki, kullanıcı programına dahil edilmelidir.

NVIC bloğunun yapılandırılmasında tip tanımlaması olarak typedef ifadesini kullanarak veri
türlerini temsil eden kelimeleri (int, char, float, vs.) farklı şekilde tanımlanabilir. Bu şekilde mevcut
bir veri türü için yeni bir isim veya yeni bir veri türü oluşturulabilir. NVIC yapılandırmasında typedef
ifadesinin genel yapısı aşağıdaki şekildedir:

typedef struct
{
uint8_t NVIC_IRQChannel;
/*! <Etkinleştirilecek veya devre dışı bırakılacak IRQ kanalını belirtir. Bu
parametre IRQn_Type @ değerinin bir değeri olabilir (Tüm STM32 Cihazları IRQ
Kanalları listesi için lütfen stm32f10x.h dosyasına bakın) */

68
uint8_t NVIC_IRQChannelPreemptionPriority;
/*! <NVIC_IRQChannel'de belirtilen IRQ kanalı için emilim önceliğini belirtir. Bu
parametre, @ref NVIC_Priority_Table tablosunda açıklandığı gibi 0 ile 15 arasında
bir değer olabilir.*/

uint8_t NVIC_IRQChannelSubPriority;
/*! <NVIC_IRQChannel'de belirtilen IRQ kanalı için alt öncelik düzeyini belirtir. Bu
parametre, @ref NVIC_Priority_Table tablosunda açıklandığı gibi 0 ile 15 arasında
bir değer olabilir.*/

FunctionalState NVIC_IRQChannelCmd; // ENABLE veya DISABLE


/*! <NVIC_IRQChannel'de tanımlanan IRQ kanalının etkin mi yoksa devre dışı mı
olacağını belirtir. Bu parametre ya ENABLE ya da DISABLE olarak ayarlanabilir */
} NVIC_InitTypeDef;

NVIC_IRQChannelPreemptionPri NVIC_IRQChannelSubPrio
NVIC_PriorityGroup Description
ority rity
0 bits for pre-emption
NVIC_PriorityGroup_0 0 0-15 priority
4 bits for subpriority
1 bits for pre-emption
NVIC_PriorityGroup_1 0-1 0-7 priority
3 bits for subpriority
2 bits for pre-emption
NVIC_PriorityGroup_2 0-3 0-3 priority
2 bits for subpriority
3 bits for pre-emption
NVIC_PriorityGroup_3 0-7 0-1 priority
1 bits for subpriority
4 bits for pre-emption
NVIC_PriorityGroup_4 0-15 0 priority
0 bits for subpriority

typedef enum IRQn // NVIC_IRQChannel;


{
/****** Cortex-M3 Processor Exceptions Numbers ******************************************/
NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */
MemoryManagement_IRQn = -12, /*!< 4 Cortex-M3 Memory Management Interrupt */
BusFault_IRQn = -11, /*!< 5 Cortex-M3 Bus Fault Interrupt */
UsageFault_IRQn = -10, /*!< 6 Cortex-M3 Usage Fault Interrupt */
SVCall_IRQn = -5, /*!< 11 Cortex-M3 SV Call Interrupt */
DebugMonitor_IRQn = -4, /*!< 12 Cortex-M3 Debug Monitor Interrupt */
PendSV_IRQn = -2, /*!< 14 Cortex-M3 Pend SV Interrupt */
SysTick_IRQn = -1, /*!< 15 Cortex-M3 System Tick Interrupt */

/****** STM32 specific Interrupt Numbers ************************************************/


WWDG_IRQn = 0, /*!< Window WatchDog Interrupt */
PVD_IRQn = 1, /*!< PVD through EXTI Line detection Interrupt */
TAMPER_IRQn = 2, /*!< Tamper Interrupt */
RTC_IRQn = 3, /*!< RTC global Interrupt */
FLASH_IRQn = 4, /*!< FLASH global Interrupt */
RCC_IRQn = 5, /*!< RCC global Interrupt */
EXTI0_IRQn = 6, /*!< EXTI Line0 Interrupt */
EXTI1_IRQn = 7, /*!< EXTI Line1 Interrupt */
EXTI2_IRQn = 8, /*!< EXTI Line2 Interrupt */
EXTI3_IRQn = 9, /*!< EXTI Line3 Interrupt */
EXTI4_IRQn = 10, /*!< EXTI Line4 Interrupt */
DMA1_Channel1_IRQn = 11, /*!< DMA1 Channel 1 global Interrupt */
DMA1_Channel2_IRQn = 12, /*!< DMA1 Channel 2 global Interrupt */
DMA1_Channel3_IRQn = 13, /*!< DMA1 Channel 3 global Interrupt */

69
DMA1_Channel4_IRQn = 14, /*!< DMA1 Channel 4 global Interrupt */
DMA1_Channel5_IRQn = 15, /*!< DMA1 Channel 5 global Interrupt */
DMA1_Channel6_IRQn = 16, /*!< DMA1 Channel 6 global Interrupt */
DMA1_Channel7_IRQn = 17, /*!< DMA1 Channel 7 global Interrupt */

typedef struct
{
uint32_t EXTI_Line;
/*! <Etkinleştirilecek veya devre dışı bırakılacak olan EXTI satırlarını belirtir.
Bu parametre, EXTI_Lines'in @ref'inin herhangi bir kombinasyonu olabilir. */

EXTIMode_TypeDef EXTI_Mode;
/*! <EXTI satırlarının modunu belirtir. Bu parametre, EXTIMode_TypeDef'inin @ref
değeri olabilir. */

EXTITrigger_TypeDef EXTI_Trigger;
/*! <EXTI hatları için tetikleme sinyali etkin kenarını belirtir. Bu parametre,
EXTIMode_TypeDef'inin @ref değeri olabilir. */

FunctionalState EXTI_LineCmd;
/*! <Seçilen EXTI satırlarının yeni durumunu belirtir. Bu parametre ya ENABLE ya da
DISABLE olarak ayarlanabilir. */
} EXTI_InitTypeDef;

EXTI Hatları (EXTI_Line)


#define EXTI_Line0 ((uint32_t)0x00001)/*!< External interrupt line 0 */
#define EXTI_Line1 ((uint32_t)0x00002)/*!< External interrupt line 1 */
#define EXTI_Line2 ((uint32_t)0x00004)/*!< External interrupt line 2 */
#define EXTI_Line3 ((uint32_t)0x00008)/*!< External interrupt line 3 */
#define EXTI_Line4 ((uint32_t)0x00010)/*!< External interrupt line 4 */
#define EXTI_Line5 ((uint32_t)0x00020)/*!< External interrupt line 5 */
#define EXTI_Line6 ((uint32_t)0x00040)/*!< External interrupt line 6 */
#define EXTI_Line7 ((uint32_t)0x00080)/*!< External interrupt line 7 */
#define EXTI_Line8 ((uint32_t)0x00100)/*!< External interrupt line 8 */
#define EXTI_Line9 ((uint32_t)0x00200)/*!< External interrupt line 9 */
#define EXTI_Line10 ((uint32_t)0x00400)/*!< External interrupt line 10 */
#define EXTI_Line11 ((uint32_t)0x00800)/*!< External interrupt line 11 */
#define EXTI_Line12 ((uint32_t)0x01000)/*!< External interrupt line 12 */
#define EXTI_Line13 ((uint32_t)0x02000)/*!< External interrupt line 13 */
#define EXTI_Line14 ((uint32_t)0x04000)/*!< External interrupt line 14 */
#define EXTI_Line15 ((uint32_t)0x08000)/*!< External interrupt line 15 */
#define EXTI_Line16 ((uint32_t)0x10000)/*!< External interrupt line 16 Connected to the PVD Output */
#define EXTI_Line17 ((uint32_t)0x20000)/*!< External interrupt line 17 Connected to the RTC Alarm event */
#define EXTI_Line18 ((uint32_t)0x40000)/*!< External interrupt line 18 Connected to the USB Device/USB OTG
FS Wakeup from suspend event */
#define EXTI_Line19 ((uint32_t)0x80000)/*!< External interrupt line 19 Connected to the Ethernet Wakeup
event */

EXTI Tetikleyicileri (EXTI_Trigger)

typedef enum
{
EXTI_Trigger_Rising = 0x08,
EXTI_Trigger_Falling = 0x0C,
EXTI_Trigger_Rising_Falling = 0x10
}EXTITrigger_TypeDef;

70
EXTI Modu (EXTI_Mode)

typedef enum
{
EXTI_Mode_Interrupt = 0x00,
EXTI_Mode_Event = 0x04
}EXTIMode_TypeDef;

NVIC_InitTypeDef NVIC_KesmeYapilandirmasi;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

NVIC_KesmeYapilandirmasi.NVIC_IRQChannel = EXTI0_IRQn;
NVIC_KesmeYapilandirmasi.NVIC_IRQChannelCmd = ENABLE;
NVIC_KesmeYapilandirmasi.NVIC_IRQChannelPreemptionPriority = 0x00;
NVIC_KesmeYapilandirmasi.NVIC_IRQChannelSubPriority = 0x08;
NVIC_Init(&NVIC_KesmeYapilandirmasi);

EXTI_InitTypeDef EXTI_Harici_KesmeA0;
EXTI_Harici_KesmeA0.EXTI_Line = EXTI_Line0;
EXTI_Harici_KesmeA0.EXTI_LineCmd = ENABLE;
EXTI_Harici_KesmeA0.EXTI_Trigger =EXTI_Trigger_Rising;
EXTI_Harici_KesmeA0.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_Init(&EXTI_Harici_KesmeA0);

Standart Kütüphane Kullanarak NVIC Örnek Yazılımı inceleyiniz.

#include "stm32f10x.h"
#include "stm32f10x_exti.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_conf.h"

int main(void)
{
int i;
NVIC_InitTypeDef NVIC_KesmeYapilandirmasi;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

NVIC_KesmeYapilandirmasi.NVIC_IRQChannel = EXTI0_IRQn;
NVIC_KesmeYapilandirmasi.NVIC_IRQChannelCmd = ENABLE;
NVIC_KesmeYapilandirmasi.NVIC_IRQChannelPreemptionPriority = 0x00;
NVIC_KesmeYapilandirmasi.NVIC_IRQChannelSubPriority = 0x08;
NVIC_Init(&NVIC_KesmeYapilandirmasi);

EXTI_InitTypeDef EXTI_Harici_KesmeA0;
EXTI_Harici_KesmeA0.EXTI_Line = EXTI_Line0;
EXTI_Harici_KesmeA0.EXTI_LineCmd = ENABLE;
EXTI_Harici_KesmeA0.EXTI_Trigger =EXTI_Trigger_Rising;
EXTI_Harici_KesmeA0.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_Init(&EXTI_Harici_KesmeA0);

SystemInit();

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);

GPIO_InitTypeDef GPIO_CikisYapilandir;
GPIO_CikisYapilandir.GPIO_Mode = GPIO_Mode_Out_PP;

71
GPIO_CikisYapilandir.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;
GPIO_CikisYapilandir.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOC,&GPIO_CikisYapilandir);

GPIO_InitTypeDef GPIO_GirisYapilandir;
GPIO_GirisYapilandir.GPIO_Mode = GPIO_Mode_IPD;
GPIO_GirisYapilandir.GPIO_Pin = GPIO_Pin_0;
GPIO_Yapilandir.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOA,&GPIO_GirisYapilandir);

GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);

while (1) {

GPIOC->ODR ^= GPIO_Pin_2 | GPIO_Pin_3; // C2 Pini terslenmektedir.

/* Saymaya bağlı gecikme */


for(i=0;i<0x100000;i++);

/* PC2 pinine bağlı LED butona basıldığı sürece yanıp sönecek*/


GPIOC->ODR ^= GPIO_Pin_2 | GPIO_Pin_3;

/* Saymaya bağlı gecikme */


for(i=0;i<0x100000;i++);

}
}

void EXTI0_IRQHandler(void)
{
int i;
if(EXTI_GetFlagStatus(EXTI_Line0)!= RESET)
{
GPIO_ResetBits(GPIOC, GPIO_Pin_2 | GPIO_Pin_3 );
}
for(i=0; i<=10000000;i++);

EXTI_ClearFlag(EXTI_Line0);
EXTI_ClearITPendingBit(EXTI_Line0);

72
Evrensel Senkron Asenkron Alıcı Verici(USART)
Evrensel senkronize asenkron alıcı verici (USART), endüstri standardı NRZ asenkron seri veri
formatı gerektiren harici ekipmanla birlikte çift yönlü veri alışverişi için esnek bir iletişim altyapısı
sunar. USART, kesirli baud hızı üreteci kullanarak çok geniş bir baud hızı aralığı sunar.
Eşzamanlı tek yönlü iletişim ve yarım çift yönlü tek telli iletişimi destekler. Ayrıca LIN (yerel ara
bağlantı ağı), Akıllı Kart Protokolü ve IrDA (kızılötesi veri ilişkilendirmesi) SIR ENDEC belirtimlerini
ve modem işlemlerini (CTS / RTS) destekler. Bu arayüz aynı zamanda çok işlemcili iletişim de
sağlar. Yüksek hızlı veri iletişimi, çoklu blender konfigürasyonu için DMA kullanılarak mümkündür.
USART İletişim Arayüzünün Özellikleri

• Tam dupleks, asenkron iletişim


• NRZ standart formatı (Mark / Boşluk)
• Kesirli baud oranı jeneratör sistemleri
- Ortak programlanabilir bir aktarım ve 4,5 MBits / sn'ye kadar baud hızları
• Programlanabilir veri kelime uzunluğu (8 veya 9 bit)
• Yapılandırılabilir durdurma bitleri 1 veya 2 durdurma biti desteği
• LIN Master Senkronize Arası gönderme yeteneği ve LIN slave break algılama özelliği
- USART, LIN için yapılandırılmış donanım olduğunda 13-bit break oluşturma ve 10/11 bit kesme
algılama
• Senkron iletim için verici saat çıkışı
• IrDA SIR Encoder Dekoder
- Normal mod için 3/16 bitlik süre için destek
• Akıllı Kart Emülasyon Yeteneği
- Smartcard arayüzü, ISO 7816-3 standartlarında tanımlanan asenkron protokol Smartcards'ı
destekler.
- Smartcard işlemi için 0,5, 1,5 Stop Bits
• Tek telli yarım çift yönlü iletişim
• DMA kullanılarak yapılandırılabilir çoklu iletişim iletişimi (doğrudan bellek erişimi)
- Alınan / iletilen baytların ayrılmış SRAM'da merkezileştirilmiş olarak arabelleğe alınması

DMA

• Verici ve Alıcı için ayrı etkin bitler


Aktarma algılama bayrakları
- Tam arabellek al
- Arabelleği boş ilet
- İletim sonu bayrakları
• Parite kontrolü:
- Parite bitini ilet
- Alınan veri baytının paritesini kontrol eder
• Dört hata algılama bayrağı:
- Taşma hatası
- Gürültü hatası
- Çerçeve hatası
- Parite hatası

73
• Bayraklı on kesme kaynağı:
- CTS değişiklikleri
- LIN kırılma tespiti
- Veri kaydı gönder boş
- İletim tamamlandı
- Veri kaydı dolu al
- Boşta hat alındı
- Taşma hatası
- Çerçeveleme hatası
- Gürültü hatası
- Eşleşme hatası
• Çok işlemcili iletişim
- adres eşleşmesi olmazsa sessiz modda gir
• Sessiz moddan uyandırma (boşta kalma satırı algılama veya adres işareti algılaması ile)
• İki alıcı uyandırma modu: Adres biti (MSB, 9. bit), Boşta hattı Arabirim başka bir cihaza harici
olarak üç pim ile bağlanmıştır (bkz. Şekil 278).
Herhangi bir USART çift yönlü iletişim için en az iki pin gereklidir: Veri Girişi (RX) ve Veri İletimi
Gönderme (TX):
RX: Veri Girişi Al, seri veri girişidir. Aşırı örnekleme teknikleri, geçerli gelen veriler ve gürültü
arasında ayrım yaparak veri kurtarma için kullanılır.
TX: Veri Çıkışı İletim. Verici devre dışı bırakıldığında, çıkış pini IO bağlantı noktası
yapılandırmasına döner. Verici etkinleştirildiğinde ve hiçbir şey iletilmediğinde, TX pini yüksek
seviyededir. Tek telli ve akıllı kart modlarında, bu IO veriyi iletmek ve almak için kullanılır
(USART düzeyinde, veriler daha sonra SW_RX'te alınır).
Bu pinlerle, seri veriler normal USART modunda aktarılır ve alınır.
İçeren çerçeveler:
• İletim veya alım öncesinde bir Boş Hat
• Bir başlangıç biti
• Önce bir veri sözcüğü (8 veya 9 bit) en az anlamlı bit
• Çerçevenin tamamlandığını belirten 0,5,1, 1,5, 2 Durdurma bitleri
• Bu arabirim, bir 12-bit mantis ve 4-bit kesir ile bir kesirli baud hızı üreteci kullanır
• Bir durum kaydı (USART_SR)
• Veri kaydı (USART_DR)
• Bir baud hızı sicili (USART_BRR) - 12-bit mantis ve 4-bit fraksiyon.
• Akıllı kart modunda bir Bekçi Kaydı (USART_GTPR).
Her bitin tanımı için Bölüm 27.6: USART kayıtlarına bakınız.
Senkron modda arayüz oluşturmak için aşağıdaki pin gereklidir:
• CK: Verici saat çıkışı. Bu pin, SPI ana moduna karşılık gelen senkron iletim için verici veri
saatini verir (başlangıç biti ve durdurma biti üzerinde saat darbeleri ve son veri biti üzerine bir
saat atımı göndermek için bir yazılım seçeneği). Paralel veriler RX üzerinde eşzamanlı olarak
alınabilir. Bu, kaydırma kayıtlarına (örneğin, LCD sürücüleri) sahip çevre birimlerini kontrol etmek
için kullanılabilir. Saat fazı ve polarite yazılım programlanabilir. Akıllı kart modunda, CK akıllı
karta saat sağlayabilir.
Donanım akış kontrol modunda aşağıdaki pinler gereklidir:
• CTS: Göndermek İçin Temizle, yüksek hızdayken geçerli aktarımın sonunda veri iletimini
engeller.
• RTS: Gönderme talebi USART'ın bir veri almaya hazır olduğunu gösterir (düşük olduğunda).

74
27.3 USART Fonksiyonel Özellikleri

Word uzunluğu, USART_CR1 kaydında M bitinin programlanmasıyla 8 veya 9 bit olarak


seçilebilir (bkz. Şekil 279).TX pini başlangıç biti sırasında düşük durumda. Durma biti sırasında
yüksek durumdadır. Bir Boşta karakteri, “1” in tüm bir karesi olarak yorumlanır ve ardından, bir
sonraki karenin veriyi içeren biti izlenir (“1” sayısı, durma bitlerinin sayısını içerecektir). Bir kare
dönemi için “0” s almak üzere bir Break karakteri yorumlanır. Kırılma çerçevesinin sonunda
verici, başlangıç biti onaylamak için 1 veya 2 durdurma biti (mantık “1” bit) ekler. İletim ve alım,

75
ortak bir baud hızı üreteci tarafından yönlendirilir, verici bit ve alıcı için etkinleştirme biti
ayarlandığında, EACI saati oluşturulur. Her bloğun detayları aşağıda verilmiştir.

Verici, M bit durumuna bağlı olarak 8 veya 9 bitlik veri kelimeleri gönderebilir. Aktarım
etkinleştirme biti (TE) ayarlandığında, aktarma kaydırma kaydındaki veriler TX piminde çıkar ve
ilgili uç CK piminde çıkar.

Karakter aktarımı

USART iletimi sırasında, veri TX pinindeki ilk önce en az anlamlı biti kaydırır. Bu modda,
USART_DR kaydı, dahili veriyolu ve gönderme kaydırma yazmacı arasındaki bir tampondan
(TDR) oluşur (bakınız Şekil 278).
Her karakter, bir bit periyodu için düşük bir mantık seviyesi olan bir başlangıç biti ile yapılır.
Karakter, yapılandırılabilir sayıda durdurma biti ile sonlandırılır.
Aşağıdaki durdurma bitleri USART: 0.5, 1, 1.5 ve 2 durdurma bitleri tarafından desteklenir.
Not: Veri iletimi sırasında TE bit sıfırlanmamalıdır. Sırasında TE bitini sıfırlama
iletim, baud hızı sayaçlarının donacağı için TX pinindeki verileri bozar. Aktarılan mevcut veriler
kaybolacak.
TE biti etkinleştirildikten sonra boş bir çerçeve gönderilecektir.
Yapılandırılabilir Durdurma Bitleri

76
Her karakterle iletilecek durdurma bitlerinin sayısı Kontrol kaydı 2'de, bitler 13, 12'de
programlanabilir.
1. 1 durdurma biti: Bu varsayılan değerdir.
2. 2 durdurma biti: Bu normal USART, tek kablolu ve modem modları tarafından desteklenir.
3. 0.5 durdurma biti: Smartcard modunda veri alırken kullanılacak.
4. 1.5 durdurma bitleri: Smartcard modunda veri iletirken ve alırken kullanılır.
Boş bir çerçeve iletimi, durdurma bitlerini içerecektir.
Bir ara aktarım, 10 düşük bit olacak, ardından yapılandırılan sayıda durdurma bitleri (m = 0
olduğunda) ve 11 düşük bit ve ardından yapılandırılmış sayıda durdurma biti (m = 1 olduğunda)
olacaktır. Uzun kırmaları (10/11 düşük bitten daha büyük uzunluktaki kırılma) iletmek mümkün
değildir.

Prosedür:

1. USART_CR1'de UE biti 1'e yazılarak USART'ı etkinleştirin.


2. Sözcük uzunluğunu tanımlamak için M bitini USART_CR1'de programlayın.
3. USART_CR2'deki durdurma bitlerinin sayısını programlayın.
4. Çoklu arabellek iletişimi gerçekleşecekse, USART_CR3'te DMA etkinliğini (DMAT) seçin.
Çoklu uyarı iletişiminde açıklandığı gibi DMA kaydını yapılandırın.
5. USART_BRR kaydını kullanarak istenen baud hızını seçin.
6. İlk geçiş olarak boş bir çerçeve göndermek için USART_CR1'deki TE biti ayarlayınız.
7. Verileri USART_DR kaydına göndermek için yazın (bu TXE bitini temizler). Tek bir tampon
durumunda iletilecek her veri için bunu tekrarlayın.
8. Son verileri USART_DR kaydına yazdıktan sonra, TC = 1 olana kadar bekleyin. Bu, son
karenin aktarımının tamamlandığını gösterir. Bu, örneğin USART devre dışı olduğunda veya son

77
iletimi bozmamak için Halt moduna girdiğinde gereklidir.

Tek bayt iletişim


TXE biti her zaman veri kaydına yazılarak temizlenir.
TXE biti donanım tarafından belirlenir ve şunu gösterir:
• Veriler TDR'den kaydırma yazmacına taşındı ve veri aktarımı başladı.
• TDR kaydı boş.
• Sonraki veriler, önceki verilerin üzerine yazılmadan USART_DR kaydına yazılabilir.
Bu bayrak TXEIE biti ayarlanmışsa bir kesme oluşturur.
Bir iletim gerçekleştiğinde, USART_DR kaydına bir yazma komutu, verileri TDR kaydında saklar
ve mevcut iletimin sonunda kaydırma yazmacında kopyalanır.
Herhangi bir iletim gerçekleşmediğinde, USART_DR kaydına bir yazma komutu verileri
doğrudan vardiya kaydına yerleştirir, veri aktarımı başlar ve TXE biti hemen ayarlanır.
Bir çerçeve iletilirse (durdurma bittikten sonra) ve TXE biti ayarlanmışsa, TC biti yüksek gider.
TCIE biti USART_CR1 kaydında ayarlanmışsa bir kesme oluşturulur.
Son veriyi USART_DR kaydına yazdıktan sonra, USART'ın devre dışı bırakılmasından önce
veya mikro denetleyicinin düşük güç moduna girmesine neden olmak için TC = 1'in beklenmesi
zorunludur (bkz. Şekil 281).
TC biti aşağıdaki yazılım dizisiyle temizlenir:
1. USART_SR kaydından bir okundu
2. USART_DR kaydına bir yazı

Not: TC biti ayrıca ‘0’ yazarak da temizlenebilir. Bu takas dizisi sadece Çok-fonksiyonlu
haberleşme için tavsiye edilir.

Note: The TC bit can also be cleared by writing a ‘0’ to it. This clearing sequence is
recommended only for Multibuffer communication.

78
Ayırma Karakterleri
SBK bitinin ayarlanması bir ayırma karakterini iletir. Ayırma çerçeve uzunluğu M bitine bağlıdır
(bkz. Şekil 279).

SBK biti ‘1’ olarak ayarlanmışsa, mevcut karakter aktarımını tamamladıktan sonra TX hattında bir
ayırma karakteri gönderilir. Bu bit, ayırma karakteri tamamlandığında (ayırma karakterinin stop biti
sırasında) donanım tarafından sıfırlanır. USART, bir sonraki karenin başlangıç bitinin tanınmasını
garantilemek için son bölme karesinin sonunda bir mantık 1 bit'i ekler.

Not: Yazılım, iletişimin kesilmesinden önce SBK bitini sıfırlarsa, ayırma karakteri iletilmez. İki
ardışık ayırma için, SBK biti önceki ayırma işleminden sonra ayarlanmalıdır.

Boş karakterler TE bitini ayarlamak, USART ilk veri çerçevesinden önce boş bir çerçeve
göndermesini sağlar.

27.3.3 Alıcı
USART, USART_CR1 kaydındaki M bitine bağlı olarak 8 veya 9 bitlik veri kelimeleri alabilir.

Başlangıç algılaması başlat


USART'ta, belirli bir numune dizisi tanındığında başlangıç biti algılanır. Bu dizi: 1 1 1 0 X 0 X 0 X
0 0 0 0. Bu bit, ayırma karakteri tamamlandığında (ayırma karakterinin stop biti sırasında) donanım
tarafından sıfırlanır. USART, bir sonraki karenin başlangıç bitinin tanınmasını garantilemek için
son bölme karesinin sonunda bir mantık 1 bit'i ekler.
Not: Yazılım, iletişimin kesilmesinden önce SBK bitini sıfırlarsa, ayırma karakteri iletilmez. İki
ardışık ayırma için, SBK biti önceki ayırma sonrasından sonra ayarlanmalıdır.

Boş karakterler

TE bitini ayarlamak, USART ilk veri çerçevesinden önce boş bir çerçeve göndermesini sağlar.

79
Not: Sıralama tamamlanmamışsa, başlangıç bit algılaması iptal edilir ve alıcı, düşen kenar için
beklediği boşta durumuna (hiçbir bayrak ayarlanmaz) döner.

Başlangıç biti onaylandı (RXNE bayrağı ayarlandı, RXNEIE = 1 ise kesilme meydana geldi) 3
örneklenmiş bit 0 olduğunda (3., 5. ve 7. bitlerde ilk örnekleme, 3 bit 0 ve ikinci örnekleme 8, 9.
ve 10. bitler de 0'da 3 bit bulur.

Başlangıç biti onaylandı (RXNE bayrağı ayarlandı, RXNEIE = 1 ise kesilme meydana geldi),
ancak her iki örnekleme için de 3 örneklemeli bitin en az 2'si 0 ise (3, 5. 7. bitler ve 8., 9. ve 10.
bitlerde örnekleme). Bu koşul sağlanmazsa, başlatma algılaması iptal edilir ve alıcı rölantiye
döner (bayrak ayarlanmaz).

Örneklerden biri için (3., 5. ve 7. bitlerde örnekleme veya 8., 9. ve 10. bitlerde örnekleme), 3 bitin
2'si 0'da bulunursa, başlangıç biti onaylanır ancak NE gürültü bayrağı bit ayarlandı.
USART yayını sırasında, veriler en azından RX pininden en az anlamlı olan bit'i kaydırır. Bu
modda, USART_DR kaydı, nternal veriyolu ve alınan kaydırma yazmacı arasındaki bir
arabellekten (RDR) oluşur.
Prosedür:
1. USART_CR1'de UE biti 1'e yazılarak USART'ı etkinleştirin.
2. Sözcük uzunluğunu tanımlamak için M bitini USART_CR1'de programlayın.
3. USART_CR2'deki durdurma bitlerinin sayısını programlayın.
4. Çok amaçlı iletişimin gerçekleşmesi durumunda USART_CR3'te DMA etkin (DMAR) öğesini
seçin. Çoklu uyarı iletişiminde açıklandığı gibi DMA kaydını yapılandırın. AŞAMA 3
5. Baud hızı register USART_BRR kullanarak istenen baud hızını seçin.
6. RE bit USART_CR1'i ayarlayın. Bu, bir başlangıç biti aramaya başlayan alıcıya olanak sağlar.
Bir karakter alındığında
• RXNE biti ayarlanmıştır. Kaydırma kaydının içeriğinin RDR'ye aktarıldığını gösterir. Diğer bir
deyişle, veri alındı ve okunabilir (yanı sıra onunla ilişkili hata bayrakları).
• RXNEIE biti ayarlandığında bir kesme oluşturulur.
• Alım sırasında bir çerçeve hatası, gürültü veya taşma hatası tespit edildiğinde hata bayrakları
ayarlanabilir.
• Çoklu blenderde, alınan her bayttan sonra RXNE ayarlanır ve Veri Kaydına okunan DMA
tarafından silinir.
• Tek arabellek modunda, RXNE bitinin temizlenmesi USART_DR kaydına okunan bir yazılım
tarafından gerçekleştirilir. RXNE bayrağı da ona bir sıfır yazılarak temizlenebilir. Bir taşma hatası
oluşmasını önlemek için RXNE bitinin bir sonraki karakterin alınmasının bitiminden önce
temizlenmesi gerekir.
Not: Veri alınırken RE biti sıfırlanmamalıdır. Eğer RE biti sırasında devre dışı bırakılırsa
Resepsiyon, mevcut bayt alımı iptal edilecektir.
Karakter kırmak
Bir break karakteri alındığında, USART bunu bir çerçeve hatası olarak ele alır.
Boşta karakter
Boş bir çerçeve tespit edildiğinde, IDLEIE biti ayarlanmışsa, veri alınan karakterle artı kesme
işlemiyle aynı prosedür uygulanır.
Taşma hatası

80
RXNE sıfırlanmadığında bir karakter alındığında bir overrun hatası oluşur. Veri, RXNE biti
temizlenene kadar kaydırma yazmacından RDR kaydına aktarılamaz.
RXNE bayrağı, alınan her bayttan sonra ayarlanır. Bir sonraki veri alındığında veya bir önceki
DMA talebi yapılmadığında RXNE bayrağı ayarlanmışsa bir taşma hatası oluşur. Bir taşma
hatası oluştuğunda:
• ORE biti ayarlanmıştır.
• RDR içeriği kaybolacaktır. USART_DR'ye bir okuma yapıldığında önceki veriler kullanılabilir.
• Vardiya yazmacının üzerine yazılacaktır. Bu noktadan sonra, taşma sırasında alınan herhangi
bir veri kaybolur.
• RXNEIE biti ayarlandığında veya hem EIE hem de DMAR bitleri ayarlandığında bir kesme
oluşturulur.
• ORE biti USART_SR yazmacına okunarak ve ardından USART_DR register okuma işlemi ile
resetlenir.
Not: ORE biti ayarlandığında, en az 1 verinin kaybolduğunu gösterir. İki tane
olasılıklar:
• RXNE = 1 ise, son geçerli
• Eğer RXNE = 1 ise, o zaman geçerli olan son veri RDR kayıt kütüğüne kaydedilir ve okunabilir,
• Eğer RXNE = 0 ise, o zaman geçerli olan en son verilerin okunmuş olduğu ve böylece RDR'de
okunacak bir şey olmadığı anlamına gelir. Bu durum, yeni (ve kayıp) veriler alınırken aynı
zamanda RDR'de son geçerli veriler okunduğunda ortaya çıkabilir. Okuma dizisi sırasında yeni
veriler alındığında da ortaya çıkabilir (USART_SR register okuma erişimi ve USART_DR okuma
erişimi arasında).
Gürültü hatası
Aşırı örnekleme teknikleri, geçerli gelen veriler ve gürültü arasında ayrım yaparak veri kurtarma
için kullanılır (senkronize mod hariç).

81
Table 191. Noise detection from sampled data
Sampled value NE status Received bit value Data validity
000 0 0 Valid
001 1 0 Not Valid
010 1 0 Not Valid
011 1 1 Not Valid
100 1 0 Not Valid
101 1 1 Not Valid
110 1 1 Not Valid
111 0 1 Valid

Bir yapı(struct) gürültü algılandığında:

NE, RXNE bit'in yükselen kenarında ayarlandı.

Geçersiz veriler, Shift register'dan USART_DR registerına aktarılır.

Tek bayt iletişiminde kesinti oluşmaz.Bununla birlikte, bu bit, kendisi de bir kesme oluşturan
RXNE bitiyle aynı zamanda yükselir. Çoklu arabellek iletişimi durumunda EIE biti UART CR3
kaydında ayarlanmışsa bir kesinti yapılacaktır.
NE biti USART_SR register okuma işlemi ile resetlenir, bunu USART_DR register okuma işlemi
takip eder.
Yapı(Struct) hatası
Bir yapı hatası şu durumlarda algılanır:
Durma biti, beklenmeyen zaman aşımı veya aşırı gürültüden sonra, beklenen zamanda alımda
tanınmadı.
Çerçeve hatası algılandığında:

FE biti donanım tarafından belirleni

Geçersiz veriler, Shift register'dan USART_DR registerına aktarılır.

Tek bayt iletişiminde kesinti oluşmaz.

Bununla birlikte, bu bit, kendisi de bir kesilme oluşturan RXNE bitiyle aynı zamanda
yükselir.Çoklu iletişim halinde iletişim durumunda, EIE biti USART_CR3 kaydında ayarlanmışsa
bir kesinti yapılacaktır.
FE biti USART_SR register okuma işlemi ve ardından USART_DR ile resetlenir.
Okuma işlemini kaydet.
Alınacak durdurma bitlerinin sayısı Kontrol Kaydı 2'nin kontrol bitleri aracılığıyla yapılandırılabilir
- normal modda 1 veya 2 olabilir ve Smartcard modunda 0,5 veya 1,5 olabilir.

82
0,5 Durma Biti (Smartcard modunda alım):0,5 durdurma biti için örnekleme yapılmaz.Sonuç
olarak, 0,5 durdurma biti seçildiğinde hiçbir çerçeve hatası ve kesinti çerçevesi algılanamaz.
1 Durma Biti: 1 durdurma için örnekleme Bit, 8., 9. ve 10. örneklerde yapılır.
1.5 Durdurma Bitleri (Akıllı kart modu): Smartcard modunda iletim yaparken, cihaz verilerin
doğru bir şekilde gönderildiğini kontrol etmelidir.Böylece, alıcı bloğu etkinleştirilmelidir
(USART_CR1 kaydında RE = 1) ve akıllı kart bir eşlik hatası tespit ederse durma biti kontrol
edilmelidir.Parite hatası durumunda, akıllı kart, örnekleme sırasında veri sinyalini düşük tutar -
NACK sinyali - çerçeve hatası olarak işaretlenir.Ardından, FE bayrağı, 1.5 durdurma bitinin
sonunda RXNE ile ayarlanır. 1.5 durdurma bitleri için örnekleme, 16, 17 ve 18. örneklerde yapılır
(durdurma bitinin başlangıcından sonraki 1 baud saat periyodu).1.5 stop biti 2 parçaya
ayrılabilir:hiçbir şeyin gerçekleşmediği bir 0,5 baud saat periyodu, ardından örneklemenin yarıya
kadar meydana geldiği 1 normal durma bit periyodu takip eder.3'e bakın. Daha fazla bilgi için
Bölüm 27.3.11.
2 Durdurma Bitleri: 2 durdurma biti için örnekleme, ilk durdurma bitinin 8., 9. ve 10. örneklerinde
yapılır.İlk durdurma biti sırasında bir çerçeve hatası tespit edilirse, çerçeveleme hatası bayrağı
ayarlanacaktır.İkinci durdurma biti, çerçeve hatası için kontrol edilmemiştir.RXNE bayrağı ilk
durdurma bitinin sonunda ayarlanacaktır.
27.3.4 Kademeli Baud Hızı Üretimi
Alıcı ve vericinin (Rx ve Tx) baud hızı, USARTDIV'in Mantis ve Fraksiyon değerlerinde
programlanan değer ile aynı değere ayarlanır.
Tx/ Rx baud
= (16*USARTDIV)
legend: fCK - Input clock to the peripheral (PCLK1 for USART2, 3, 4, 5 or PCLK2 for USART1)
USARTDIV, USART_BRR kaydında kodlanmış işaretsiz bir sabit nokta numarasıdır.
Not: Baud sayaçları, bir yazının ardından Baud kayıtlarının yeni değeri ile güncellenir
USART_BRR. Bu nedenle Baud hızı kayıt değeri iletişim sırasında değiştirilmemelidir.
USARTDIV'den USART_BRR kayıt değerlerinden nasıl elde edilir Örnek 1:
If DIV_Mantissa = 0d27 and DIV_Fraction = 0d12 (USART_BRR = 0x1BC), then Mantissa
(USARTDIV) = 0d27 Fraction (USARTDIV) = 12/16 = 0d0.75 Therefore USARTDIV = 0d27.75
Example 2:
To program USARTDIV = 0d25.62 This leads to:
DIV_Fraction = 16*0d0.62 = 0d9.92 The nearest real number is 0d10 = 0xA DIV_Mantissa =
mantissa (0d25.620) = 0d25 = 0x19 Then, USART_BRR = 0x19A hence USARTDIV = 0d25.625
Example 3:
To program USARTDIV = 0d50.99 This leads to:
DIV_Fraction = 16*0d0.99 = 0d15.84

83
The nearest real number is 0d16 = 0x10 => overflow of DIV_frac[3:0] => carry must be added up
to the mantissa
DIV_Mantissa = mantissa (0d50.990 + carry) = 0d51 = 0x33 Then, USART_BRR = 0x330 hence
USARTDIV = 0d51.000
Table 192. Error calculation for programmed baud rates

Baud rate fPCLK = 36 MHz fPCLK = 72 MHz

S.No in Kbps Actual Value programmed % Error(1) Actual Value programmed % Error(1)
in the Baud Rate in the Baud Rate
1. 2.4 2.400 register
937.5 0% 2.4 register
1875 0%
2. 9.6 9.600 234.375 0% 9.6 468.75 0%
3. 19.2 19.2 117.1875 0% 19.2 234.375 0%
4. 57.6 57.6 39.0625 0% 57.6 78.125 0.%
5. 115.2 115.384 19.5 0.15% 115.2 39.0625 0%
6. 230.4 230.769 9.75 0.16% 230.769 19.5 0.16%
7. 460.8 461.538 4.875 0.16% 461.538 9.75 0.16%
8. 921.6 923.076 2.4375 0.16% 923.076 4.875 0.16%
9. 2250 2250 1 0% 2250 2 0%
10. 4500 NA NA NA 4500 1 0%
1. Defined as (Calculated Baud Rate - Desired Baud Rate) / Desired Baud Rate.

Not: CPU saati ne kadar alçak olursa, belirli bir Baud hızı için doğruluk oranı o kadar düşük
olur.Erişilebilir baud hızının üst sınırı bu verilerle sabitlenebilir.
Only USART1 is clocked with PCLK2 (72 MHz max). Other USARTs are clocked with PCLK1
(36 MHz max).

84
typedef struct
{
uint32_t USART_BaudRate;
/*! <Bu üye USART iletişim baud hızını yapılandırır. Baud hızı aşağıdaki formül kullanılarak
hesaplanır:
* - TamsayıDivider = ((PCLKx) / (16 * (USART_InitStruct-> USART_BaudRate)))
- FractionalDivider = ((TamsayıDivider - ((u32) TamsayıDivider)) * 16) + 0.5. */

uint16_t USART_WordLength;
/*! <Bir çerçevede iletilen veya alınan veri bitlerinin sayısını belirtir. Bu parametre, @REF
USART_Word_Length değeri olabilir. */

uint16_t USART_StopBits;
/*! <İletilen durdurma bitlerinin sayısını belirtir. Bu parametre, USRE_Stop_Bits öğesinin @ref değeri
olabilir. */

uint16_t USART_Parity;
/*! <Parite modunu belirtir. Bu parametre, USART_Parity değerinin bir değeri olabilir.
* @note Parite etkinleştirildiğinde, iletilen verilerin MSB konumuna hesaplanan parite eklenir (kelime
uzunluğu 9 veri biti olarak ayarlandığında 9. bit, kelime uzunluğu 8 veri biti ayarlandığında 8. bit). */

uint16_t USART_Mode;
/*! <Alma veya İletme modunun etkinleştirilip devre dışı bırakıldığını belirtir. Bu parametre,
USART_Mode öğesinin @ref değeri olabilir. */

uint16_t USART_HardwareFlowControl;
/*! <Donanım akış kontrol modunun etkin olup olmadığını belirtir. Bu parametre,
USRE_Hardware_Flow_Control öğesinin @ref değeri olabilir. */
} USART_InitTypeDef;

USART_StopBits

#define USART_StopBits_1 ((uint16_t)0x0000)


#define USART_StopBits_0_5 ((uint16_t)0x1000)
#define USART_StopBits_2 ((uint16_t)0x2000)
#define USART_StopBits_1_5 ((uint16_t)0x3000)

USART_Parity

#define USART_Parity_No ((uint16_t)0x0000)


#define USART_Parity_Even ((uint16_t)0x0400)
#define USART_Parity_Odd ((uint16_t)0x0600)

USART_WordLength

#define USART_WordLength_8b ((uint16_t)0x0000)


#define USART_WordLength_9b ((uint16_t)0x1000)

USART_HardwareFlowControl

#define USART_HardwareFlowControl_None ((uint16_t)0x0000)


#define USART_HardwareFlowControl_RTS ((uint16_t)0x0100)
#define USART_HardwareFlowControl_CTS ((uint16_t)0x0200)
#define USART_HardwareFlowControl_RTS_CTS ((uint16_t)0x0300)

USART_Mode
#define USART_Mode_Rx ((uint16_t)0x0004)
#define USART_Mode_Tx ((uint16_t)0x0008)

85
Standart Kütüphane Kullanarak USART3 ile Haberleşme Örnek Yazılımı inceleyiniz.

#include "clock_io_conf.h"
#include "misc.h"

void GPIOA_Yapilandir(void);
void led_toggle(void);
void USART_Mesaj_Gonder(volatile char *mesaj);

int main(void)
{
clock_conf(); // Harici kütüphaneden çağıtıyoruz.
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // USART3 B10 VE B11 PİNLERİ KULLANILACAK

GPIOA_Yapilandir();

NVIC_InitTypeDef NVIC_USART_Kesme_Yapilandir;
NVIC_USART_Kesme_Yapilandir.NVIC_IRQChannel = USART3_IRQn;
NVIC_USART_Kesme_Yapilandir.NVIC_IRQChannelCmd = ENABLE;
NVIC_USART_Kesme_Yapilandir.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_USART_Kesme_Yapilandir.NVIC_IRQChannelSubPriority = 0;
NVIC_Init(&NVIC_USART_Kesme_Yapilandir);

GPIO_InitTypeDef GPIO_USART_Yapilandir; // Port B Pin 10 USART Tx için yapılandırılacak.


GPIO_USART_Yapilandir.GPIO_Pin = GPIO_Pin_10;
GPIO_USART_Yapilandir.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_USART_Yapilandir.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOB, &GPIO_USART_Yapilandir);

GPIO_USART_Yapilandir.GPIO_Pin = GPIO_Pin_11; // Port B Pin 10 USART Rx için yapılandırılacak.


GPIO_USART_Yapilandir.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_USART_Yapilandir.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB, &GPIO_USART_Yapilandir);

USART_InitTypeDef USART3_Yapilandir;
USART3_Yapilandir.USART_BaudRate = 9600;
USART3_Yapilandir.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART3_Yapilandir.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART3_Yapilandir.USART_Parity = USART_Parity_No;
USART3_Yapilandir.USART_StopBits = USART_StopBits_1;
USART3_Yapilandir.USART_WordLength = USART_WordLength_8b;
USART_Init(USART3, &USART3_Yapilandir);

USART_Cmd(USART3, ENABLE);
USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);
USART_Mesaj_Gonder(" Merhaba Mekatronikciler\n");
for(;;);
}
void GPIOA_Yapilandir(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // LED TOGGLE
GPIO_InitTypeDef gpio_yapilandir_baslat = {GPIO_Pin_0, GPIO_Speed_50MHz, GPIO_Mode_Out_PP };
GPIO_Init(GPIOA, &gpio_yapilandir_baslat);
GPIO_SetBits(GPIOA, GPIO_Pin_0);
}

void led_toggle(void)
{
uint16_t led_bit = GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_0);

if(led_bit == (uint16_t)Bit_SET)
{
GPIO_ResetBits(GPIOA,GPIO_Pin_0);
}
else
{

86
GPIO_SetBits(GPIOA,GPIO_Pin_0);
}
}

void USART_Mesaj_Gonder(volatile char *mesaj)


{
while(*mesaj)
{
USART_SendData(USART3,*mesaj++);
while(USART_GetFlagStatus(USART3,USART_FLAG_TC)==RESET)
{}
}
}

void USART3_IRQHandler(void)
{
//if(USART3->SR & USART_FLAG_RXNE) != (u16)RESET)
if(USART_GetITStatus(USART3,USART_IT_RXNE))
{
if((char)USART_ReceiveData(USART3) =='a')
{
led_toggle();
USART_Mesaj_Gonder(" LED TOGGLED\n");
while(USART_GetFlagStatus(USART3,USART_FLAG_TC)==RESET)
{}
}
}
}

87
ANALOG - DİGİTAL DÖNÜŞTÜRÜCÜ (ADC CONVERTER)

ADC Donanım Bloğu


STM32F103 mikrodenetleyicide bulunan analog-dijital dönüştürücü (ADC) bloklarına 12-bit
analog dönüştürücü bulunmaktadır. Bunlar Onaltı harici ve iki dahili kaynaktan gelen sinyalleri
ölçmek için 18'e kadar çoklanmış kanala sahiptir. Farklı kanalların A/D dönüşümü, tek, sürekli,
tarama veya kesintili modda gerçekleştirilebilir. ADC'nin sonucu, sola hizalanmış veya sağa
hizalanmış 16 bitlik bir veri kaydında saklanır. Analog watchdog özelliği, uygulamanın giriş
voltajının kullanıcı tanımlı yüksek veya düşük eşiklerin dışına çıkıp çıkmadığını tespit etmesine
izin verir. ADC giriş saati PCLK2 saatinden bir örnekleyici ile bölünür ve 14 MHz'yi aşmamalıdır.

ADC Ana Özellikleri


• 12 bit çözünürlüklüdür.
• Dönüşüm Sonu, Enjekte Edilen Dönüşüm Sonu ve Analog Watchdog olayında kesme oluşur.
• Tek ve sürekli dönüşüm modları vardır.
• Kanal 0’ın kanal ‘n’e otomatik dönüşümü için tarama modu vardır.
• Kendi kendine kalibrasyon yapabilir.
• Dahili veri tutarlılığı ile veri hizalanır.
• Kanal kanal programlanabilir örnekleme zamanı vardır.
• Hem düzenli hem de enjekte edilmiş dönüşüm için harici tetikleme seçeneği vardır.
• Süreksiz mod vardır.
• İkili mod (2 ADC veya daha fazla cihazlarda kullanılır)
• ADC dönüşüm zamanı:
 STM32F103xx performans hattı cihazları: 56 MHz'de 1 µs (72 MHz'de 1,17 µs)
 STM32F101xx erişim hattı cihazları: 28 MHz'de 1 µs (36 MHz'de 1,55 µs)
 STM32F102xx USB erişim hattı cihazları: 48 MHz'de 1,2 µs
 STM32F105xx ve STM32F107xx cihazları: 56 MHz'de 1 µs (72 MHz'de 1.17 µs)
• ADC güç gereksinimi: 2,4 V ila 3,6 V arasındadır.
• ADC giriş aralığı: VREF- <Vin <VREF +
• Normal kanal dönüşümü sırasında DMA isteği oluşturulur.
ADC'nin blok diyagramı, aşağıdaki şekil de gösterilmiştir.
VREF-, eğer varsa (pin paketine bağlı olarak), VSSA'ya bağlı olmalıdır

88
Gerçek ADC, şekilde gösterildiği merkezde bulunur. VDDA ve VSSA güç kaynağı hatları ve VREF
+ ve VREF- referans hatları mikroişlemcinin pinlerinden gelir. Ek olarak, bir saat sinyali ADCCLK
gereklidir ve mikro denetleyicide üretilir.

89
Şekil: Tek bir ADC’nin blok diyagramı

Analog giriş sinyalleri, ADCx_INxx kodlu mikrodenetleyici pinlerine bağlanır ve Analog mux adlı
bir çoklayıcı ile ADC'ye beslenir. Analog sinyalleri bağlamak için toplam 16 pin mevcuttur ve
çoklayıcı, çip sıcaklığı, güç ve referans hatlarının ölçülmesini sağlamak için ek üç girişi barındırır.
Uygun giriş pini, ADC kayıtlarından birinde bitlerin (beşi) ayarlanmasıyla seçilir (eğer biri bunu
manuel olarak yapmak isterse, ADCx_SQR3). Analog sinyallerin dijital sinyallerle bir şekilde
karışmaması ve giriş için kullanılan pinin analog olarak yapılandırılması gerektiğine dikkat
edilmelidir. ADC, dönüşüm sonucunu bir Normal veri kaydına (ADCx_DR) yazar. Burada x,
kullanılan ADC'nin dizinini gösterir (1, 2 veya 3).

ADC bloğu, mikrodenetleyicinin yardımı olmaksızın önceden bildirilen pinlerle en çok 16 ardışık
dönüşümü destekleyen donanım içerir; Biri ardışık dönüşümleri uygulamak istediğinde, ardışık
dönüşümlerin sayısı ve kullanılan giriş pinleri, dönüştürmeyi başlatmadan önce belirtilmelidir.
Bununla birlikte, dönüşümün sonucunu tutan sadece bir kayıt vardır, bu yüzden bir kullanıcı
programı, bir sonraki dönüşüm bitmeden veya önceki sonuç kaybolacak hale gelmeden önce
Düzenli veri kaydından ardışık sonuçlara dikkat etmelidir. DMA (doğrudan bellek erişimi)
donanımı, sonuçları zaman içinde taşımak için kullanılabilir

Tablo. 65 ADC pinleri


Adı Sinyal Tipi Açıklama
ADC için daha yüksek / pozitif referans voltajı,
VREF+
Giriş, analog referans pozitif 2,4v <VREF+ <= VDDA
analog güç kaynağı VDD’ye eşit olacak ve 2.4V
VDDA(1) Giriş, analog besleme
<VDDA <3.6V aralığında olmalıdır.
Giriş, analog referans
VREF-
negatif ADC için alt / negatif referans voltajı, VREF- = VSSA
VSSA(1) Giriş, analog besleme alanı VSS'ye eşit analog güç kaynağı için topraklama
ADCx_IN[15:0] Analog sinyaller 21 analog kanala kadar (2)
1. VDDA ve VSSA, SIRASIYLA VDD ve VSS'ye bağlı olmalıdır.
2. ADC I / O pinleri hakkında tüm detaylar için, ilgili cihaz veri sayfasının “Pinout ve pin tanımları”
bölümüne bakınız

ADC Açma Kapama Kontrolü


ADC, ADC_CR2 kaydındaki ADON biti ayarlanarak açılabilir. ADON biti ilk kez ayarlandığında,
ADC'yi Power Down modundan uyandırır. ADC açılış zamanı (Tstab) sonrasında ADON biti yazılım
tarafından ikinci kez ayarlandığında dönüşüm başlar. Dönüştürme durdurulabilir ve ADC bitini

90
sıfırlayarak ADC kapanır. Bu modda ADC neredeyse hiç güç tüketmez (sadece birkaç µA).

ADC Saati (Clock)


Saat Denetleyicisi tarafından sağlanan ADCCLK saati PCLK2 (APB2 saati) ile senkronizedir. RCC
kontrol ünitesi, ADC saati için özel programlanabilir bir ön ayarlayıcıya sahiptir, daha fazla bilgi
için Düşük, orta, yüksek ve Düşük yoğunluklu sıfırlama ve saat kontrolüne (RCC) bakın.

Kanal Seçimi
16 adet çoklandırılmış kanal vardır. Dönüşümleri iki grupta organize etmek mümkündür: Bunlar
düzenli dönüşüm ve enjekte dönüşüm. Bir grup, herhangi bir kanalda ve herhangi bir sırada
gerçekleştirilebilen bir dizi dönüşümden oluşur. Örneğin, dönüşüm aşağıdaki sırayla yapılabilir:
Ch3, Ch8, Ch2, Ch2, Ch0, Ch2, Ch2, Ch15.

• Normal grup, en fazla 16 dönüşümden oluşur. Normal kanallar ve dönüşüm sırasındaki


sıralamaları ADC_SQRx kayıtlarında seçilmelidir. Normal gruptaki toplam dönüşüm sayısı,
ADC_SQR1 kaydındaki L [3: 0] bitlerine yazılmalıdır.
• Enjekte edilen grup 4 dönüşümden oluşur. Enjekte edilen kanallar ve dönüşüm sırasındaki
sıraları ADC_JSQR kaydında seçilmelidir. Enjekte edilen gruptaki toplam dönüşüm sayısı,
ADC_JSQR kaydındaki L [1: 0] bitlerine yazılmalıdır.

Bir dönüşüm sırasında ADC_SQRx veya ADC_JSQR kayıtları değiştirilirse, geçerli dönüşüm
sıfırlanır ve yeni seçilen grubu dönüştürmek için ADC'ye yeni bir başlatma darbesi gönderilir.

Sıcaklık Sensörü / VREFINT Dahili Kanalları


Sıcaklık sensörü ADCx_IN16 kanalına bağlanır ve VREFINT dahili referans voltajı ADCx_IN17'ye
bağlanır. Bu iki dahili kanal, enjekte veya normal kanal olarak seçilebilir ve dönüştürülebilir.
Not: Sensör ve VREFINT sadece ana ADC1 çevre biriminde kullanılabilir.

Tek Dönüşüm Modu


Tek dönüşüm modunda ADC bir dönüşüm gerçekleştirilir. Bu mod, ADC_CR2 kaydındaki ADON
biti (yalnızca normal bir kanal için) veya harici bir tetikleyici (normal veya enjekte edilmiş bir
kanal için), CONT biti 0 iken ayarlanarak başlatılır.

Seçilen kanalın dönüşümü tamamlandığında:

91
• Normal bir kanal dönüştürülmüşse:
- Dönüştürülen veriler 16 bit ADC_DR kaydında saklanır,
- EOC (Dönüştürme Sonu) bayrağı ayarlanır,
- ve EOCIE ayarlanmışsa bir kesme oluşturulur daha sonar ADC durdurulur.

• Enjekte edilen bir kanal dönüştürülmüşse:


- Dönüştürülen veriler 16-bit ADC_DRJ1 kaydında saklanır,
- JEOC (Conversion Injected) bayrağı ayarlanır,
- ve JEOCIE biti ayarlanmışsa bir kesme oluşturulur daha sonar ADC durdurulur.

Sürekli Dönüşüm Modu


Sürekli dönüşüm modunda ADC, biter bitmez başka bir dönüşüm başlatır. Bu mod harici
tetikleme ile veya ADC_CR2 kaydında ADON biti ayarlanarak, CONT biti 1 iken başlatılır.
Her dönüşümden sonra:
• Normal bir kanal dönüştürülmüşse:
- Dönüştürülen veriler 16 bit ADC_DR kaydında saklanır,
- EOC (Dönüştürme Sonu) bayrağı ayarlanır,
- EOCIE ayarlanmışsa bir kesme oluşturulur.

• Enjekte edilen bir kanal dönüştürülmüşse:


- Dönüştürülen veriler 16-bit ADC_DRJ1 kaydında saklanır,
- JEOC (Conversion Injected) bayrağı ayarlanır
- JEOCIE biti ayarlandığında bir kesme oluşturulur.

Zamanlama Diyagramı
Şekil’de gösterildiği gibi, ADC doğru bir şekilde dönüştürmeye başlamadan önce tSTAB'nin bir
stabilizasyon süresine ihtiyaç duyar. ADC dönüşümü başladıktan ve 14 çevrim döngüsünden
sonra, EOC bayrağı ayarlanır ve 16 bit ADC Veri kaydı, dönüşümün sonucunu içerir.

92
Şekil. Zamanlama diyagramı

Analog Watchdog
AWC analog watchdog durum biti, ADC tarafından dönüştürülen analog voltaj düşük bir eşiğin
altındaysa veya yüksek bir eşiğin üzerinde ise ayarlanır. Bu eşikler, ADC_HTR ve ADC_LTR 16-
bit kayıtlarının en az 12 bitinde programlanır. Bir kesme, ADC_CR1 kaydındaki AWDIE biti
kullanılarak etkinleştirilebilir.

Eşik değeri, ADC_CR2 kaydındaki hizalama biti tarafından seçilen hizalamadan bağımsızdır.
Karşılaştırma, hizalamadan önce yapılır (bkz. Bölüm 11.5).

Tarama (Scan Mode) Modu


Bu mod, bir grup analog kanalı taramak için kullanılır. Tarama modu, ADC_CR1 kaydındaki
tarama biti ayarlanarak seçilebilir. Bu bit ayarlandıktan sonra ADC, ADC_SQRx kayıtlarında
(normal kanallar için) veya ADC_JSQR'de (enjekte edilen kanallar için) seçilen tüm kanalları tarar.
Grubun her kanalı için tek bir dönüşüm gerçekleştirilir. Her dönüşüm bitiminden sonra grubun bir
sonraki kanalı otomatik olarak dönüştürülür. CONT biti ayarlanmışsa, son seçilen grup kanalında
dönüşüm durmaz, ancak ilk seçilen grup kanalından tekrar devam eder.
Tarama modunu kullanırken, DMA biti ayarlanmalı ve doğrudan bellek erişim denetleyicisi,
ADC_DR kaydının her güncellemesinden sonra normal grup kanallarının dönüştürülen verilerini
SRAM'ye aktarmak için kullanılır.
Enjekte edilen kanal dönüştürülmüş veriler daima ADC_JDRx kayıtlarında saklanır.

93
Enjekte Edilen Kanal Yönetimi (Tetiklemeli Enjeksiyon)
ADC'yi çevrimdeki bir dizi kanalda okunması için yapılandırabilirsiniz. Bu kanallar düzenli olarak
dönüştürülür. Enjekte edilen modda ise dönüştürme işlemi, harici bir olay veya yazılım tarafından
tetiklenir. Diğer bir ifade ile enjekte edilen mod, bazı tetikleme (zamanlayıcı veya başka bir şey)
nedeniyle normal kanalların dönüştürülmesi sırasında ADC dönüşümünün "enjekte edilebildiği" bir
moddur. Bu, örneğin motor kontrol uygulamasında, bir olayın tamamlanmasına (transistör
anahtarlama gibi) kadar dönüşümün geciktirilmesini sağlamakta, böylece dönüşüm gürültüsü
azaltılmaktadır.

Enjekte edilen bir dönüşüm, "normal" dönüşümle karşılaştırıldığında daha yüksek önceliğe sahiptir
ve bu nedenle, normal dönüşümleri kesintiye uğratır. Tetiklemeli enjeksiyon kullanmak için,
JAUTO biti temizlenmeli ve SCAN biti ADC_CR1 kaydında ayarlanmalıdır.

1. Bir grup normal kanalın harici tetikleme ile veya ADC_CR2 kaydındaki ADON biti ayarlanarak
dönüştürülmesini başlatılır,
2. Normal grup kanalı dönüşümü sırasında harici bir enjekte tetikleyici ortaya çıkarsa, mevcut
dönüşüm sıfırlanır ve enjekte edilen kanal dizisi bir kere Tara modunda dönüştürülür.
3. Daha sonra, düzenli grup kanalı dönüşümü son kesintili düzenli dönüşümden devam eder. Enjekte
edilen bir dönüşüm sırasında olağan bir olay meydana gelirse, kesintiye uğrar, ancak düzenli dizi,
enjekte edilen dizinin sonunda yürütülür. Şekil 25, zamanlama diyagramını göstermektedir.
Not: Tetiklemeli enjeksiyon kullanıldığında, tetikleyici olaylar arasındaki aralık, daha uzun olmalıdır.
enjeksiyon dizisi. Örneğin, sıralama uzunluğu 28 ADC saat döngüsü ise (yani 1.5 saat periyodu
örnekleme süresine sahip iki dönüşüm), tetikleyiciler arasındaki minimum aralık 29 ADC saat
döngüsü olmalıdır.

94
Kalibrasyon
ADC'nin yerleşik bir otomatik kalibrasyon modu vardır. Kalibrasyon, dahili kapasitör
değişikliklerinden kaynaklanan hassasiyet hatalarını önemli ölçüde azaltır. Kalibrasyon sırasında,
her bir kapasitör için bir hata düzeltme kodu (dijital sözcük) hesaplanır ve sonraki tüm dönüşümler
sırasında, her bir kapasitörün hata katkısı bu kod kullanılarak kaldırılır.

Şekil Kalibrasyon zamanlama diyagramı

Kalibrasyon, ADC_CR2 kaydındaki CAL biti ayarlanarak başlatılır. Kalibrasyon bittiğinde CAL biti
donanım tarafından sıfırlanır ve normal dönüşüm gerçekleştirilebilir. Açılışta ADC'yi bir kez kalibre
etmeniz önerilir. Kalibrasyon aşamaları biter bitmez kalibrasyon kodları ADC_DR'de saklanır. Her
açılıştan sonra bir kalibrasyon yapılması tavsiye edilir. Bir kalibrasyona başlamadan önce, ADC
en az iki ADC saat döngüsü için güç açık durumunda olmalıdır (ADON bit = ‘1’).

95
Veri Hizalama
ADC_CR2 kaydındaki ALIGN biti, dönüşümden sonra saklanan verilerin hizalanmasını seçer.
Veriler, Şekil 27 ve Şekil 28'de gösterildiği gibi sola veya sağa hizalanabilir. Enjekte edilen grup
kanalları dönüştürülmüş veri değeri, ADC_JOFRx kayıtlarında yazılı kullanıcı tanımlı ofset ile
azaltılır, böylece sonuç negatif bir değer olabilir. SEXT bit, genişletilmiş işaret değeridir. Normal
grup kanalları için herhangi bir ofset çıkarılmaz, bu yüzden sadece on iki bit önemlidir.

DMA İsteği
Dönüştürülen normal kanalların değeri, tek bir veri kaydında saklandığından, birden fazla normal
kanalın dönüştürülmesi için DMA kullanılması gerekir. Bu, ADC_DR kaydında önceden
depolanmış verilerin kaybolmasını önler. Normal bir kanalın sadece dönüştürülmesinin sonu,
dönüştürülmüş verilerin ADC_DR kayıttan kullanıcı tarafından seçilen hedef lokasyona
aktarılmasını sağlayan bir DMA isteği yaratır.

Not: Sadece ADC1 ve ADC3 bu DMA özelliğine sahiptir. ADC2 dönüştürülmüş veriler, ana ADC1
sayesinde DMA kullanılarak çift ADC modunda aktarılabilir.

Kanal-Kanal Programlanabilir Örnekleme Zamanı


ADC, ADC_SMPR1 ve ADC_SMPR2 kayıtlarındaki SMP [2: 0] bitleri kullanılarak değiştirilebilen

96
bir dizi ADC_CLK döngüsü için giriş voltajını örnekler. Her kanal farklı bir örnekleme zamanı ile
örneklenebilir.
Toplam dönüşüm süresi aşağıdaki gibi hesaplanır:
Tconv = Örnekleme zamanı + 12,5 çevrim süresi
Örnek:
ADCCLK = 14 MHz ve 1.5 çevrim örnekleme süresiyle:
Tconv = 1,5 + 12,5 = 14 çevrim zamanı = 1 µs

Harici Tetikleme İle Dönüşüm


Dönüştürme, harici bir olay tarafından tetiklenebilir (ör., Zamanlayıcı yakalama, EXTI hattı). EXT-
TRIG kontrol biti ayarlanmışsa, harici olaylar bir dönüşümü başlatabilir. EXT-SEL [2: 0] ve
JEXTSEL [2: 0] kontrol bitleri, uygulamanın olası 8 olaydan hangisinin düzenli ve enjekte edilmiş
gruplar için dönüşümü tetikleyebileceğini seçmesine izin verir.

Not: ADC düzenli veya enjekte edilmiş dönüşüm için harici bir tetikleyici seçildiğinde, sadece
sinyalin yükselen kenarı dönüştürmeyi başlatır.

ADC Yazılım Bloğu


ADC bloğu, ADC bloğunun belirlenmiş kayıtlarında bitlerin manipüle edilmesiyle konfigüre
edilebilir. Bununla birlikte, bu, ADC'nin donanımı hakkında ayrıntılı bilgi gerektirir ve CMSIS
kütüphanesinde mevcut işlevleri kullanmak çok daha kolaydır. Bitleri gerçekten işleyen süreçler,
"stm32f10x_adc.c" kaynak dosyasında saklanır ve bu işlevlere eşlik edecek tanımlar ve veri
yapıları "stm32f10x_adc.h" başlık dosyasında saklanır. Bunlardan başlık dosyası kullanıcı
programına dahil edilmelidir.

Analog sinyalleri girmek için kullanılacak pinlerin önce yapılandırılması gerekmektedir. Analog
sinyal giriş pinleri Analog pin olarak tanımlanmalı, sonlandırma dirençleri olmamalıdır. Bu işlemi
gerçekleştirmek için aşağıdaki adımlar gerçekleştirilir.

- Kullanılan ADC'ler için saati etkinleştirin.


- STM32F10x içindeki ADC için geçerli kontrol devresini yapılandırın, "ADC_Init ()" işlevini ve ilgili
veri yapısını kullanın.

Aşağıdaki uygulamada ADC dönüşümüne bağlı olarak ledlerin yanması için GPIO yapılandırması

97
verilmiştir.

// A ve C portu için clock


RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOA, ENABLE);
// A portunun 1 ve 0 pin tanımlaması
GPIO_InitTypeDef GPIO_Kurulum1;
GPIO_Kurulum1.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Kurulum1.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_0;
GPIO_Kurulum1.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_Kurulum1);
// Cportunun 2 ve 3 pin tanımlaması
GPIO_InitTypeDef GPIO_Kurulum2;
GPIO_Kurulum2.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Kurulum2.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;
GPIO_Kurulum2.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_Kurulum2);

//ADC Kurulumu ADC1 Kanal 10 için kurulum C0 portu


GPIO_InitTypeDef GPIO_Kurulum3;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_Kurulum3.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Kurulum3.GPIO_Pin = GPIO_Pin_0 ; // that's ADC1 (PA1 on STM32)
GPIO_Init(GPIOC, &GPIO_Kurulum3);

//ADC saat sinyali kurulumu ADC en yüksek 14 mhz de çalışır 72 mhz 6 ya bölünmesi gerekir
RCC_ADCCLKConfig (RCC_PCLK2_Div6);
// ADC rcc register için saat sinyeli aktif
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);

ADC_InitTypeDef Veri Yapısının İncelenmesi


ADC bloğu, ADC bloğunun belirlenmiş kayıtların(register) konfigüre edilebilmesi için
ADC_InitTypeDef veri yapısı kullanılır. Burada dikkat edilirse tüm veri yapısı değişkenleri
uint32_t olarak tanımlanmıştır. Yukarıda bahsedilen yapılandırma işlemleri aşağıda yazılımsal
olarak tanımlanmıştır.

typedef struct
{
uint32_t ADC_Mode;
/*! <ADC'yi bağımsız veya çift modda çalışacak şekilde yapılandırır. Bu parametre, @ref
ADC_mode değeri olabilir. */

FunctionalState ADC_ScanConvMode;
/*! <Dönüştürmenin, Tarama (çok kanallı) veya Tek (tek kanal) modda gerçekleştirilip
gerçekleştirilmeyeceğini belirtir. Bu parametre ENABLE veya DISABLE olarak ayarlanabilir */

FunctionalState ADC_ContinuousConvMode;
/*! <Dönüştürmenin Sürekli veya Tekli modda gerçekleştirilip gerçekleştirilmeyeceğini
belirtir. Bu parametre ENABLE veya DISABLE olarak ayarlanabilir. */

uint32_t ADC_ExternalTrigConv;
/*! <Normal kanalların analogdan dijitale dönüştürülmesini başlatmak için kullanılan harici
tetikleyiciyi tanımlar. Bu parametre, @ref
ADC_external_trigger_sources_for_regular_channels_conversion değerinin bir değeri olabilir. */

98
uint32_t ADC_DataAlign;
/*! <ADC veri hizalamasının sola mı yoksa sağa mı olacağını belirtir. Bu parametre, @ref
ADC_data_align değeri olabilir */

uint8_t ADC_NbrOfChannel;
/*! <Normal kanal grubu için sıralayıcı kullanılarak dönüştürülecek ADC kanallarının sayısını
belirtir. Bu parametre 1 ile 16 arasında olmalıdır. */

} ADC_InitTypeDef;

ADC Yapılandırma İşlemi Yazılım Örneği 1

ADC_InitTypeDef ADC_Kur;// tüm yapılandırmanın ismi


ADC_Kur.ADC_Mode = ADC_Mode_Independent; // bağımsız mod. 6 adet adc modu mevcut. diğer
kanallardan bağımsız olarak seçtik
ADC_Kur.ADC_ScanConvMode = DISABLE;//birden fazla kanal taraması yapmak için. tek kanal
kulladnığımızdan gerek yok
ADC_Kur.ADC_ContinuousConvMode = ENABLE; // tekrarlanan devam eden bir çevirim kullanıyoruz
/*Analog olarak çevirilmiş ver 16-bit ADC_DR registerında saklanır. The EOC (End Of
Conversion)bayrağı aktif hale gelir – eğer bir kesme tanımlanırsa her çevirimde EOCIE set
olur */
ADC_Kur.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;// hangi kenar tetiklemesi ile çevirim
başlasın
ADC_Kur.ADC_DataAlign = ADC_DataAlign_Right;//veri register a kaydedileriken sağa yada sola
hizalı saklansın 12 bitlik adc için 32 bitlik ADC_JOFRx registerı kullanıyor. 16 sı pasif ilk
16 aktif 12 bitlik veri 16 haneye sağa yada sola hizalı kaydetme biçimi
ADC_Kur.ADC_NbrOfChannel = 10;// hangi ADC kanalı kullanıcaz
ADC_RegularChannelConfig(ADC1,ADC_Channel_10, 1,ADC_SampleTime_28Cycles5); //örnekleme zamanı.
genelde girişteki analog sinyalin 2 katı olamsı önerilir ne kadar örnek alınırsa o kadar
gürültüsüz ve temiz çevirim olur.

ADC_Init ( ADC1, &ADC_Kur); //set config of ADC1

// enable ADC
ADC_Cmd (ADC1,ENABLE); //ADC1 Aktif
//ADC kalibirasyon isteğe bağlıdır ama ilk açılışta yapılması tavsiye edilir
ADC_ResetCalibration(ADC1); // mevcut kalibirasyonu sıfırla
while(ADC_GetResetCalibrationStatus(ADC1));//tekrar başlaması için bekle
ADC_StartCalibration(ADC1); // yeniden başla
while(ADC_GetCalibrationStatus(ADC1));//kalibre oluncaya kadar bekle
// Dönüştürmeye başla
ADC_Cmd (ADC1,ENABLE); //enable ADC1
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //çevirime başla// sürekli çevirim modunda

while (1)
{AD_value = ADC_GetConversionValue(ADC1);// ADC verisini oku
if(AD_value>2000)
{GPIO_WriteBit(GPIOC, GPIO_Pin_2, Bit_SET);}
else{
if(AD_value>1500)
{GPIO_WriteBit(GPIOC, GPIO_Pin_3, Bit_SET);
GPIO_WriteBit(GPIOC, GPIO_Pin_2, Bit_RESET);}
else{
if(AD_value>1000)
{GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET);
GPIO_WriteBit(GPIOC, GPIO_Pin_3, Bit_RESET);}
else{
if(AD_value>500)
{GPIO_WriteBit(GPIOA, GPIO_Pin_1, Bit_SET);

99
GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET);}
else
{GPIO_WriteBit(GPIOA, GPIO_Pin_1, Bit_RESET);}

}}}}

ADC Verisini USART Üzerinden Gönderme İşlemi Yazılım Örneği 2 (ADC-USART1)


#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_usart.h"
#include "stm32f10x_adc.h"
#include "misc.h"

volatile char buffer[50] = {'\0'};

void usart_init(void)
{
/* USART1 ve GPIOA clock aktifle*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);

/* NVIC Yapılandır */
NVIC_InitTypeDef NVIC_InitStructure;
/* USARTx Interrupt yapılandır*/
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);

/* GPIO Yapılandır */
//GPIO_Configuration();
GPIO_InitTypeDef GPIO_InitStructure;

/* USART1 Tx (PA.09) alternate function push-pull olarak yapılandır*/


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

/* USART1 Rx (PA.10) input floating olarak yapılandır*/


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);

/* USART1 Yapılandır*/
//USART_Configuration();
USART_InitTypeDef USART_InitStructure;

/* USART1 yapılandırması ---------------------------------------------- -------- */


/* USART1 aşağıdaki gibi yapılandırılmıştır:
- BaudRate = 115200 baud
- Kelime Uzunluğu = 8 Bit
- Bir Durak Bit
- Parite yok
- Donanım akış kontrolü devre dışı (RTS ve CTS sinyalleri)
- Alma ve aktarma etkin
- USART Saat devre dışı
- USART CPOL: Saat aktif düşük
- USART CPHA: Veriler ortada yakalandı
- USART LastBit: Son veri bitinin saat atımı SCLK pinine gönderilmez
*/
USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;

100
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

USART_Init(USART1, &USART_InitStructure);

/* USART1 Aktifle */
USART_Cmd(USART1, ENABLE);

/* Enable the USART1 Receive interrupt: this interrupt is generated when the
USART1 veri kaydı (register) boş değil */
//USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);

void USARTSend(const unsigned char *pucBuffer, unsigned long ulCount)


{
// Gönderilecek daha fazla karakter olduğunda Döngüyü devam ettirir.
while(ulCount--)
{
USART_SendData(USART1, *pucBuffer++);// Last Version USART_SendData(USART1,(uint16_t)
*pucBuffer++);
/* Loop until the end of transmission */
while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
{}
}
}

void SetSysClockTo72(void)
{
ErrorStatus HSEStartUpStatus;
/* SYSCLK, HCLK, PCLK2 and PCLK1 configuration -----------------------------*/
/* RCC system reset(for debug purpose) */
RCC_DeInit();

/* Enable HSE */
RCC_HSEConfig( RCC_HSE_ON);

/* Wait till HSE is ready */


HSEStartUpStatus = RCC_WaitForHSEStartUp();

if (HSEStartUpStatus == SUCCESS)
{
/* Enable Prefetch Buffer */
//FLASH_PrefetchBufferCmd( FLASH_PrefetchBuffer_Enable);
/* Flash 2 wait state */
//FLASH_SetLatency( FLASH_Latency_2);
/* HCLK = SYSCLK */
RCC_HCLKConfig( RCC_SYSCLK_Div1);

/* PCLK2 = HCLK */
RCC_PCLK2Config( RCC_HCLK_Div1);

/* PCLK1 = HCLK/2 */
RCC_PCLK1Config( RCC_HCLK_Div2);

/* PLLCLK = 8MHz * 9 = 72 MHz */


RCC_PLLConfig(0x00010000, RCC_PLLMul_9);

/* Enable PLL */
RCC_PLLCmd( ENABLE);

/* Wait till PLL is ready */


while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
{}

/* Select PLL as system clock source */


RCC_SYSCLKConfig( RCC_SYSCLKSource_PLLCLK);

/* Wait till PLL is used as system clock source */

101
while (RCC_GetSYSCLKSource() != 0x08)
{}
}
else
{ /* If HSE fails to start-up, the application will have wrong clock configuration.
User can add here some code to deal with this error */
/* Go to infinite loop */
while (1)
{}
}
}

int main(void)
{
const unsigned char mytext[] = " Hello World!\r\n";
int adc_value;
SetSysClockTo72();
//USART1
usart_init();
USART_SendData(USART1, '\r');
USARTSend(mytext, sizeof(mytext));

//ADC
ADC_InitTypeDef ADC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
// ADC girişi (varsayılan GPIO durumu kayan giriştir)
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 ; // that's ADC1 (PA1 on STM32)
GPIO_Init(GPIOC, &GPIO_InitStructure);

//ADC saat hızı (max 14MHz --> 72/6=12MHz)


RCC_ADCCLKConfig (RCC_PCLK2_Div6);
// ADC sistem saatini etkinleştir
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);

// define ADC config


ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //Sürekli örnekleme modunda çalışıyoruz
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel = 10;

ADC_RegularChannelConfig(ADC1,ADC_Channel_10, 1,ADC_SampleTime_28Cycles5); // normal dönüşüm


yapılandırmasını tanımlar
ADC_Init ( ADC1, &ADC_InitStructure); // ADC1'in yapılandırmasını ayarla

// ADC Etkinleştir
ADC_Cmd (ADC1,ENABLE); //enable ADC1

// ADC kalibrasyonu (isteğe bağlı, ancak güç açıkken önerilir)


ADC_ResetCalibration(ADC1); // Reset previous calibration
while(ADC_GetResetCalibrationStatus(ADC1));
ADC_StartCalibration(ADC1); // Yeni kalibrasyona başla (o zaman ADC kapalı olmalıdır)
while(ADC_GetCalibrationStatus(ADC1));

// dönüşümü başlat
ADC_Cmd (ADC1,ENABLE); // ADC1 Etkinleştir
ADC_SoftwareStartConvCmd(ADC1, ENABLE); // dönüşümü başlat (sürekli modda olduğumuz için sonsuz
olacak)

while (1)
{
adc_value = ADC_GetConversionValue(ADC1);
sprintf(buffer, "%d\r\n", adc_value);
USARTSend(buffer, sizeof(buffer));
}
}

102

You might also like