Professional Documents
Culture Documents
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.
1
ARM V7TC Gerçek Zaman Özellikleri
1 - Korumalı hafıza(MPU).
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:
3
Şekil 1. Sistem mimarisi (düşük, orta, XL yoğunluklu cihazlar
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.
İ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
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 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.
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.
STM32CubeMX
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.
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
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.
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
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.
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.
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.
• 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.
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)
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
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 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.
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.
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.
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
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
Ö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.
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);
}
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);
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);
/* 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 */
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:
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.
CRL Kayıt:
48
CRH Kayıt:
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.
Bu kayıt tutucu (register) ile giriş olarak ayarlanan pinlerdeki lojik seviyeleri okunmaktadır.
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.
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.
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.
İ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();
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);
if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1) != 0) {
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);
55
HSEStartUpStatus = RCC_WaitForHSEStartUp();
if (HSEStartUpStatus == SUCCESS)
{
/* Prefetch Buffer etkinleştir*/
FLASH_PrefetchBufferCmd( FLASH_PrefetchBuffer_Enable);
/* 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)
{}
/* 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 */
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:
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.
Ö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:
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.
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.
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, 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
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.
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.
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)
Ç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
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.
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.
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.
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
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.*/
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
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;
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);
#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();
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) {
}
}
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
DMA
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
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:
77
iletimi bozmamak için Halt moduna girdiğinde gereklidir.
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.
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
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:
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
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
USART_Parity
USART_WordLength
USART_HardwareFlowControl
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);
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);
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 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)
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
90
sıfırlayarak ADC kapanır. Bu modda ADC neredeyse hiç güç tüketmez (sadece birkaç µA).
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.
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.
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.
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).
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.
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.
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
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.
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.
Aşağıdaki uygulamada ADC dönüşümüne bağlı olarak ledlerin yanması için GPIO yapılandırması
97
verilmiştir.
//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);
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;
// 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);}
}}}}
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 Yapılandır*/
//USART_Configuration();
USART_InitTypeDef USART_InitStructure;
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 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);
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);
/* Enable PLL */
RCC_PLLCmd( ENABLE);
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 Etkinleştir
ADC_Cmd (ADC1,ENABLE); //enable 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