Mundarija:

2 -QISM - GPIO ARM YIG'ILISHI - RGB - FUNKSIY QO'NG'IROQLAR - Kommutatorlar: 6 qadam
2 -QISM - GPIO ARM YIG'ILISHI - RGB - FUNKSIY QO'NG'IROQLAR - Kommutatorlar: 6 qadam

Video: 2 -QISM - GPIO ARM YIG'ILISHI - RGB - FUNKSIY QO'NG'IROQLAR - Kommutatorlar: 6 qadam

Video: 2 -QISM - GPIO ARM YIG'ILISHI - RGB - FUNKSIY QO'NG'IROQLAR - Kommutatorlar: 6 qadam
Video: STM32. CMSIS #2. GPIO - создаем проект с нуля в ARM KEIL на CMSIS. 2024, Noyabr
Anonim
2 -QISM - GPIO ARM YUVLASHI - RGB - FUNKSIY QO'NG'ILAR - Kommutatorlar
2 -QISM - GPIO ARM YUVLASHI - RGB - FUNKSIY QO'NG'ILAR - Kommutatorlar

1 -bo'limda, biz C / C ++ o'rniga montaj yordamida Texas Instruments -dan MSP432 LaunchPad ishlab chiqish platasida bitta qizil LEDni qanday almashtirishni o'rgandik.

Bu yo'riqnomada biz shunga o'xshash narsani qilamiz - xuddi shu taxtada joylashgan RGB LEDini boshqarish.

Yo'l davomida, biz faqat LEDlarni yoqibgina qolmay, ARMni yig'ish haqidagi bilimlarimizni yanada oshirishga umid qilamiz.

1 -qadam: Keling, darhol kiraylik

Haqiqatan ham, birinchi videoda hamma narsa aytilgan. Qo'shish uchun ko'proq narsa yo'q.

Uning asosiy maqsadi, MSP432 -dagi har bir kirish -chiqish porti "registr" manzillar blokidan iborat degan fikrni uyga olib kelishdir, ular o'z navbatida har biri bir nechta bitlardan iborat.

Bundan tashqari, bitlar ortogonal tarzda guruhlangan. Ya'ni, har bir registr manzilining 0 biti bir xil tashqi kirish -chiqish piniga ishora qiladi.

Biz bitta port yoki pin yordamida biror narsa qilish uchun port uchun bir nechta registr manzillari kerak degan fikrni takrorladik.

Ammo bu holda, biz RGB LED bilan ishlayotganimiz uchun, har bir registr manzili uchun uchta bit bilan ishlashimiz kerak.

Bizga bir nechta registrlar kerakligini tasdiqladik: DIR registri, SEL0 registri, SEL1 registri va OUTPUT reestri. Va har safar uchta bit.

2 -qadam: Kodni yaxshilang - funktsiyani qo'shing

Image
Image

Yuqoridagi qadamda ko'rganingizdek, asosiy dastur tsiklida juda ko'p takrorlangan kod bor edi, ya'ni biz LEDlarni o'chirganimizda.

Shunday qilib, biz dasturga funktsiyani qo'shishimiz mumkin. Biz har doim LEDni o'chirishni xohlaganimizda ham bu funktsiyani chaqirishimiz kerak, lekin bu ba'zi kodlarning bitta bayonotga qulab tushishiga olib keladi.

Agar bizning LED-o'chirish kodimiz ko'proq ko'rsatmalarga ega bo'lganida edi, bu haqiqiy xotirani tejovchi bo'lardi.

O'rnatilgan dasturlash va mikro-kontrollerlarning bir qismi dastur hajmini ancha yaxshi biladi.

Video tushuntiradi.

Asosan, biz asosiy kodimizga dallanma bayonotini qo'shamiz va bizda boshqa tarmoq bloki mavjud, bu biz tarmoqlangan. Va keyin, biz tugagandan so'ng yoki funktsiyani tugatgandan so'ng, biz asosiy dasturdagi keyingi bayonotga qaytamiz.

3-qadam: "Band-Loop Delay" ni qo'shing

Kodning "Deklaratsiyalar" bo'limida kerakli vaqtni sozlashni osonlashtirish uchun doimiy qo'shing:

; nuqta-nuqta (';') dan keyingi har qanday so'z izohni boshlaydi.

; bu qismdagi kod qiymatga nom beradi.; Siz ham ".equ" dan foydalanishingiz mumkin edi, lekin ular biroz boshqacha.; '.equ' (menimcha) o'zgartirilishi mumkin emas, '.set' siz qila olasiz degan ma'noni anglatadi; agar xohlasangiz, keyinchalik "DLYCNT" qiymatini o'zgartiring.; "DLYCNT" kechikish kichik dasturida sanash qiymati sifatida ishlatiladi. 0x30000. DLYCNT

Yangi kechiktirish funktsiyasini qo'shing:

kechikish:.asmfunc; "kechiktirish" kichik dasturining yoki funktsiyasining boshlanishi.

MOV R5, #DLYCNT; "DLYCNT" ga tayinlangan R5 yadroli CPU registrini yuklang. dlyloop; bu kechikish davrining boshlanishini ko'rsatadi. montajchi manzilni aniqlaydi. YUBUB R5, #0x1; yadroli protsessor R5 -dagi joriy qiymatdan 1 -ni olib tashlang. CMP R5, #0x0; R5 dagi joriy qiymatni 0 ga solishtiring. BGT dlyloop; filial, agar R5 qiymati 0 dan katta bo'lsa, "dlyloop" yorlig'i (manzili) uchun. BX LR; Agar biz bu erga etib borsak, R5 qiymati 0. subroutine -dan qaytish degan ma'noni anglatadi..endasmfunc; subroutine tugashini belgilaydi.

Keyin asosiy tanada, asosiy pastadir ichida, kechiktirish funktsiyasini chaqiring yoki chaqiring:

; bu asosiy qism yoki asosiy funktsiyadan iborat kod parchasi ("main.asm" faylini ko'ring).

; Bu "asosiy" dagi pastadir va bu yangi "kechiktirish" funktsiyasini qanday chaqirishimiz yoki ishlatishimizni ko'rsatadi.; "#REDON" va "#GRNON" ham deklaratsiyalar (doimiylar) ("main.asm" ning yuqori qismiga qarang).; bu RGB LED -ning belgilangan rangini o'rnatishning oddiy usuli. halqa MOV R0, #REDON; Qizil - "REDON" qiymatiga ega bo'lgan R0 yadroli CPU registrini o'rnating. STRB R0, [R4]; R4 yadro registri ilgari GPIO chiqish manzili bilan o'rnatilgan edi.; R0da nima borligini R4 tomonidan ko'rsatilgan manzilga yozing. BL kechikishi; yangi "kechiktirish" funktsiyasiga o'tish. BL ledsoff; oldindan mavjud bo'lgan "ledsoff" funktsiyasiga o'tish. BL kechikishi; shu bilan MOV R0, #GRNON; Yashil - shu bilan STRB R0, [R4]; va hokazo. BL kechikishi BL ledsoff BL kechikishi

Video batafsil tasvirlangan.

4 -qadam: ARM arxitekturasini chaqirish standarti (AAPCS)

Ehtimol, biror narsani tanishtirish uchun yaxshi vaqt. Bu yig'ilish tilidagi konventsiya. ARM arxitekturasi uchun protsedura chaqiruvi standarti sifatida ham tanilgan.

Bu erda ko'p narsa bor, lekin bu standart. Bu bizni montaj dasturlarini o'rganishga to'sqinlik qilmaydi va biz o'zimiz o'rganayotgan ba'zi tushunchalarga o'zimizni qulay his qilgandan so'ng, biz ushbu standartni qabul qila olamiz.

Aks holda, biz o'zimizni ulkan suv quvuridan ichayotgandek his qilishimiz mumkin. Juda ko'p ma'lumot.

Asosiy registrlar

Biz MSP432 -ning asosiy registrlari bilan tanish bo'lganimiz uchun, keling, ushbu standartlarning ayrimlarini qabul qilishga harakat qilaylik. Keyingi funktsiyani yozganda biz bunga mos kelamiz (LEDni yoqish / o'chirish).

1) Biz funktsiya parametri sifatida R0 dan foydalanishimiz kerak. Agar biz qiymatni funktsiyaga (subroutine) o'tkazmoqchi bo'lsak, buni amalga oshirish uchun R0 dan foydalanishimiz kerak.

2) Biz havolalar reestridan maqsadli foydalanishimiz kerak - u dasturni to'ldirgandan so'ng qayerga qaytish kerakligini ko'rsatadigan manzilni o'z ichiga oladi.

Siz buni qanday qo'llayotganimizni ko'rasiz.

5 -qadam: Parametr bilan biriktirilgan funksiya

Takrorlangan bo'limlarni bitta funktsiyaga birlashtirish orqali biz kodimizni tozalashimiz va uning xotirasi hajmini kamaytirishimiz mumkin. Asosiy halqa korpusidagi yagona farq shundaki, biz parametrga muhtojmiz, shuning uchun biz RGB LED -ni ko'rishni istagan turli xil ranglardan o'tamiz.

Tafsilotlar uchun videoni ko'ring. (uzr uchun uzr)

6 -qadam: GPIO kiritish - kalitlarni qo'shing

Keling, buni yanada qiziqarli qilaylik. O'rnatish dasturimizga kalitlarni boshqarish vaqtini qo'shish vaqti keldi.

Ushbu yo'riqnomada ikkita bortli kalit MSP432-ga qanday ulanganligi tasvirlangan.

Asosan: 1 -kalit (SW1 yoki S1) P1.1 ga, 2 -kalit (SW2 yoki S2) esa P1.4 ga ulangan.

Bu narsa bizni chiqishlar o'rniga kirishlar bilan ishlayotganimiz uchun emas, balki bu ikkita kalit bitta qizil LEDli bitta registrli manzillar blokining ikkita bitini egallaganligi yoki egallaganligi uchun ham ishni biroz qiziqarli qiladi.

Biz bu yo'riqnomada bitta qizil LEDni almashtirish bilan shug'ullanganmiz, shuning uchun biz kalitlarga ishlov berish uchun kod qo'shishimiz kerak.

Port 1 Ro'yxatdan o'tish manzili bloki

Esda tutingki, biz bu ko'rsatmalarni oldingi yo'riqnomada ko'rib chiqdik, lekin biz yangisini qo'shishimiz kerak:

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

Portlarni kirish sifatida ishlatganda, MSP432-ning ichki tortish yoki tushirish rezistorlaridan foydalanish yaxshidir.

Launchpad -ni ishlab chiqish paneli ikkita kalitni erga ulaganligi uchun (bosilganda LOW), demak biz bosilmaganda qattiq YUQORI borligiga ishonch hosil qilish uchun tortish UP rezistorlaridan foydalanishimiz kerak.

Rezistorlarni yuqoriga / pastga torting

Ushbu kalitlarni kirish rezistorlariga ulash uchun Port 1 Registrining ikki xil manzili kerak.

1) Port 1 rezistor-yoqish registridan (0x40004C06) foydalanib, rezistorlar kerakligini bildiring (bu ikkita bit uchun), 2) va keyin rezistorlarni tortish yoki tushirish sifatida o'rnatish uchun Port 1 Chiqish registrini (0x40004C02) ishlating. Chiqish registri deyarli ikki maqsadli.

Boshqacha qilib aytganda, chiqish registri chiqishga yuqori yoki pastni yuborishi mumkin (masalan, bitta qizil LED) va / yoki kirish uchun tortish yoki tushirish qarshiligini o'rnatish uchun ishlatiladi., BIR FAQAT, agar bu xususiyat rezistorni yoqish reestri orqali yoqilgan bo'lsa.

Yuqoridagilarda muhim-har qanday chiqish bitiga LOW yoki HIGH ni yuborish/sozlashda siz bir vaqtning o'zida kirish bitlarining tortish/tushirish holatini saqlab turishingiz kerak bo'ladi.

(video tushuntirishga harakat qiladi)

Port kirish bitini o'qish

  • GPIO funksiyasi uchun SEL0 / SEL1 ni o'rnating
  • DIR registrini kalit bitlari uchun kirish sifatida, lekin LED uchun chiqish sifatida o'rnating (bir vaqtning o'zida bir xil baytda)
  • Rezistorlarni yoqish
  • Ularni tortishish qarshiligi sifatida o'rnating
  • Portni o'qing
  • Siz kerakli bitlarni ajratish uchun o'qilgan qiymatni filtrlashni xohlashingiz mumkin (1 va 2 -tugma).

Tavsiya: