ARM Ders Notları. SysCtlClockSet( SYSCTL_SYSDIV_4 SYSCTL_USE_PLL SYSCTL_OSC_MAIN SYSCTL_XTAL_8MHZ);



Benzer belgeler
Timer. Suhap SAHIN {\} /\

SysTick Kesmesi. Suhap SAHIN {\} /\

BM-311 Bilgisayar Mimarisi

BM-311 Bilgisayar Mimarisi. Hazırlayan: M.Ali Akcayol Gazi Üniversitesi Bilgisayar Mühendisliği Bölümü

Sistem Programlama Deney 1

BÖLÜM 7 XTAL2 XTAL1. Vss. Şekil Mikrodenetleyicisi osilatör bağlantı şekli. Bir Makine Çevrimi = 12 Osilatör Periyodu

C-Serisi PLC İleri Seviye Eğitim

Program Kodları. void main() { trisb=0; portb=0; while(1) { portb.b5=1; delay_ms(1000); portb.b5=0; delay_ms(1000); } }

TIMER. SABANCI ATL ÖĞRETMENLERİNDEN YAVUZ AYDIN ve UMUT MAYETİN'E VERDİKLERİ DESTEK İÇİN TEŞEKKÜR EDİYORUZ

8086 nın Bacak Bağlantısı ve İşlevleri. 8086, 16-bit veri yoluna (data bus) 8088 ise 8- bit veri yoluna sahip16-bit mikroişlemcilerdir.

BÖLÜM 6 Seri Port Đşlemleri

DENEY 9-A : PIC 16F877 ve LM-35 ile SICAKLIK ÖLÇÜM UYGULAMASI

LCD (Liquid Crystal Display )

Arduino nedir? Arduino donanım ve yazılımın kolayca kullanılmasına dayalı bir açık kaynak elektronik platformdur.

İSTANBUL TİCARET ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ MİKROİŞLEMCİLİ SİSTEM LABORATUVARI KESMELİ GİRİŞ/ÇIKIŞ

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

Mikrobilgisayar Donanımı

BM-311 Bilgisayar Mimarisi

Mikrokontrolcu Portları {\} /\ Suhap SAHIN

Erzurum Teknik Üniversitesi RobETÜ Kulübü Robot Eğitimleri. ARDUİNO EĞİTİMLERİ I Arş. Gör. Nurullah Gülmüş

void setup() fonksiyonu: Bu fonksiyon program ilk açıldığında bir kere çalışır ve gerekli kalibrasyon, setup komutlarını buraya yazarız.

KONTROL VE OTOMASYON KULÜBÜ

EEProm 24C08 UYGULAMA AMAÇ 24C08 MCU_VCC. e r : d e G. Sayfa - 1

BÖLÜM Mikrodenetleyicisine Giriş

Configuration bitleri ve reset durumları hakkında kavramlar

TUŞ TAKIMI (KEYPAD) UYGULAMALARI

LCD (Liquid Crystal Display)

İSTANBUL TİCARET ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ MİKROİŞLEMCİLİ SİSTEM LABORATUVARI OLAYLARI ZAMANLAMA

MIKRODENETLEYICILER. Ege Üniversitesi Ege MYO Mekatronik Programı

BLGM423 Gömülü Sistem Tasarımı

NB Ekran Seri Port Üzerinden Veri Okuma/Yazma. Genel Bilgi Protokol Oluşturma Veri Okuma Veri Yazma

LPC2104 Mikro Denetleyicisini KEIL İle Programlamak

Deney 4. Gerçek Zamanlı Kesme Uygulamaları

PIC ASSEMBLY VE MAKROLAR

İSTANBUL TİCARET ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ MİKROİŞLEMCİLİ SİSTEM LABORATUVARI OLAYLARI ZAMANLAMA

DENEY-2. SABANCI ATL ÖĞRETMENLERİNDEN YAVUZ AYDIN ve UMUT MAYETİN'E VERDİKLERİ DESTEK İÇİN TEŞEKKÜR EDİYORUZ

KOD PARÇACIKLARI 1 / 5

MIKRODENETLEYICILER. Ege Üniversitesi Ege MYO Mekatronik Programı

FPGA İLE UYGULAMA ÖRNEKLERİ FPGA ile Seri Haberleşme (RS232) Uygulaması

DENEY II RAPORU MİKROİŞLEMCİ UYGULAMALARI LABORATUVARI

DOĞU AKDENİZ ÜNİVERSİTESİ BAHAR BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ BLGM-324 BİLGİSAYAR MİMARİSİ

Cnc Designer. ZSynthesizer. ZSynthesizer Doküman No: 0001

PİC HAKKINDA KISA KISA BİLGİLER GİRİŞ/ÇIKIŞ PORTLARI

Alıcı Devresi; Sinyali şu şekilde modüle ediyoruz;

2 Kablolu Villa Zil Paneli

BMT 101 Algoritma ve Programlama I 11. Hafta. Yük. Müh. Köksal Gündoğdu 1

PROGRAMLAMAYA GİRİŞ FONKSİYONLAR

İSTANBUL TİCARET ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ MİKROİŞLEMCİLİ SİSTEM LABORATUARI MİKROİŞLEMCİLİ A/D DÖNÜŞTÜRÜCÜ

Bilgisayar Mühendisliğine Giriş. Yrd.Doç.Dr.Hacer KARACAN

PIC PROGRAMLAMA STEP MOTOR SÜRÜCÜ VE KONTROL AMAÇ NEDİR? Unipolar Step Motorlar. Uç TESPİTİ NASIL YAPILIR?

DENEY-5. SABANCI ATL ÖĞRETMENLERİNDEN YAVUZ AYDIN ve UMUT MAYETİN'E VERDİKLERİ DESTEK İÇİN TEŞEKKÜR EDİYORUZ

Mikroişlemciler. Microchip PIC

DENEY III RAPORU MİKROİŞLEMCİ UYGULAMALARI LABORATUVARI

MİKROİŞLEMCİLER LABORATUVARI İÇİN PROGRAM DERLEME VE YÜKLEME DOKÜMANI

Arduino Uno ile Hc-Sr04 ve Lcd Ekran Kullanarak Mesafe Ölçmek

«BM364» Veritabanı Uygulamaları

R-2R LADDER SWITCHES 8-BIT DAC SUCCESSIVE APPROXIMATION REGISTER 3-STATE BUFFERS

Adım Motoru: açıya adım. Şekil 8.2 tekyönlü. Lab 8. Siyah (A) Mavi ( B ) Kırmızı (B)

DERS 13 PIC 16F84 ile DONANIM SAYICI KULLANIMI İÇERİK KESME

1. LabVIEW ile Programlama

Programlamada Kullanılan Temel Parametreler

Giris {\} /\ Suhap SAHIN

SAYISAL TASARIM. Ege Üniversitesi Ege MYO Mekatronik Programı

BÖLÜM 6 RS232 SERİ İLETİŞİM İŞLEMLERİ

PIC Mikrodenetleyicileri

KOMUT TABLOSU İLE İLGİLİ AÇIKLAMALAR:

Zaman Değişkeni Tanımlama ve Yürürlükteki Zaman Değerini İfade Etme

Şekil. 64 Kelimelik Yığıtın Blok Şeması

Mikroçita. Mikroçita Rapor 2:

GW420. Kurutma Makinesi Bilgisayar Kullanım Klavuzu. Lütfen kurulumdan önce dikkatle okuyunuz.

DOĞU AKDENİZ ÜNİVERSİTESİ BAHAR BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ BLGM-324 BİLGİSAYAR MİMARİSİ DENEY #6

GMTCNT PLC ile MODBUS MASTER Haberleşmesi -MICNO Serisi Hız Kontrol ile Bağlantı-

MİKRODENETLEYİCİLER ÖRNEK PROGRAMLAR

ARDIŞIL DİYAGRAM YAPI DİYAGRAMI. Sistem Analizi ve Tasarımı Dersi

Bölüm 7 Gelişmiş Fonksiyon Komutları

DELTA PLC DE ZAMANLAYICILAR

Bölüm 13: Giriş-Çıkış (I/O) Sistemleri

Analog Sayısal Dönüşüm

MEB YÖK MESLEK YÜKSEKOKULLARI PROGRAM GELİŞTİRME PROJESİ. 1. Tipik bir mikrobilgisayar sistemin yapısı ve çalışması hakkında bilgi sahibi olabilme

Bahar Dönemi. Öğr.Gör. Vedat MARTTİN

Bu uygulama saatinde, dinamik sistemlerin simülasyonu (benzetimi) için geliştirilmiş olan, oldukça kullanışlı bir arayüz, Simulink, tanıtılacaktır.

Kullanıcı Klavuzu

PIC TABANLI, 4 BASAMAKLI VE SER

Algoritmalar, Akış Şemaları ve O() Karmaşıklık Notasyonu

PLS2 KOMUTU. Giriş PLS2 Komutunun Açıklanması Sonuç

INVT IVC1. -Kompakt Tip PLC. Marketing 2014 HM

Proje Teslimi: güz yarıyılı ikinci ders haftasında teslim edilecektir.

DERS 3 MİKROİŞLEMCİ SİSTEM MİMARİSİ. İçerik

DENEY-1. SABANCI ATL ÖĞRETMENLERİNDEN YAVUZ AYDIN ve UMUT MAYETİN'E VERDİKLERİ DESTEK İÇİN TEŞEKKÜR EDİYORUZ

FONKSİYONLAR. Gerçek hayattaki problemlerin çözümü için geliştirilen programlar çok büyük boyutlardadır.

VTIY DERS-4 YARDIMCI NOTLARI -2018

x86 Ailesi Mikroişlemciler ve Mikrobilgisayarlar

Adres Yolu (Address Bus) Bellek Birimi. Veri Yolu (Databus) Kontrol Yolu (Control bus) Şekil xxx. Mikrodenetleyici genel blok şeması

Melih Hilmi ULUDAĞ. Yazılım Mühendisi Mekatronik Mühendisi. a aittir.

İŞLETİM SİSTEMİ KATMANLARI (Çekirdek, kabuk ve diğer temel kavramlar) Bir işletim sisteminin yazılım tasarımında ele alınması gereken iki önemli konu

KASIRGA -4 Buyruk Tasarımı Belgesi Ankara

ETHK-20 MEYVE SEBZE KURUTUCU ISI POMPASI PLC KULLANIM KLAVUZU

CIF105 ve E5_C Sıcaklık kontrolcüler için Hızlı Fonksiyon Bloğu

Quiz:8086 Mikroişlemcisi Mimarisi ve Emirleri

int faktoriyel(int sayi) { int sonuc = 1; for(int i=sayi;i>0;i--) sonuc*=i; return sonuc; } int main() { int sayi = faktoriyel(5); }

Transkript:

Faz Kilitlemeli Döngü (Phase-Look-Loop)-PLL Normalde bir microdenetleyicinin çalışma hızı dışarıdaki bir kristal ile belirlenir. Stellaris EKK- LM3S1968 geliştirme kartının 8 MHz lik bir kristali vardır. Texas Instruments tarafından üretilen Tiva EK LM4F120XL, EK-TM4C123GXL ve EK-TM4C1294-XL kartlarının 16 MHz lik bir kristali var. Birçok microdenetleyicinin içinde yazılımın çalışma hızını ayarlamasını sağlayan bir faz kilitleme döngüsü (PLL) bulunur. Çalışma frekansı yazılımın çalışma hızı ile harcanan elektrik gücü arasında nasıl bir ilişki olacağını belirler. Daha yüksek frekanslarda çalışan bir microdenetleyici üzerindeki yazılımı hızlı çalıştıracaktır, fakat daha fazla güç tüketecektir. Daha yavaş bir frekans ise daha az güç tüketimi ve aynı zamanda daha az ısınma demektir. LM3S1969 ve TM4C microdenetleyicilerinin standart veri yolu (bus) hızı içerideki bir osilatör ile belirlenir. Bu başlangıçta PLL in aktif olmadığı anlamına da gelir. Örneğin LM3S1968 in hızı 12 MHz ± %30, TM4C nin içindeki osilatör ise 16 MHz ± %1 olarak çalışır. Microdenetleyicinin içindeki osilator dışarıdan bağlanacak bir kristale göre önemli ölçüde daha az hassastır fakat daha az güç tüketir. Bu nedenle yapacağımız birçok uygulamada veri yolu saatini (bus clock) içerideki osilatörü ve PLL i kullanarak elde edeceğiz. PLL i aktive etmenin iki yolu var. Birincisi yazılımın kütüphanesinin sağladığı fonksiyonu kullanmak, ikincisi ise saat registerlerine direkt olarak yazmaktır. Genelde kütüphane fonksiyonlarının kullanımı tercih edilmelidir. Bu şekilde çözüm daha sağlam ( az hatalı ) olacak ve yazılan kodun başka ortamlarda kullanımı kolaylaşacaktır. Fakat amaç microdenetleyicilerin çalışma prensiplerini öğrenmek olduğu için ikinci yöntemi kullanarak PLL in nasıl çalıştığını görmekte fayda vardır. Birinci olarak Stellaris/Tiva kütüphanesindeki SysCtlClockSet fonksiyonunu çağırıp hızı değiştirebiliriz. Bu fonksiyon sysctl.c dosyasında tanımlanmıştır. Bir LM3S sistemini 8MHz bir kristale ile 50 MHz hızda çalıştırmak istediğimizi varsayalım. İstenilen veri yolu hızı SYSCTL_SYSDIV_4 parametresi ile belirlenecektir. Bu durumda hız 200 MHZ in 4 ile bölünmesinden elde edilir. Kütüphane fonskiyonu PLL i SYSCTL_USE_PLL parametresi ile aktive eder. Ana osilatör (main oscillator) kristali dışarıdan sağlanan osilatördür. Son parametre dışarıdan bağlanan kristalin frekansını belirler. SysCtlClockSet( SYSCTL_SYSDIV_4 SYSCTL_USE_PLL SYSCTL_OSC_MAIN SYSCTL_XTAL_8MHZ); Başka bir örnek olarak bir LM3S microdenetleyiciyi 6 MHz kristal ile 20 MHz hızda çalıştırmak istediğimizi varsayalım. On ile bölmek 200 MHZ lik taban frekansı 20 MHz e düşürecektir. SysCtlClockSet( SYSCTL_SYSDIV_10 SYSCTL_USE_PLL SYSCTL_OSC_MAIN SYSCTL_XTAL_6MHZ); Celal Bayar Üniversitesi Manisa-2015 Sayfa 1

Bir TM4C sisteminin 16 MHz kristal ile 80 MHz hızda çalıştırılmak istendiğini kabul edelim. 200 MHz olan taban frekansı 2.5 ile bölmek veri yolu frekansını 80 MHz olarak belirleyecektir. SysCtlClockSet( SYSCTL_SYSDIV_2_5 SYSCTL_USE_PLL SYSCTL_OSC_MAIN SYSCTL_XTAL_16MHZ); Şekil 4.23 TM4C123 microdenetleyicilerde PLL dahil saat yapısının blok diyagramı Kodumuzun başka ortamlara port edilmesini kolaylaştırmak için mümkün olduğunca kütüphane fonksiyonlarını kullanmak faydalı olacaktır. PLL in çalışmasına bir örnek vermek için Şekil 4.23 i kullanacağız. Şekilde bir TM4C microdenetleyicisine dışarıdan bir kristalin bağlandığı görülmektedir. Stellaris/Tiva microdenetleyicilerindeki PLL de aynı prensiple çalışırlar. Tablo 4.9 işlemcinin çalışma hızını belirlemek için kullanılan saat register değerlerini göstermektedir. Ana osilatörünün çıkışı (Main Osc) kristal frekansı ile aynıdır. OSCSRC bitlerini 0 yaparak konrol multiplekserinin saat kaynağı olarak ana osilatörü seçmesini sağlayabiliriz. Program 4.6 bir microdenetleyicinin 16 MHz lik ana osilatör ile 80 MHz de çalıştırılmasını göstermektedir. 0) RCC2 kullan çünkü daha fazla seçenek sunar. 1) birinci adım BYPASS2 yi set etmektir (bit 11). Bu noktada PLL bypass edilmiş olur ve sistem saatini bölen bir şey yoktur. 2) İkinci adım dört XTAL bitini kullanarak kristal frekansını belirlemektir. Tablo 4.9 da verilen kodlar bu işlem için kullanılır. OSCSRC2 bitleri ana osilatörü seçmek için temizlenir (sıfır değeri atanır). Celal Bayar Üniversitesi Manisa-2015 Sayfa 2

3) Üçüncü adım PWRDN2 (bit 13) i temizleyerek PLL i aktive etmektir. 4) Dördüncü adım 7-bit olan SYSDIV2 alanını kullanarak saat bölücüyü configure edip aktive etmektir. Eğer 7-bitlik SYSDIV2 nin değeri n ise saat n+1 ile bölünür. 400 MHz lik PLL den 80 MHz elde etmek için 5 ile bölmek gerekir. Bu nedenle SYSDIV2 alanına 4 yazılmalıdır. 5) Beşinci adım PLL in istenilen değere gelmesini beklemektir. Bunun için SYSCTL_RIS_R alanındaki PLLRIS (bit 6) in yüksek değer almasını beklemek gerekir. 6) Son adım BYPASS2 bitini temizleyerek PLL i sisteme bağlamaktır. Bu programı başka microdenetleyicilerde kullanmak için kristal frekansını ve saat bölümünü değiştirmek gerekecektir. Tablo 4.9 A Tablo 4.9 B Celal Bayar Üniversitesi Manisa-2015 Sayfa 3

#define SYSDIV2 4 void PLL_Init(void) // 0) Use RCC2 SYSCTL_RCC2_R = 0x80000000; // USERCC2 // 1) bypass PLL while initializing SYSCTL_RCC2_R = 0x00000800; // BYPASS2, PLL bypass // 2) select the crystal value and oscillator source SYSCTL_RCC_R = (SYSCTL_RCC_R & ~0x000007C0) // clear bits 10-6 + 0x00000540; // 10101, configure for 16 MHz crystal SYSCTL_RCC2_R &= ~0x00000070; // configure for main oscillator source // 3) activate PLL by clearing PWRDN SYSCTL_RCC2_R &= ~0x00002000; // 4) set the desired system divider SYSCTL_RCC2_R = 0x40000000; // use 400 MHz PLL SYSCTL_RCC2_R = (SYSCTL_RCC2_R&~0x1FC00000)+(SYSDIV2<<22); // 80 MHz // 5) wait for the PLL to lock by polling PLLLRIS while((sysctl_ris_r&0x00000040)==0)}; // wait for PLLRIS bit // 6) enable use of PLL by clearing BYPASS SYSCTL_RCC2_R &= ~0x00000800; } Program 4.6a. TM4C123 sisteminin 16 MHz lik bir kristal ile 80 MHz de çalıştırılması PLL_Init ; 0) configure the system to use RCC2 for advanced features LDR R3, =SYSCTL_RCC2_R ; R3 = &SYSCTL_RCC2_R LDR R2, [R3] ORR R2, R2, #0x80000000 ; USERCC2 STR R2, [R3] ; 1) bypass PLL while initializing ORR R2, R2, #0x00000800 ; BYPASS2 STR R2, [R3] ; 2) select the crystal value and oscillator source LDR R1, =SYSCTL_RCC_R ; R1 =&SYSCTL_RCC_R LDR R0, [R1] BIC R0, R0, #0x000007C0 ; clear XTAL field ORR R0, R0, #0x00000540 ; configure for 16 MHz crystal BIC R2, R2, #0x00000070 ; MOSC ; 3) activate PLL by clearing PWRDN BIC R2, R2, #0x00002000 ; Power-Down PLL ; 4) set the desired system divider ORR R2, R2, #0x40000000 ; use 400 MHz PLL BIC R2, R2, #0x1FC00000 ; clear system clock divider field ADD R2, R2, #(SYSDIV2<<22) ; SYSDIV2 = 4 (80 MHz clock) STR R2, [R3] ; set RCC2 ; 5) wait for the PLL to lock by polling PLLLRIS LDR R1, =SYSCTL_RIS_R ; R1 = &SYSCTL_RIS_R PLL_Init_loop LDR R0, [R1] ; R0 = [R1] (value) ANDS R0, R0, #0x00000040 ; PLL RIS BEQ PLL_Init_loop ; if(r0 == 0), keep polling Celal Bayar Üniversitesi Manisa-2015 Sayfa 4

; 6) enable use of PLL by clearing BYPASS BIC R2, R2, #0x00000800 ; BYPASS2 STR R2, [R3] ; enable PLL ARM Ders Notları Program 4.6b. TM4C123 sisteminin 16 MHz lik bir kristal ile 80 MHz de çalıştırılması SysTick Zamanlayıcısı SysTick bekleme zamanları ve periyodik kesmeler oluşturmak için kullanılan basit bir sayaçtır. Bütün Cortex-M mikrodenetleyicileri içerisinde olduğu için yazılımınızda SySTick sayacını kullanmak taşınlabilirlik açısından bir sorun oluşturmaz. Yazılımınız diğer mikrodenetleyiciler üzerinde de kolayca çalışır. Tablo 4.10 SysTick için kullanılan Register tanımlarını göstermektedir. SysTick in temelinde bus frekansına uygun hızda aşağıya doğru sayan 24 bitlik bir sayaç var. SysTick zamanlayıcısı dört adımda başlatılabilir. İlk adımda ENABLE biti sıfırlanarak SysTick ayarlama işlemleri sırasında kapatılır. İkinci olarak RELOAD registerinin değeri girilir. Üçünçü olarak NVIC_ST_CURRENT_R registerine temizleme amacıyla değer yazılır. En son olarak NVIC_ST_CTRL_R kontrol registerine istediğmiz çalışma modu yazılır. CLK_SRC biti ana saati (core clock) seçecek şekilde ayarlanır. CLK_SRC=1 olmak zorundadır çünkü LM3S/TM4C familyasında dış saat desteklenmemiştir. Kitabın 9 uncu bölümünde kesmeleri çalıştırmak için INTEN bitini bir yapacağız. Fakat bu bölümde INTEN e sıfır yazarak kesmeleri aktif hale getirmeyeceğiz. Bundan sonra ENABLE bitini bir yaparak sayacı çalıştıracağız. CURRENT değeri 1 den 0 a geçtiğine COUNT bayrağı set edilir. Bir sonraki zaman diliminde CURRENT registerine RELOAD değeri yüklenir. Bu şekilde SysTick sayacı devamlı aşağıya doğru sayar. Eğer RELOAD değeri n ise, SysTick sayacı modülo n+1 mantığıyla çalışıp bu değerleri alır ( n, n-1, n-2 1, 0, n,n-1, ). Başka bir deyisle n+1 sayı sonra baştan sayılır. COUNT bayrağı bir kesme başlatmak için ayarlanabilir. Fakat bu ilk örneklerde kesmeler kullanılmayacaktır. Tablo 4.10 SysTick zamanlayıcısı registerleri Eğer PLL i mikrodenetleyiciyi 80 MHZ hızda çalıştırmaya göre ayarlayıp çalıştırırsak SysTick sayacı her 12.5 nano saniyede bir aşağıya sayar. Genel olarak veriyolu saatinin (bus clock) periyodu t ise COUNT bayrağı her (n+1)t zamanında bir olacaktır. NVIC_ST_CTRL_R control registeri okunarak 16 ıncı bit olan COUNT bayrağı elde edilir, sayaç ve bayrak tekrar sıfırlanır. Ayrıca NVIC_ST_CTRL_R registerine bir şey yazmak da sayaç ve bayrağın sıfırlanmasına sebep olur. Program 4.7 SysTick zamanlayıcısını bir zaman gecikmesi oluşturmak için kullanıyor. Örnek olarak kullanıcı SysTick_Wait10ms(123) prosedürünü çağırarak 1.23 saniyelik bir geçikme oluşturur. RELOAD registerine istenen geçikme değerine uygun şekilde bir sayı yazılır. Eğer program 4.6 da verilen PLL fonksiyonu çalıştırılırsa sayacın her döngüsü 12.5 ns olur. CURRENT Celal Bayar Üniversitesi Manisa-2015 Sayfa 5

registerine yazmak sayacı ve CTRL registerindeki COUNT bayrağını sıfırlayacaktır. SysTick zamanlayıcısı delay değişkeni içinde verilen sayı kadar aşağıya saydıktan sonra COUNT bayrağı bir olur ve döngü bitirilir. SysTick zamanlayıcısı 24 bit olduğu için SysTick_Wait ile en fazla 2 24 * 12.5 ns beklenebilir. Bu da yaklaşık 200 ms dir. Daha fazla beklemek için SysTick_Wait10msfonksiyonu SysTick_Wait i tekrarlı olarak çağırır. 800,000 * 12.5 ns nin 10 ms olduğuna dikkat edelim. voidsystick_init(void) NVIC_ST_CTRL_R = 0; // 1) disable SysTick during setup NVIC_ST_RELOAD_R = 0x00FFFFFF; // 2) maximum reload value NVIC_ST_CURRENT_R = 0; // 3) any write to current clears it NVIC_ST_CTRL_R = 0x00000005; // 4) enable SysTick with core clock } // The delay parameter is in units of the 80 MHz core clock. (12.5 ns) voidsystick_wait(uint32_t delay) NVIC_ST_RELOAD_R = delay-1; // number of counts to wait NVIC_ST_CURRENT_R = 0; // any value written to CURRENT clears while((nvic_st_ctrl_r&0x00010000)==0) }// wait for count flag } // 10000us equals 10ms void SysTick_Wait10ms(uint32_t delay) uint32_ti; for(i=0; i<delay; i++) SysTick_Wait(800000); // wait 10ms } } Program 4.7a. Timer functions that implement a time delay (SysTick_xxx.zip). SysTick_Init LDR R1, =NVIC_ST_CTRL_R MOV R0, #0 LDR R1, =NVIC_ST_RELOAD_R LDR R0, =0x00FFFFFF LDR R1, =NVIC_ST_CURRENT_R MOV R0, #0 LDR R1, =NVIC_ST_CTRL_R MOV R0, #0x05 BX LR ;------------SysTick_Wait------------ ; Time delay using busy wait. ; Input: R0 delay parameter in units of the core clock (20 nsec) ; Output: none ; Modifies: R0, R1, R3 SysTick_Wait LDR R1, =NVIC_ST_RELOAD_R SUB R0, #1 ;disable SysTick during setup ;R1 = &NVIC_ST_RELOAD_R ;maximum reload value ;[R1] = R0 = NVIC_ST_RELOAD_M ;R1 = &NVIC_ST_CURRENT_R ;any write to current clears it ;clear counter ;enable SysTick with core clock ;ENABLE and CLK_SRC bits set ;R1 = &NVIC_ST_RELOAD_R Celal Bayar Üniversitesi Manisa-2015 Sayfa 6

;delay-1, number of counts to wait LDR R1, =NVIC_ST_CTRL_R ;R1 = &NVIC_ST_CTRL_R SysTick_Wait_loop LDR R3, [R1] ;R3 = NVIC_ST_CTRL_R ANDS R3, R3, #0x00010000 ;Count set? BEQ SysTick_Wait_loop BX LR ;------------SysTick_Wait10ms------------ ; Time delay using busy wait. This assumes 50 MHz clock ; Input: R0 number of times to wait 10 ms before returning ; Output: none ; Modifies: R0 DELAY10MS EQU 500000 ;clock cycles in 10 ms (assumes 50 MHz clock) SysTick_Wait10ms PUSH R4, LR} ;save current value of R4 and LR MOVS R4, R0 ;R4 = R0 = remainingwaits BEQ SysTick_Wait10ms_done ;R4 == 0, done SysTick_Wait10ms_loop LDR R0, =DELAY10MS ;R0 = DELAY10MS BL SysTick_Wait ;wait 10 ms SUBS R4, R4, #1 ; R4 = R4 1 ;remainingwaits-- BHI SysTick_Wait10ms_loop ;if(r4 > 0), wait another 10 ms SysTick_Wait10ms_done POP R4, PC} Program 4.7b. Timer functions that implement a time delay (SysTick_xxxasm.zip). Celal Bayar Üniversitesi Manisa-2015 Sayfa 7