Mündəricat:

GPIO ARM MONTAJI - T.I. ROBOTİK SİSTEM Öyrənmə Kiti - LAB 6: 3 Addımlar
GPIO ARM MONTAJI - T.I. ROBOTİK SİSTEM Öyrənmə Kiti - LAB 6: 3 Addımlar

Video: GPIO ARM MONTAJI - T.I. ROBOTİK SİSTEM Öyrənmə Kiti - LAB 6: 3 Addımlar

Video: GPIO ARM MONTAJI - T.I. ROBOTİK SİSTEM Öyrənmə Kiti - LAB 6: 3 Addımlar
Video: skibidi toilet multiverse 023 bloopers 2024, Dekabr
Anonim
GPIO ARM MONTAJI - T. I. ROBOTİK SİSTEM Öyrənmə Kiti - LAB 6
GPIO ARM MONTAJI - T. I. ROBOTİK SİSTEM Öyrənmə Kiti - LAB 6

Salam, Texas Instruments TI-RSLK (MSP432 mikro nəzarətçisindən istifadə edir) istifadə edərək ARM qurğusunun öyrənilməsi ilə bağlı əvvəlki təlimatda, məsələn, T. I. Əlbəttə ki, bir reyestrə yazmaq və şərti döngə kimi bir çox əsas təlimatları keçdik. Eclipse IDE -dən istifadə edərək icra prosesinə keçdik.

Həyata keçirdiyimiz kiçik proqramların xarici dünya ilə heç bir əlaqəsi yoxdur.

Bir növ darıxdırıcı.

Bu gün giriş/çıxış limanları, xüsusən rəqəmsal GPIO pinləri haqqında bir az məlumat əldə edərək bunu bir qədər dəyişməyə çalışaq.

Elə olur ki, bu MSP432, bir neçə GPIO limanına bağlı olan iki düymə açarı, RGB LED və qırmızı LED olan bir inkişaf lövhəsinə gəlir.

Bu o deməkdir ki, bu pinləri montaj yolu ilə qurmağı və idarə etməyi öyrəndikcə, bu təsirləri vizual olaraq görə bilərik.

Ayıklayıcıdan keçməkdən daha maraqlıdır.

(Hələ addım atacağıq - bu bizim "gecikmə" funksiyamız olacaq):-D

Addım 1: RAM -dan Yazmağa / Oxumağa çalışaq

GPIO -ya daxil olmağa və onu idarə etməyə başlamazdan əvvəl kiçik bir addım atmalıyıq.

Standart bir yaddaş ünvanına oxumaq və yazmaqla başlayaq. Əvvəlki Təlimatlardan (oradakı şəkillərə baxın) bilirik ki, RAM 0x2000 0000 -dən başlayır, ona görə də həmin ünvandan istifadə edək.

Məlumatları bir əsas qeyd (R0) ilə 0x2000 0000 arasında köçürəcəyik.

Əsas bir fayl quruluşu və ya montaj proqramının məzmunu ilə başlayırıq. Zəhmət olmasa TI -nin Code Composer Studio (CCS) və bəzi nümunə layihələrindən istifadə edərək montaj layihəsi yaratmaq üçün bu Təlimata baxın.

.barmaq

.tekst. hizalama 2.qlobal əsas.thumbfunc əsas əsas:.asmfunc; ---------------------------------- -----------------------------------------------; (kodumuz bura gedəcək); ------------------------------------------ ---------------------------------------.endasmfunc.son

Bəzi bəyannamələr (direktivlər) olsaydı, yuxarı hissəyə yeni bir şey əlavə etmək istəyirəm. Sonradan daha aydın olacaq.

ACONST.set 0x20000000; bundan daha aşağı istifadə edəcəyik (sabitdir)

; Aydındır ki, '0x' aşağıdakıların hex dəyərini ifadə edir.

Beləliklə, başlanğıc fayl məzmunumuz indi belə görünür:

.barmaq

.text.align 2 ACONST.set 0x20000000; bundan daha aşağı istifadə edəcəyik (sabitdir); Aydındır ki, '0x' aşağıdakıların hex dəyərini ifadə edir..global əsas.thumbfunc əsas əsas:.asmfunc; --------------------------------------- ------------------------------------------; (kodumuz bura gedəcək); ------------------------------------------ ---------------------------------------.endasmfunc.son

İndi yuxarıda göstərilənlərə sahib olduğumuz üçün kəsikli xətlər arasına kod əlavə edək.

RAM yerinə yazmağa başlayırıq. Əvvəlcə RAM -a yazacağımız məlumat modelini, bir dəyər quracağıq. Bu dəyəri və ya məlumatı təyin etmək üçün əsas reyestrdən istifadə edirik.

Qeyd: unutmayın ki, kodda nöqtəli nöqtə (';') olan hər hansı bir xətt o nöqtəli nöqtədən sonra bütün şərhlər deməkdir.

;-----------------------------------------------------------------------------------------------

; YAZMA; ------------------------------------------------ ----------------------------------------------- MOV R0, #0x55; core register R0, RAM yerinə yazmaq istədiyimiz məlumatları ehtiva edir.; Aydındır ki, '0x' aşağıdakıların hex dəyərini ifadə edir.

Sonra, DONT -un işləmədiyinə dair ifadələrə nəzər salaq.

; MOV MOV, RAM yerinə məlumat yazmaq üçün əlverişli deyil.

; MOV yalnız reyestrə daxil olan dərhal məlumat üçündür; və ya bir reyestrdən digərinə; yəni MOV R1, R0.; STR STR istifadə etməlidir.; STR R0, = ACONST; İfadədə pis termin ('='); STR R0, 0x20000000; Mağaza təlimatı üçün qanunsuz ünvanlama rejimi; STR R0, ACONST; Mağaza təlimatı üçün qanunsuz ünvanlama rejimi

Çox izah etmədən yuxarıdakı 'ACONST' sözündən istifadə etməyə çalışdıq. Əslində, 0x20000000 kimi hərfi bir dəyər istifadə etmək əvəzinə bir durma və ya sabitdir.

Yuxarıdakıları istifadə edərək RAM yerinə yazmaq üçün yaza bilmədik. Başqa bir şeyi sınayaq.

; RAM yerini ehtiva edən başqa bir qeyd istifadə etməliyik

; həmin RAM yerinə MOV R1, #0x20000000 saxlamaq üçün sifariş verin; RAM yerini (məzmununu deyil, yerini) R1 olaraq təyin edin.; Aydındır ki, '0x' aşağıdakıların hex dəyərini ifadə edir. STR R0, [R1]; R1 (0x55) -də olanları RAM -a (0x20000000) R1 istifadə edərək yazın.; RAM yeri ünvanı olan başqa bir qeyd (R1) istifadə edirik; RAM yerinə yazmaq üçün.

Yuxarıdakıları etmənin başqa bir yolu, ancaq hərfi ünvan dəyəri yerinə 'ACONST' istifadə etmək:

; yenidən yuxarıdakıları edək, amma hərfi RAM yeri dəyəri yerinə simvol istifadə edək.

; 0x20000000 üçün stand-in olaraq 'ACONST' istifadə etmək istəyirik.; dərhal bir dəyəri ifadə etmək üçün '#' etməliyik; buna görə (yuxarıya baxın), '.set' direktivindən istifadə etməli olduq.; Bunu sübut etmək üçün R0 -dakı məlumat modelini dəyişək. MOV R0, #0xAA; tamam MOV R1, #ACONST STR R0, [R1] hərfi ünvan dəyəri əvəzinə simvolu istifadə edərək RAM -a yazmağa hazırıq.

Videoda bir az daha ətraflı məlumat verilir, həm də yaddaş yerindən oxumaqla addımlanır.

Əlavə edilmiş mənbə.asm faylına da baxa bilərsiniz.

Addım 2: Bəzi Əsas Liman Məlumatları

Image
Image
Bəzi Əsas Liman Məlumatları
Bəzi Əsas Liman Məlumatları
Bəzi Əsas Liman Məlumatları
Bəzi Əsas Liman Məlumatları

Bir RAM yerindən necə yazılacağını / oxunacağını yaxşı bildiyimizə görə, bu GPIO pinini necə idarə edəcəyimizi və istifadə edəcəyimizi daha yaxşı başa düşməyimizə kömək edəcək.

Beləliklə, GPIO pinləri ilə necə əlaqə qururuq? Bu mikro nəzarətçiyə və ARM təlimatlarına əvvəlki baxışımızdan, daxili qeydləri necə idarə edəcəyimizi və yaddaş (RAM) ünvanları ilə necə əlaqə qurmağı bilirik. Bəs GPIO sancaqları?

Belə olur ki, bu sancaqlar yaddaş xəritəsidir, buna görə də yaddaş ünvanları ilə eyni şəkildə davrana bilərik.

Bu o ünvanların nə olduğunu bilməyimiz deməkdir.

Aşağıda liman başlanğıc ünvanları verilmişdir. Yeri gəlmişkən, MSP432 üçün "liman" yalnız bir pin deyil, sancaqlar toplusudur. Raspberry Pi ilə tanışsınızsa, inanıram ki, buradakı vəziyyətdən fərqlidir.

Yuxarıdakı şəkildəki mavi dairələr, iki açar və LED üçün lövhədəki yazıları göstərir. Mavi xətlər əsl LEDləri göstərir. Baş atlayanlara toxunmaq məcburiyyətində qalmayacağıq.

Maraqlandığımız limanları aşağıda qalın yazdım.

  • GPIO P1: 0x4000 4C00 + 0 (cüt ünvanlar)
  • GPIO P2: 0x4000 4C00 + 1 (tək ünvanlar)
  • GPIO P3: 0x4000 4C00 + 20 (cüt ünvanlar)
  • GPIO P4: 0x4000 4C00 + 21 (tək ünvanlar)
  • GPIO P5: 0x4000 4C00 + 40 (cüt ünvanlar)
  • GPIO P6: 0x4000 4C00 + 41 (tək ünvanlar)
  • GPIO P7: 0x4000 4C00 + 60 (hətta ünvanlar)
  • GPIO P8: 0x4000 4C00 + 61 (tək ünvanlar)
  • GPIO P9: 0x4000 4C00 + 80 (cüt ünvanlar)
  • GPIO P10: 0x4000 4C00 + 81 (tək ünvanlar)

Hələ bitirməmişik. Daha çox məlumata ehtiyacımız var.

Limanı idarə etmək üçün bir neçə ünvana ehtiyacımız var. Bu səbəbdən yuxarıdakı siyahıda "cüt ünvanlar" və ya "tək ünvanlar" görürük.

I/O Ünvan Bloklarını Qeyd edin

Digər ünvanlara ehtiyacımız olacaq, məsələn:

  • Port 1 Giriş Qeydiyyat ünvanı = 0x40004C00
  • Port 1 Çıxış Qeydiyyatı ünvanı = 0x40004C02
  • Port 1 İstiqamət Qeydiyyat ünvanı = 0x40004C04
  • Port 1 0 Qeydiyyat ünvanı = 0x40004C0A seçin
  • Port 1 seçin 1 Qeydiyyat ünvanı = 0x40004C0C

Və başqalarına ehtiyacımız ola bilər.

Yaxşı, indi tək qırmızı LED -i idarə etmək üçün GPIO qeyd ünvanları aralığını bilirik.

Çox vacib bir qeyd: MSP432 LaunchPad lövhəsindəki hər bir I/O Portu bir neçə (adətən 8) pin və ya xətlərin toplusudur və hər biri fərdi olaraq giriş və ya çıxış olaraq təyin edilə bilər.

Bu, məsələn, "Port 1 İstiqamət Qeydiyyatı Ünvanı" üçün dəyərlər təyin edirsinizsə, bu ünvanda hansı biti (və ya bitləri) təyin etdiyiniz və ya dəyişdirdiyinizlə maraqlanmalı olduğunuz deməkdir. Bu barədə daha sonra.

GPIO Port Proqramlaşdırma Sırası

Nəhayət ehtiyac duyduğumuz parça, LED -i idarə etmək üçün istifadə ediləcək bir proses və ya alqoritmdir.

Birdəfəlik başlanğıc:

  • Normal GPIO funksiyası üçün P1.0 (P1SEL1REG: P1SEL0REG Qeydiyyatı) <--- 0x00, 0x00 konfiqurasiya edin.
  • P1DIRREG -in 1 -ci istiqamət qeyd bitini çıxış və ya YÜKSƏK olaraq təyin edin.

Döngü:

Qırmızı LED -i yandırmaq üçün P1OUTREG qeydinin 0 bitinə HIGH yazın

  • Gecikmə funksiyasına zəng edin
  • Qırmızı LED -i söndürmək üçün P1OUTREG qeydinin 0 bitinə LOW yazın
  • Gecikmə funksiyasına zəng edin
  • Döngəni təkrarlayın

Hansı giriş / çıxış funksiyası (SEL0 və SEL1 -i konfiqurasiya edin)

LaunchPad üzərindəki sancaqlar çox istifadə edir. Məsələn, eyni pin standart rəqəmsal GPIO ola bilər və ya UART və ya I2C seriyalı ünsiyyətdə də istifadə edilə bilər.

Bu pin üçün hər hansı bir xüsusi funksiyadan istifadə etmək üçün bu funksiyanı seçməlisiniz. Pin funksiyasını konfiqurasiya etməlisiniz.

Yuxarıda bu konsepsiyanı vizual formada izah etməyə çalışan bir görüntü var.

SEL0 və SEL1 ünvanları bir növ funksiya / xüsusiyyət seçimi kimi çıxış edən cüt birləşməsini təşkil edir.

Məqsədlərimiz üçün standart rəqəmsal GPIO -nun 0 bit olmasını istəyirik. Yəni SEL0 və SEL1 -in LOW olması üçün 0 -a ehtiyacımız var.

Liman Proqramlaşdırma Sırası (Yenə)

1. P1 SEL 0 Qeydinə 0x00 yazın (ünvan 0x40004C0A). Bu bit 0 üçün LOW təyin edir

2. P1 SEL 1 Qeydiyyatına 0x00 yazın (ünvan 0x40004C0C). Bu bit 0 üçün LOW, GPIO üçün ayarlar təyin edir.

3. P1 DIR Register -ə 0x01 yazın (ünvan 0x40004C04). Bu, bit 0 üçün YÜKSƏK təyin edir, ÇIXIŞ deməkdir.

4. P1 Çıxış Qeydinə 0x01 yazaraq LED -i yandırın (ünvan 0x40004C02)

5. Bir növ gecikmə edin (və ya ayıklama zamanı sadəcə bir addım)

6. 0x00 -dən P1 Çıxış Qeydiyyatına yazaraq LED -i söndürün (ünvan 0x40004C02)

7. Bir növ gecikmə edin (və ya ayıklama zamanı yalnız bir addım)

8. 4-7 -ci addımları təkrarlayın.

Bu addımla əlaqəli video, bütün montaj təlimatlarını bir addım ataraq danışdığımız və LED hərəkətini göstərdiyimiz üçün bizi canlı bir demoda bütün proses boyunca aparır. Videonun uzunluğuna görə üzr istəyin.

Addım 3: Videoda Bir Qüsuru Tutdunuzmu?

LED-in bütün proqramlaşdırılması və işıqlandırılması prosesində gedən videoda, əsas döngədə birdəfəlik başlanğıc vəziyyətinə keçə biləcək əlavə bir addım var idi.

Bu Təlimatı keçmək üçün vaxt ayırdığınız üçün təşəkkür edirik.

Sonrakı, burada başladığımızı genişləndirir.

Tövsiyə: