Mundarija:

GPIO ARM Yig'ilishi - T.I. ROBOTIKA TIZIMINI O'RGANISH TO'PLAMI - LAB 6: 3 qadam
GPIO ARM Yig'ilishi - T.I. ROBOTIKA TIZIMINI O'RGANISH TO'PLAMI - LAB 6: 3 qadam

Video: GPIO ARM Yig'ilishi - T.I. ROBOTIKA TIZIMINI O'RGANISH TO'PLAMI - LAB 6: 3 qadam

Video: GPIO ARM Yig'ilishi - T.I. ROBOTIKA TIZIMINI O'RGANISH TO'PLAMI - LAB 6: 3 qadam
Video: ARM Programming with Embedded C - LPC2148 GPIO Configuration and LPC2148 LED Blinking Program. 2024, Noyabr
Anonim
GPIO ARM Yig'ilishi - T. I. ROBOTIKA TIZIMINI O'RGANISH TO'PLAMI - LAB 6
GPIO ARM Yig'ilishi - T. I. ROBOTIKA TIZIMINI O'RGANISH TO'PLAMI - LAB 6

Salom, Texas Instruments TI-RSLK (MSP432 mikrokontroleridan foydalanadi) yordamida ARM yig'ilishini o'rganish bo'yicha oldingi yo'riqnomada, agar siz T. I. Albatta, biz registrga yozish va shartli tsikl qilish kabi juda oddiy ko'rsatmalarni ko'rib chiqdik. Biz Eclipse IDE yordamida ijro etishga o'tdik.

Biz bajargan kichik dasturlar tashqi dunyo bilan hech qanday aloqada bo'lmadi.

Zerikarli.

Keling, kirish/chiqish portlari, xususan, raqamli GPIO pinlari haqida bilib, buni biroz o'zgartirishga harakat qilaylik.

Shunday qilib, MSP432 ishlab chiqarish panelida ikkita GPIO portiga ulangan ikkita tugmachali kalit, RGB LED va qizil LED mavjud.

Bu shuni anglatadiki, biz bu pinlarni yig'ish orqali o'rnatish va boshqarishni o'rganganimizda, biz bu effektlarni vizual tarzda ko'ra olamiz.

Nosozliklarni tuzatuvchidan o'tishdan ko'ra ancha qiziqroq.

(Biz hali qadam tashlamoqchimiz - bu bizning "kechiktirish" funksiyamiz bo'ladi):-D

1 -qadam: Keling, RAMdan yozishni / o'qishni sinab ko'ramiz

GPIO -ga kirish va boshqarishga o'tishdan oldin, biz kichik bir qadam tashlashimiz kerak.

Oddiy xotira manziliga o'qish va yozishdan boshlaylik. Biz oldingi Instructable -dan bilamiz (u erdagi rasmlarga qarang) RAM 0x2000 0000 dan boshlanadi, shuning uchun bu manzilni ishlataylik.

Biz ma'lumotlarni asosiy registr (R0) va 0x2000 0000 o'rtasida o'tkazamiz.

Biz asosiy fayl tuzilishi yoki yig'ish dasturining mazmunidan boshlaymiz. Iltimos, TI Code Composer Studio (CCS) yordamida montaj loyihasini va ba'zi namunaviy loyihalarni yaratish uchun ushbu yo'riqnomaga qarang.

.barmoq

.text.hizlam 2. global asosiy.thumbfunc asosiy asosiy:.asmfunc; ---------------------------------- -----------------------------------------------; (bizning kodimiz bu erga o'tadi); ------------------------------------------ ---------------------------------------.endasmfunc.end

Men yuqori bo'limga yangi narsalarni qo'shmoqchiman, agar ba'zi deklaratsiyalar (ko'rsatmalar) bo'lsa. Bu keyinroq aniqroq bo'ladi.

ACONST.set 0x20000000; biz bundan pastda foydalanamiz (bu doimiy)

; Shubhasiz, "0x" keyingi oltilik qiymatini bildiradi.

Shunday qilib, bizning boshlang'ich fayllarimiz endi shunday ko'rinadi:

.barmoq

.text.hizlama 2 ACONST.set 0x20000000; biz bundan pastroqda foydalanamiz (bu doimiy); Shubhasiz, "0x" keyingi oltilik qiymatini bildiradi..global asosiy.thumbfunc asosiy asosiy:.asmfunc; --------------------------------------- ------------------------------------------; (bizning kodimiz bu erga o'tadi); ------------------------------------------ ---------------------------------------.endasmfunc.end

Endi bizda yuqoridagilar bor ekan, chiziqlar orasiga kod qo'shamiz.

Biz RAM joyiga yozishni boshlaymiz. Birinchidan, biz operativ xotiraga yoziladigan ma'lumotlar modelini, qiymatini o'rnatamiz. Bu qiymat yoki ma'lumotlarni aniqlash uchun biz asosiy registrdan foydalanamiz.

Eslatma: esda tutingki, kodda nuqta-nuqta (';') bo'lgan har qanday satr bu nuqta-verguldan keyingi izohdir.

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

; YOZISH; ------------------------------------------------ ----------------------------------------------- MOV R0, #0x55; yadro registri R0 biz RAM manziliga yozmoqchi bo'lgan ma'lumotlarni o'z ichiga oladi.; Shubhasiz, "0x" keyingi oltilik qiymatini bildiradi.

Keling, DONT ishlamaydigan bayonotlarni ko'rib chiqaylik.

; MOV MOV ma'lumotlarini RAM joyiga yozib bo'lmaydi.

; MOV faqat ro'yxatga olish ma'lumotlari uchun mo'ljallangan; yoki bir registrdan boshqasiga; ya'ni, MOV R1, R0.; STR STR dan foydalanishi kerak.; STR R0, = ACONST; Ifodadagi yomon atama ('='); STR R0, 0x20000000; Do'konda ko'rsatma berish uchun noqonuniy manzil rejimi; STR R0, ACONST; Do'konda ko'rsatma berish uchun noqonuniy manzil rejimi

Ko'p narsani tushuntirmasdan, biz yuqoridagi "ACONST" dan foydalanishga harakat qildik. Aslida, bu 0x20000000 kabi oddiy qiymatni ishlatish o'rniga, doimiy yoki doimiy.

Biz RAM manziliga yuqoridagilardan foydalanib yozishni yozolmadik. Keling, boshqa narsani sinab ko'raylik.

; RAM joyini o'z ichiga olgan boshqa registrni ishlatishimiz kerak

; MOV R1, #0x20000000 operativ xotira joyiga saqlash uchun buyurtma; RAM o'rnini (uning tarkibini emas, balki joylashuvini) R1 ga o'rnating.; Shubhasiz, "0x" keyingi oltilik qiymatini bildiradi. STR R0, [R1]; R1 (0x55) da nima borligini R1 yordamida RAMga (0x20000000) yozing.; biz RAM joylashuvi manziliga ega bo'lgan boshqa registrni (R1) ishlatamiz; RAM manziliga yozish uchun.

Yuqorida aytilganlarni bajarishning yana bir usuli, lekin "ACONST" dan foydalanib, oddiy manzil qiymati:

; Keling, yuqorida aytilganlarni takrorlaylik, lekin keling, RAMning haqiqiy joylashuvi qiymati o'rniga ramzdan foydalanaylik.

; biz "ACONST" ni 0x20000000 uchun stend sifatida ishlatmoqchimiz.; biz darhol qiymatni bildirish uchun '#' qilishimiz kerak; shuning uchun (yuqoriga qarang), biz ".set" direktivasidan foydalanishimiz kerak edi.; Buni isbotlash uchun R0 da ma'lumotlar modelini o'zgartiraylik. MOV R0, #0xAA; OK, biz RAMga MOV R1, #ACONST STR R0, [R1] manzil manzili o'rniga belgidan foydalanib yozishga tayyormiz.

Videoda batafsilroq ma'lumot berilgan, shuningdek, xotiradan o'qish bosqichlari.

Bundan tashqari, biriktirilgan manba.asm faylini ko'rishingiz mumkin.

2 -qadam: Ba'zi asosiy port ma'lumotlari

Image
Image
Port haqida ba'zi asosiy ma'lumotlar
Port haqida ba'zi asosiy ma'lumotlar
Port haqida ba'zi asosiy ma'lumotlar
Port haqida ba'zi asosiy ma'lumotlar

Endi biz RAM joyidan qanday yozish / o'qish haqida yaxshi tasavvurga ega bo'lsak, bu GPIO pinini boshqarish va undan foydalanishni yaxshiroq tushunishga yordam beradi.

Xo'sh, GPIO pinlari bilan qanday aloqa o'rnatamiz? Bu mikrokontroller va uning ARM yo'riqnomalariga oldingi qarashimizdan biz uning ichki registrlari bilan qanday ishlashni bilamiz va xotira (RAM) manzillari bilan qanday ishlashni bilamiz. Ammo GPIO pinlari?

Shunday qilib, bu pinlar xotira xaritasida bo'ladi, shuning uchun biz ularni xotira manzillari bilan bir xil davolashimiz mumkin.

Bu shuni anglatadiki, biz bu manzillar nima ekanligini bilishimiz kerak.

Quyida portning boshlanish manzillari ko'rsatilgan. Aytgancha, MSP432 uchun "port" - bu bitta pin emas, balki pinlar to'plami. Agar siz Raspberry Pi bilan tanish bo'lsangiz, menimcha, bu bu erdagi vaziyatdan farq qiladi.

Yuqoridagi rasmdagi ko'k doiralar doskadagi ikkita kalit va LED uchun yozuvni ko'rsatadi. Moviy chiziqlar haqiqiy LEDlarni ko'rsatadi. Sarlavhali o'tish moslamalariga tegishimiz shart emas.

Men qiziqtirgan portlarni quyida qalin qilib yozdim.

  • GPIO P1: 0x4000 4C00 + 0 (hatto manzillar)
  • GPIO P2: 0x4000 4C00 + 1 (toq manzillar)
  • GPIO P3: 0x4000 4C00 + 20 (hatto manzillar)
  • GPIO P4: 0x4000 4C00 + 21 (toq manzillar)
  • GPIO P5: 0x4000 4C00 + 40 (hatto manzillar)
  • GPIO P6: 0x4000 4C00 + 41 (toq manzillar)
  • GPIO P7: 0x4000 4C00 + 60 (hatto manzillar)
  • GPIO P8: 0x4000 4C00 + 61 (toq manzillar)
  • GPIO P9: 0x4000 4C00 + 80 (hatto manzillar)
  • GPIO P10: 0x4000 4C00 + 81 (toq manzillar)

Biz hali tugatmadik. Bizga qo'shimcha ma'lumot kerak.

Portni boshqarish uchun bizga bir nechta manzil kerak. Shuning uchun yuqoridagi ro'yxatda biz "juft manzillar" yoki "toq manzillar" ni ko'ramiz.

I/U manzil bloklarini ro'yxatdan o'tkazish

Bizga boshqa manzillar kerak bo'ladi, masalan:

  • 1 -port kirish registrining manzili = 0x40004C00
  • Port 1 Chiqish registrining manzili = 0x40004C02
  • Port 1 Yo'nalish Ro'yxatdan o'tish manzili = 0x40004C04
  • Port 1 0 Ro'yxatdan o'tish manzili = 0x40004C0A ni tanlang
  • Port 1 1 Ro'yxatdan o'tish manzilini tanlang = 0x40004C0C

Va biz boshqalarga muhtoj bo'lishimiz mumkin.

OK, endi biz bitta qizil LEDni boshqarish uchun GPIO registr manzillari diapazonini bilamiz.

Juda muhim eslatma: MSP432 LaunchPad platasidagi har bir kirish -chiqish porti bir nechta (odatda 8) pin yoki chiziqlar yig'indisidir va har birini alohida kirish yoki chiqish sifatida sozlash mumkin.

Bu, masalan, agar siz "Port 1 yo'nalishidagi ro'yxatdan o'tish manzili" uchun qiymatlarni o'rnatayotgan bo'lsangiz, siz qaysi bitni (yoki bitlarni) o'sha manzilga o'rnatayotganingiz yoki o'zgartirayotganingiz haqida qayg'urishingiz kerak. Bu haqda keyinroq.

GPIO port dasturlash ketma -ketligi

Bizga kerak bo'lgan oxirgi qism - bu LEDni boshqarish uchun ishlatiladigan jarayon yoki algoritm.

Bir martalik ishga tushirish:

  • Oddiy GPIO ishlashi uchun P1.0 (P1SEL1REG: P1SEL0REG Ro'yxatdan o'tish) <--- 0x00, 0x00 ni sozlang.
  • P1DIRREG yo'nalish registrining 1 bitini chiqish yoki YUQOR sifatida o'rnating.

Loop:

Qizil LEDni yoqish uchun P1OUTREG registrining 0 bitiga HIGH yozing

  • Kechiktirish funktsiyasini chaqiring
  • Qizil LEDni o'chirish uchun P1OUTREG registrining 0 bitiga LOW yozing
  • Kechiktirish funktsiyasini chaqiring
  • Loopni takrorlang

Qaysi kirish / chiqish funktsiyasi (SEL0 va SEL1 ni sozlash)

LaunchPad -dagi ko'p pinlar bir nechta maqsadlarda ishlatiladi. Misol uchun, xuddi shu pin standart raqamli GPIO bo'lishi mumkin yoki UART yoki I2C ketma -ket aloqasida ham ishlatilishi mumkin.

Ushbu pin uchun biron bir funktsiyani ishlatish uchun siz ushbu funktsiyani tanlashingiz kerak. Siz pin funktsiyasini sozlashingiz kerak.

Yuqorida bu kontseptsiyani vizual shaklda tushuntirishga harakat qiladigan tasvir bor.

SEL0 va SEL1 manzillari qandaydir funktsiya / xususiyat tanlash vazifasini bajaradigan juftlik kombinatsiyasini hosil qiladi.

Bizning maqsadimiz uchun biz standart bitli raqamli GPIOni 0 bit uchun olishni xohlaymiz. Bu shuni anglatadiki, SEL0 va SEL1 LOW bo'lishi uchun bizga 0 bit kerak.

Port dasturlash ketma -ketligi (yana)

1. 0x00 ni P1 SEL 0 Register ga yozing (manzil 0x40004C0A). Bu LOW ni bit 0 ga o'rnatadi

2. 0x00 ni P1 SEL 1 Register ga yozing (manzil 0x40004C0C). Bu 0 -bit uchun LOW, GPIO -ni o'rnatadi.

3. P1 DIR Register ga 0x01 yozing (manzil 0x40004C04). Bu 0 -bit uchun "HIGH" ni belgilaydi, ya'ni OUTPUT.

4. P1 OUTPUT Registriga 0x01 yozish orqali LEDni yoqing (manzil 0x40004C02).

5. Qandaydir kechiktirishni bajaring (yoki disk raskadrovka paytida faqat bir qadam)

6. LEDni o'chiring, 0x00 dan P1 OUTPUT Registriga yozing (manzil 0x40004C02).

7. Har xil kechiktirishlarni bajaring (yoki disk raskadrovka paytida faqat bir qadam)

8. 4-7 bosqichlarni takrorlang.

Bu qadam bilan bog'liq video bizni butun jarayon davomida jonli demo orqali olib boradi, chunki biz har bir yig'ilish yo'riqnomasida bir qadam bosamiz va gaplashamiz va LED harakatini ko'rsatamiz. Iltimos videoning uzunligini uzr.

3 -qadam: Videodagi bitta kamchilikni payqadingizmi?

LEDni dasturlash va yoritishning butun jarayonini o'tayotgan videoda asosiy tsiklda qo'shimcha qadam bor edi, uni bir martalik ishga tushirishga o'tkazish mumkin edi.

Vaqt ajratganingiz uchun tashakkur.

Keyingisi biz bu erda boshlagan narsalarni kengaytiradi.

Tavsiya: