Բովանդակություն:

GPIO ARM ASMBLY - T.I. ՌՈԲՈՏԻԿԱՅԻ ՀԱՄԱԿԱՐԳԻ ՈEՍՈՄԱՆ ԿԻՏ - ԼԱԲ 6: 3 քայլեր
GPIO ARM ASMBLY - T.I. ՌՈԲՈՏԻԿԱՅԻ ՀԱՄԱԿԱՐԳԻ ՈEՍՈՄԱՆ ԿԻՏ - ԼԱԲ 6: 3 քայլեր

Video: GPIO ARM ASMBLY - T.I. ՌՈԲՈՏԻԿԱՅԻ ՀԱՄԱԿԱՐԳԻ ՈEՍՈՄԱՆ ԿԻՏ - ԼԱԲ 6: 3 քայլեր

Video: GPIO ARM ASMBLY - T.I. ՌՈԲՈՏԻԿԱՅԻ ՀԱՄԱԿԱՐԳԻ ՈEՍՈՄԱՆ ԿԻՏ - ԼԱԲ 6: 3 քայլեր
Video: Part 2 ARM Assembly MSP432 TI RSLK Write GPIO LED Lab 6 2024, Նոյեմբեր
Anonim
GPIO ARM ASMBLY - T. I. ՌՈԲՈՏԻԿԱՅԻ ՀԱՄԱԿԱՐԳԻ ՈEՍՈՄԱՆ ԿԱԹ - ԼԱԲՈՆ 6
GPIO ARM ASMBLY - T. I. ՌՈԲՈՏԻԿԱՅԻ ՀԱՄԱԿԱՐԳԻ ՈEՍՈՄԱՆ ԿԱԹ - ԼԱԲՈՆ 6

Բարեւ Ձեզ, Նախկին հրահանգում ՝ սովորել ARM հավաքածու ՝ օգտագործելով Texas Instruments TI-RSLK (օգտագործում է MSP432 միկրոկոնտրոլերը), որը հայտնի է որպես Lab 3, եթե դուք կատարում եք T. I. Իհարկե, մենք անցանք մի քանի շատ հիմնական հրահանգների, ինչպիսիք են `գրանցամատյանում գրելն ու պայմանական շրջանցումը: Մենք կատարեցինք միջամտությունը ՝ օգտագործելով Eclipse IDE- ն:

Մեր կատարած պատանեկան ծրագրերը ոչ մի կերպ չազդեցին արտաքին աշխարհի հետ:

Մի տեսակ ձանձրալի:

Եկեք այսօր փորձենք դա փոքր -ինչ փոխել `մի փոքր տեղեկանալով մուտքի/ելքի նավահանգիստների, մասնավորապես` թվային GPIO կապիչների մասին:

Պատահում է, որ այս MSP432- ը հայտնվում է զարգացման տախտակի վրա և արդեն ունի երկու կոճակ անջատիչ, RGB LED և կարմիր LED, որոնք բոլորը կապված են որոշ GPIO նավահանգիստների հետ:

Սա նշանակում է, որ երբ մենք սովորում ենք կարգավորել և մշակել այս կապում հավաքման միջոցով, մենք կարող ենք տեսողականորեն տեսնել այդ ազդեցությունները:

Շատ ավելի հետաքրքիր է, քան պարզապես վրիպազերծիչի միջոցով անցնելը:

(Մենք դեռ քայլ ենք անելու. Սա կլինի մեր «հետաձգման» գործառույթը):-D

Քայլ 1: Փորձենք գրել RAM- ից / կարդալ RAM- ից

Նախքան GPIO մուտք գործելը և վերահսկելը անցնելը, մենք պետք է մի փոքր քայլ անենք:

Եկեք սկսենք պարզապես կարդալ և գրել ստանդարտ հիշողության հասցեով: Նախորդ Instructable- ից (տե՛ս այնտեղ պատկերները) մենք գիտենք, որ RAM- ը սկսվում է 0x2000 0000 -ից, ուստի եկեք օգտագործենք այդ հասցեն:

Մենք պատրաստվում ենք տվյալները տեղափոխել հիմնական ռեգիստրի (R0) և 0x2000 0000 միջև:

Մենք սկսում ենք հիմնական ֆայլի կառուցվածքով կամ հավաքման ծրագրի բովանդակությամբ: Խնդրում ենք անդրադառնալ այս հրահանգին `հավաքագրման նախագիծ ստեղծելու համար` օգտագործելով TI- ի Code Composer Studio- ն (CCS) և որոշ օրինակելի նախագծեր:

. thumb

.տեքստ.հավասարեցում 2. գլոբալ հիմնական. thumbfunc հիմնական հիմնական..asmfunc; -------------------------------------- ---------------------------------------------------; (մեր կոդը կգնա այստեղ); ---------------------------------------------- ------------------------------------------.endasmfunc.ավարտ

Ես ուզում եմ վերևում ինչ -որ նոր բան ավելացնել, եթե որոշ հայտարարություններ (դիրեկտիվներ) կային: Ավելի պարզ կդառնա ավելի ուշ:

ACONST. Սահմանել 0x20000000; մենք դա կօգտագործենք ավելի ներքև (դա հաստատուն է)

; ակնհայտ է, որ «0x» նշանակում է այն, ինչ հաջորդում է ՝ վեցանկյուն արժեք:

Այսպիսով, մեր մեկնարկային ֆայլի բովանդակությունն այժմ այսպիսին է.

. thumb

.տեքստ.հավասարեցնել 2 ACONST. Set 0x20000000; մենք կօգտագործենք սա ավելի ներքև (դա հաստատուն է); ակնհայտ է, որ «0x» նշանակում է այն, ինչ հաջորդում է ՝ վեցանկյուն արժեք:. գլոբալ հիմնական.thumbfunc հիմնական հիմնական..asmfunc; --------------------------------------- ----------------------------------------------; (մեր կոդը կգնա այստեղ); ---------------------------------------------- ------------------------------------------.endasmfunc.ավարտ

Այժմ, երբ մենք ունենք վերը նշվածը, եկեք կոդ ավելացնենք գծված գծերի միջև:

Մենք սկսում ենք գրել RAM- ի վայրում: Սկզբում մենք կհաստատենք տվյալների օրինակ, արժեք, որը մենք մուտքագրելու ենք RAM- ում: Մենք օգտագործում ենք հիմնական գրանցամատյանը `այդ արժեքը կամ տվյալները հաստատելու համար:

Հիշեցում. Հիշեք, որ ծածկագրում կիսագնդ (';') ունեցող ցանկացած տող նշանակում է, որ այդ ամենը կիսակետից հետո մեկնաբանություն է:

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

; ԳՐՈ;Մ; ---------------------------------------------------- -------------------------------------------------- MOV R0, #0x55; հիմնական գրանցամատյանը R0- ը կպարունակի այն տվյալները, որոնք մենք ցանկանում ենք գրել RAM- ի գտնվելու վայրում:; ակնհայտ է, որ «0x» նշանակում է այն, ինչ հաջորդում է ՝ վեցանկյուն արժեք:

Հաջորդը, եկեք նայենք այն հայտարարություններին, որոնք ՉԵՆ գործում:

; MOV MOV- ն չի կարող օգտագործվել տվյալներ RAM- ի վրա գրելու համար:

; MOV- ն միայն գրանցամատյանում անհապաղ տվյալների համար է. կամ մի գրանցումից մյուսը. այսինքն ՝ MOV R1, R0:; STR- ը պետք է օգտագործի STR:; STR R0, = ԴԵՄ; Վատ արտահայտություն արտահայտության մեջ (the '='); STR R0, 0x20000000; Խանութների ցուցումների անօրինական հասցեավորման ռեժիմ; STR R0, ԴԵՄ; Խանութի ուսուցման համար անօրինական հասցեավորման ռեժիմ

Առանց շատ բացատրելու, մենք փորձեցինք օգտագործել այդ «ՎԵՐԱԲԵՐՅԱԼ» -ը վերևում: Ըստ էության, դա կանգնած կամ հաստատուն է ՝ 0x20000000- ի նման բառացի արժեք օգտագործելու փոխարեն:

Մենք չկարողացանք գրել ՝ RAM- ի գտնվելու վայրը գրելու համար ՝ օգտագործելով վերը նշվածը: Եկեք ուրիշ բան փորձենք:

; թվում է, որ մենք պետք է օգտագործենք մեկ այլ ռեգիստր, որը պարունակում է RAM- ի գտնվելու վայրը

; պատվիրել RAM- ի այդ վայրում MOV R1, #0x20000000; RAM- ի վայրը (ոչ թե դրա բովանդակությունը, այլ վայրը) սահմանեք R1- ի մեջ:; ակնհայտ է, որ «0x» - ը նշանակում է, որ հաջորդը վեցանկյուն արժեք է: STR R0, [R1]; R1- ով (0x55) RAM- ում (0x20000000) գրեք R1- ի միջոցով:; մենք օգտագործում ենք մեկ այլ գրանցամատյան (R1), որն ունի RAM տեղադրության հասցե; RAM- ի այդ վայրը գրելու համար:

Վերոնշյալը կատարելու մեկ այլ եղանակ, բայց բառացի հասցեի արժեքի փոխարեն «ACONST» օգտագործելը.

; եկեք նորից անենք վերը նշվածը, բայց եկեք RAM- ի բառացի տեղակայման արժեքի փոխարեն օգտագործենք խորհրդանիշ:

; մենք ցանկանում ենք օգտագործել «ACONST»-ը որպես stand-in 0x20000000- ի համար:; մենք դեռ պետք է անենք «#» ՝ անմիջական արժեք նշանակելու համար, Այսպիսով (տե՛ս վերևում), մենք ստիպված էինք օգտագործել «.set» հրահանգը:; սա ապացուցելու համար եկեք փոխենք տվյալների օրինակը R0- ում: MOV R0, #0xAA; լավ, մենք պատրաստ ենք RAM- ին գրել խորհրդանիշի միջոցով ՝ MOV R1, #ACONST STR R0, [R1] բառացի հասցեի արժեքի փոխարեն:

Տեսանյութը մանրամասնվում է, ինչպես նաև ընթերցում է հիշողության վայրից:

Կարող եք դիտել նաև կցված աղբյուրը.asm ֆայլը:

Քայլ 2: Որոշ հիմնական նավահանգստի տեղեկություններ

Image
Image
Որոշ հիմնական նավահանգստի տեղեկություններ
Որոշ հիմնական նավահանգստի տեղեկություններ
Որոշ հիմնական նավահանգստի տեղեկություններ
Որոշ հիմնական նավահանգստի տեղեկություններ

Այժմ, երբ մենք լավ պատկերացում ունենք, թե ինչպես գրել / կարդալ RAM- ի գտնվելու վայրից, դա կօգնի մեզ ավելի լավ հասկանալ, թե ինչպես վերահսկել և օգտագործել GPIO- ի քորոցը

Այսպիսով, ինչպես ենք մենք փոխազդում GPIO կապում: Այս միկրոկառավարիչի և դրա ARM հրահանգների մեր նախորդ հայացքից մենք գիտենք, թե ինչպես վարվել դրա ներքին գրանցամատյանների հետ և գիտենք, թե ինչպես փոխազդել հիշողության (RAM) հասցեների հետ: Բայց GPIO կապում?

Պատահում է, որ այդ կապումներն են հիշողության քարտեզագրված, այնպես որ մենք կարող ենք նրանց վերաբերվել գրեթե նույն կերպ, ինչպես հիշողության հասցեները:

Սա նշանակում է, որ մենք պետք է իմանանք, թե որոնք են այդ հասցեները:

Ստորև բերված են նավահանգստի մեկնարկային հասցեները: Ի դեպ, MSP432- ի համար «նավահանգիստը» կապերի հավաքածու է, և ոչ միայն մեկ կապում: Եթե դուք ծանոթ եք Raspberry Pi- ին, ես կարծում եմ, որ այն տարբերվում է այստեղի իրավիճակից:

Վերոնշյալ պատկերի կապույտ շրջանակները ցույց են տալիս գրությունը տախտակի վրա երկու անջատիչների և LED- ների համար: Կապույտ գծերը մատնանշում են իրական LED- ները: Մենք ստիպված չենք լինի դիպչել գլխի թռիչք կատարողներին:

Ես այն նավահանգիստները, որոնք մեզ մտահոգում են, ստորև գրել եմ համարձակ:

  • GPIO P1: 0x4000 4C00 + 0 (նույնիսկ հասցեներ)
  • GPIO P2: 0x4000 4C00 + 1 (կենտ հասցեներ)
  • GPIO P3: 0x4000 4C00 + 20 (նույնիսկ հասցեներ)
  • GPIO P4: 0x4000 4C00 + 21 (կենտ հասցեներ)
  • GPIO P5: 0x4000 4C00 + 40 (նույնիսկ հասցեներ)
  • GPIO P6: 0x4000 4C00 + 41 (կենտ հասցեներ)
  • GPIO P7: 0x4000 4C00 + 60 (նույնիսկ հասցեներ)
  • GPIO P8: 0x4000 4C00 + 61 (կենտ հասցեներ)
  • GPIO P9: 0x4000 4C00 + 80 (նույնիսկ հասցեներ)
  • GPIO P10: 0x4000 4C00 + 81 (կենտ հասցեներ)

Մենք դեռ չենք ավարտել: Մեզ ավելի շատ տեղեկություններ են պետք:

Պորտը վերահսկելու համար մեզ պետք են մի քանի հասցեներ: Ահա թե ինչու վերը նշված ցուցակում մենք տեսնում ենք «զույգ հասցեներ» կամ «կենտ հասցեներ»:

I/O Գրանցել հասցեի բլոկներ

Մեզ անհրաժեշտ կլինեն այլ հասցեներ, ինչպիսիք են ՝

  • Պորտ 1 Մուտքային գրանցամատյանի հասցեն = 0x40004C00
  • Պորտ 1 Ելքային գրանցման հասցե = 0x40004C02
  • Նավահանգիստ 1 Ուղղություն Գրանցման հասցե = 0x40004C04
  • Պորտ 1 Ընտրեք 0 Գրանցման հասցե = 0x40004C0A
  • Պորտ 1 Ընտրեք 1 Գրանցման հասցե = 0x40004C0C

Եվ մենք կարող ենք ուրիշների կարիքը ունենալ:

Լավ, մենք այժմ գիտենք GPIO գրանցամատյանների հասցեների տիրույթը `մեկ կարմիր LED- ը վերահսկելու համար:

Շատ կարևոր նշում. MSP432 LaunchPad տախտակի յուրաքանչյուր մուտքի/ելքային նավահանգիստ մի քանի (սովորաբար 8) կապումներից կամ տողերից է, և յուրաքանչյուրը կարող է առանձին սահմանվել որպես մուտք կամ ելք:

Սա նշանակում է, օրինակ, որ եթե դուք արժեքներ եք սահմանում «Պորտ 1 ուղղության գրանցման հասցեի» համար, ապա ձեզ պետք է մտահոգի, թե որ բիթը (կամ բիթերն) եք սահմանում կամ փոխում այդ հասցեում: Այս մասին ավելի ուշ:

GPIO նավահանգստի ծրագրավորման հաջորդականություն

Վերջնական կտորը, որը մեզ պետք է, գործընթաց կամ ալգորիթմ է, որն օգտագործվում է ՝ LED- ը վերահսկելու համար:

Մեկանգամյա նախաստորագրում.

  • Կարգավորեք P1.0 (P1SEL1REG: P1SEL0REG Register) <--- 0x00, 0x00 նորմալ GPIO ֆունկցիոնալության համար:
  • P1DIRREG- ի ուղղության գրանցամատյան 1 բիթը թողարկեք որպես ելք կամ բարձր:

Օղակ:

Կարմիր LED- ը միացնելու համար P1OUTREG գրանցամատյանի 0 բիթին գրեք HIGH

  • Callանգահարեք հետաձգման գործառույթ
  • Կարմիր LED- ն անջատելու համար P1OUTREG գրանցամատյանի 0 բիթին գրեք LOW
  • Callանգահարեք հետաձգման գործառույթ
  • Կրկնել հանգույցը

Մուտքի / ելքի ո՞ր գործառույթն է (կազմաձևել SEL0 և SEL1)

LaunchPad- ի քորոցներից շատերն ունեն բազմակի օգտագործումներ: Օրինակ, նույն քորոցը կարող է լինել ստանդարտ թվային GPIO, կամ այն կարող է օգտագործվել նաև UART կամ I2C սերիական հաղորդակցության մեջ:

Այդ քորոցի համար որևէ հատուկ գործառույթ օգտագործելու համար անհրաժեշտ է ընտրել այդ գործառույթը: Դուք պետք է կազմաձևեք քորոցի գործառույթը:

Այս քայլի վերևում կա մի պատկեր, որը փորձում է բացատրել այս հասկացությունը տեսողական տեսքով:

SEL0 և SEL1 հասցեները կազմում են զույգ համադրություն, որը հանդես է գալիս որպես գործառույթների / գործառույթների ընտրության տեսակ:

Մեր նպատակների համար մենք ցանկանում ենք ստանդարտ թվային GPIO բիթ 0 -ի համար: Սա նշանակում է, որ մեզ անհրաժեշտ է 0 բիթ SEL0- ի և SEL1- ի համար LԱOWՐ:

Պորտի ծրագրավորման հաջորդականություն (կրկին)

1. Գրել 0x00 P1 SEL 0 Գրանցվել (հասցե 0x40004C0A): Սա 0 բիթի համար սահմանում է OWԱOWՐ

2. Գրեք 0x00 P1 SEL 1 Գրանցամատյանում (հասցե 0x40004C0C): Սա 0 -ի համար սահմանում է OWԱOWՐ, GPIO- ի համար:

3. Գրեք 0x01 P1 DIR գրանցամատյանում (հասցե 0x40004C04): Սա 0 -ի բիթի համար սահմանում է HIGH, ինչը նշանակում է ԵԼՔ:

4. Միացրեք LED- ը ՝ գրելով 0x01 P1 OUTPUT Register (հասցե 0x40004C02)

5. Կատարեք ինչ-որ հետաձգում (կամ պարզապես մեկ քայլ ՝ կարգաբերման ընթացքում)

6. Անջատեք LED- ը ՝ գրելով 0x00 P1 OUTPUT գրանցամատյանում (հասցե 0x40004C02)

7. Կատարեք ինչ-որ հետաձգում (կամ պարզապես մեկ քայլ ՝ կարգաբերման ընթացքում)

8. Կրկնեք 4 -ից 7 -րդ քայլերը:

Այս քայլի հետ կապված տեսանյութը մեզ տանում է ողջ գործընթացի միջոցով ՝ ցուցադրական ցուցադրման միջոցով, քանի որ մենք մեկ քայլով անցնում և խոսում ենք հավաքման յուրաքանչյուր հրահանգի միջոցով և ցուցադրում LED- ի գործողությունը: Խնդրում ենք ներել տեսանյութի երկարությունը:

Քայլ 3. Դուք տեսա՞ք տեսանյութի միակ թերությունը:

Տեսանյութում, որն անցնում է LED- ի ծրագրավորման և լուսավորման ամբողջ գործընթացով, հիմնական հանգույցում կար լրացուցիչ քայլ, որը կարող էր տեղափոխվել մինչև միանգամյա սկզբնականացում:

Շնորհակալություն այս Ուղեցույցի միջոցով անցնելու համար ժամանակ հատկացնելու համար:

Հաջորդը կընդլայնի այն, ինչ մենք սկսել ենք այստեղ:

Խորհուրդ ենք տալիս: