Мазмуну:

2 -БӨЛҮМ - GPIO ARM ASBEBLY - RGB - FUNCTION CALLS - Коммутаторлор: 6 кадам
2 -БӨЛҮМ - GPIO ARM ASBEBLY - RGB - FUNCTION CALLS - Коммутаторлор: 6 кадам

Video: 2 -БӨЛҮМ - GPIO ARM ASBEBLY - RGB - FUNCTION CALLS - Коммутаторлор: 6 кадам

Video: 2 -БӨЛҮМ - GPIO ARM ASBEBLY - RGB - FUNCTION CALLS - Коммутаторлор: 6 кадам
Video: Part 2 ARM Assembly MSP432 TI RSLK Write GPIO LED Lab 6 2024, Июль
Anonim
2 -БӨЛҮМ - GPIO ARM ASBEBLY - RGB - FUNCTION CALLS - Коммутаторлор
2 -БӨЛҮМ - GPIO ARM ASBEBLY - RGB - FUNCTION CALLS - Коммутаторлор

1 -бөлүктө, C / C ++ ордуна ассемблерди колдонуп, Texas Instruments компаниясынан MSP432 LaunchPad өнүктүрүү тактасындагы бир кызыл LEDди кантип алмаштырууну үйрөндүк.

Бул Нускамада биз дагы ушундай нерсени жасайбыз - ошол эле тактада турган RGB LEDди көзөмөлдөө.

Жолдо, биз кээ бир светодиоддорду жарыктандырып эле койбостон, ARMди чогултуу боюнча билимибизди андан ары өнүктүрөбүз деп үмүттөнөбүз.

1 -кадам: Келгиле, дароо секирели

Чынында эле, биринчи видео баарын айтып турат. Кошумча көп эмес.

Мунун негизги мааниси - MSP432деги ар бир киргизүү -чыгаруу порту "регистр" даректеринин блогунан турат, алар өз кезегинде ар бири бир нече биттерден турат деген ойду үйгө жеткирүү.

Мындан тышкары, биттер ортогоналдык түрдө топтолгон. Башкача айтканда, ар бир регистр дарегинин 0 бити ошол эле тышкы I/O пинине тиешелүү.

Бир эле бит же пин менен бир нерсе кылуу үчүн, ошол порт үчүн бир нече регистрдик даректер керек деген ойду кайталадык.

Бирок, бул учурда, биз RGB LED менен иштеп жаткандыктан, ар бир реестр дареги үчүн үч бит менен иштешибиз керек.

Биз бир нече реестрге муктаж экенибизди бекемдедик: DIR реестри, SEL0 реестри, SEL1 реестри жана OUTPUT реестри. Жана ар бир жолу үч бит.

2 -кадам: Кодду жакшыртуу - Функцияны кошуу

Image
Image

Жогорудагы кадамда көргөнүңүздөй, программанын негизги циклинде көп жолу кайталанган код болгон, тактап айтканда, биз светодиоддорду өчүргөндө.

Ошентип, биз программага функция кошо алабыз. Биз дагы эле бул функцияны LED ди өчүргүбүз келген сайын чакырышыбыз керек, бирок бул кээ бир коддордун бир билдирүүгө кулашына алып келет.

Эгерде биздин LED өчүрүү коду дагы көптөгөн көрсөтмөлөргө көбүрөөк тартылганда, бул чыныгы эстутумду үнөмдөөчү болмок.

Камтылган программалоонун жана микро контроллерлердин бир бөлүгү программанын өлчөмү жөнүндө көбүрөөк билишет.

Видео түшүндүрөт.

Негизинен, биз негизги кодубузга бутактанган билдирүүнү кошобуз жана бизде дагы бир код блогу бар, ал биз бутактап жаткан функция. Анан бүткөндөн кийин же функциянын аягында биз негизги программанын ичиндеги кийинки билдирүүгө кайтабыз.

3-кадам: Busy-Loop Delay кошуу

Коддун Декларациялар бөлүмүндө, керектүү убакыт үчүн твитти оңой кылуу үчүн туруктуу кошуңуз:

; чекиттен кийин каалаган сөздөр (';') комментарийди баштайт.

; бул бөлүктөгү код мааниге ат берет.; Сиз дагы ".equ" колдонсоңуз болмок, бирок алар бир аз башкача.; '.equ' (менимче) өзгөртө албайт, ал эми '.set' сиз кыла аласыз дегенди билдирет; Кааласаңыз, кийинчерээк коддо 'DLYCNT' маанисин өзгөртүңүз.; 'DLYCNT' кечигүү программасында кайра саноо мааниси катары колдонулат. 0x30000. DLYCNT

Жаңы кечигүү функциясын кошуңуз:

кечигүү:.asmfunc; "кечиктирүү" кичи программасынын же функциясынын башталышы.

MOV R5, #DLYCNT; жүктөө негизги cpu реестри R5 'DLYCNT' үчүн дайындалган. dlyloop; бул кечигүү циклинин башталышын билдирет. Ассемблер дарегин аныктайт. SUB R5, #0x1; негизги CPU R5 учурдагы маанисинен 1ди алып салуу. CMP R5, #0x0; R5теги учурдагы маанини 0 менен салыштырыңыз. BGT dlyloop; эгерде R5теги мааниси 0 чоң болсо, 'dlyloop' (дареги) деп белгилөө. BX LR; эгер биз бул жерге жеткен болсок, анда R5 мааниси 0. подпрограммадан кайтуу дегенди билдирет..endasmfunc; подпрограмманы аяктоону белгилейт.

Андан кийин негизги денеде, негизги циклдин ичинде, кечигүү функциясын чакырыңыз же чакырыңыз:

; бул негизги бөлүктүн же негизги функциянын код фрагменти ('main.asm' файлын караңыз).

; бул "негизги" цикл жана биз жаңы "кечиктирүү" функциясын кантип чакыраарыбызды же колдоноорубузду көрсөтөт.; '#REDON' жана '#GRNON' дагы декларациялар (константалар) болуп саналат ('main.asm' чокусун караңыз).; алар RGB LEDдин түсүн коюунун оңой жолу. цикл MOV R0, #КЫЗЫЛ; Кызыл - негизги RP регистрин коюңуз 'REDON' дайындалган. STRB R0, [R4]; негизги регистр R4 мурда GPIO чыгаруу дареги менен коюлган.; R0де эмне бар экенин R4 тарабынан көрсөтүлгөн дарекке жазыңыз. BL кечигүүсү; жаңы "кечигүү" функциясына өтүү. BL ledsoff; мурунтан бар болгон 'ledsoff' функциясына бутак. BL кечигүүсү; MOV R0, #GRNON; Жашыл - дал ушундай STRB R0, [R4]; жана башка. BL кечигүү BL ledsoff BL кечигүү

Видео майда -чүйдөсүнө чейин айтылат.

4 -кадам: ARM архитектурасы процедурасы Call Standard (AAPCS)

Балким, бир нерсени таанытуу үчүн жакшы учур. Бул ассамблея тилиндеги конвенция. Ошондой эле ARM архитектурасынын процедуралык чалуу стандарты деп аталат.

Мында көп нерсе бар, бирок бул жөн эле стандарт. Бул бизди монтаждоо программалоосун үйрөнүүгө тоскоолдук кылбайт жана биз үйрөнүп жаткан кээ бир түшүнүктөрдү ыңгайлуу сезгенден кийин, биз ошол стандарттын бөлүктөрүн кабыл ала алабыз.

Болбосо, биз чоң суу түтүгүнөн ичип жаткандай сезимде болушубуз мүмкүн. Өтө көп маалымат.

Негизги реестрлер

Биз MSP432дин негизги реестрлери менен тааныш болгондуктан, эми бул стандарттардын айрымдарын кабыл алууга аракет кылалы. Биз кийинки функцияны жазганда (LEDди күйгүзүү / өчүрүү) буга ылайык келебиз.

1) Биз функцияны параметр катары R0 колдонушубуз керек. Эгерде биз функцияны (подрограмманы) баалоону өткөргүбүз келсе, анда биз R0 колдонушубуз керек.

2) Биз Шилтеме Реестрин максаттуу түрдө колдонушубуз керек - ал чакан программа аяктагандан кийин кайда кайрылуу керек экенин көрсөткөн даректи камтыйт.

Муну кантип колдоноорубузду көрөсүз.

5 -кадам: Параметр менен иштөө - Киргизилген функциялар

Биз кайталанган бөлүмдөрдү бир функцияга бириктирүү менен кодубузду тазалап, эс тутумунун көлөмүн азайта алабыз. Негизги укуруктун бир гана айырмасы, биз параметрге муктажбыз, ошондуктан биз RGB LEDин көргүбүз келген ар кандай түстөрдү өткөрүп бере алабыз.

Чоо -жайын билүү үчүн видеону карап көрүңүз. (узундугу үчүн кечирим сурайм)

6 -кадам: GPIO киргизүү - которгучтарды кошуу

Келгиле, аны кызыктуу кылалы. Биздин монтаждоо программасына бир аз которуштурууну кошууга убакыт келди.

Бул Нускамада эки борттогу которгучтар MSP432ге кантип туташканын көрсөткөн сүрөттөр бар.

Негизинен: 1 -которуштуруучу (SW1 же S1) P1.1ге, 2 -которуу (SW2 же S2) P1.4 менен туташкан.

Бул нерселерди бир аз кызыктуу кылат, анткени биз чыгымдардын ордуна кириштер менен алектенип жатабыз, бирок бул эки коммутатор бир эле кызыл LED сыяктуу эле бир эле реестрдин дареги блогунун эки битин ээлеп алгандыктан.

Биз бул Нускамада жалгыз кызыл LEDди которуштуруу менен алектендик, андыктан өчүргүчтөрдү иштетүү үчүн кодду кошушубуз керек.

Порт 1 Каттоо дареги

Буларды мурунку Нускамада караганыбызды унутпаңыз, бирок жаңысын киргизишибиз керек:

  • Порт 1 киргизүү регистринин дареги = 0x40004C00
  • Порт 1 Чыгуу Реестринин дареги = 0x40004C02
  • Порт 1 Багыты Каттоо дареги = 0x40004C04
  • Port 1 Resistor Enable Register address = 0x40004C06
  • Порт 1 0 Каттоо дарегин тандоо = 0x40004C0A
  • Порт 1 Тандоо 1 Каттоо дареги = 0x40004C0C

Портторду киргизүү катары колдонууда MSP432дин ички тартма же ылдый каршылыгын колдонуу жакшы.

Launchpad өнүгүү тактасы эки которгучту жерге туташтыргандыктан (басылганда ТӨМӨН), демек, алар басылбаган кезде катуу БИЙИК экенибизге ынануу үчүн UP каршылыгын колдонушубуз керек.

Резисторлорду өйдө / ылдый түшүрүү

Порт-1 реестрине эки башка дарек керек, бул которуштуруучу материалдарды каршылык резисторлоруна байлоо.

1) Port 1 Resistor-Enable реестрин колдонуңуз (0x40004C06), сиз резисторлорду каалаарыңызды көрсөтүү үчүн (бул эки бит үчүн), 2), андан кийин Порт 1 Чыгуу реестрин (0x40004C02) колдонуп, резисторлорду тартуучу же түшүрүү катары коюңуз. Чыгуу реестри дээрлик эки максатка ээ.

Ошентип, башка жол менен кайталап айтуу үчүн, Чыгаруу реестри чыгууга ЖОГОРУ же ТӨМӨН жөнөтө алат (мисалы, бир кызыл LED), жана / же ал кириш үчүн өйдө же ылдый каршылыктарды орнотуу үчүн колдонулат., БИРОК, эгерде бул функция Resistor-Enable реестри аркылуу иштетилген болсо.

Жогорудагы маанилүү-кандайдыр бир чыгаруу битине LOW же HIGH жөнөтүүдө/орнотууда, сиз бир эле учурда киргизүү биттеринин тартылуу/түшүү абалын сактап калышыңыз керек болот.

(видео түшүндүрүүгө аракет кылат)

Порт киргизүү битин окуу

  • GPIO функциясы үчүн SEL0 / SEL1ди коюңуз
  • DIR реестрин которгуч биттери үчүн киргизүү катары, бирок LED үчүн чыгаруу катары коюңуз (бир эле учурда бир эле байтта)
  • Резисторлорду иштетүү
  • Аларды тартылуу каршылыгы катары коюңуз
  • Портту окуңуз
  • Сиз керектүү биттерди бөлүп алуу үчүн окуу маанисин чыпкалоону каалашыңыз мүмкүн (1 жана 2 которуштуруу)

Сунушталууда: