Სარჩევი:

ნაწილი 2 - GPIO ARM ASSEMBLY - RGB - FUNCTION CALLS - კონცენტრატორები: 6 ნაბიჯი
ნაწილი 2 - GPIO ARM ASSEMBLY - RGB - FUNCTION CALLS - კონცენტრატორები: 6 ნაბიჯი

ვიდეო: ნაწილი 2 - GPIO ARM ASSEMBLY - RGB - FUNCTION CALLS - კონცენტრატორები: 6 ნაბიჯი

ვიდეო: ნაწილი 2 - GPIO ARM ASSEMBLY - RGB - FUNCTION CALLS - კონცენტრატორები: 6 ნაბიჯი
ვიდეო: ESP32 Turorial 1 - Introduction to SunFounder's ESP32 IoT Learnig kit Software and Arduino IDE 2024, ივლისი
Anonim
ნაწილი 2 - GPIO ARM ASSEMBLY - RGB - FUNCTION CALLS - კონცენტრატორები
ნაწილი 2 - GPIO ARM ASSEMBLY - RGB - FUNCTION CALLS - კონცენტრატორები

პირველ ნაწილში, ჩვენ ვისწავლეთ როგორ გადართოთ ერთი წითელი LED MSP432 LaunchPad განვითარების დაფაზე Texas Instruments– დან, C / C ++ - ის ნაცვლად ასამბლეის გამოყენებით.

ამ ინსტრუქციაში ჩვენ გავაკეთებთ მსგავს რამეს - ვაკონტროლოთ RGB LED, რომელიც ასევე იმავე დაფაზეა.

გზად, ჩვენ ვიმედოვნებთ, რომ გავაუმჯობესებთ ჩვენს ცოდნას ARM– ის შეკრების შესახებ და არა მხოლოდ გავამხიარულოთ რამდენიმე LED- ის განათება.

ნაბიჯი 1: მოდით პირდაპირ შევიდეთ

მართლაც, პირველი ვიდეო ყველაფერს ამბობს. მეტის დამატება არ არის.

მთავარი ის არის, რომ მივიღოთ იდეა, რომ MSP432– ის თითოეული I/O პორტი შედგება ბლოკისგან „რეგისტრირებული“მისამართებისა, რომლებიც თავის მხრივ შედგება რამდენიმე ბიტისგან.

გარდა ამისა, ბიტები დაჯგუფებულია ორთოგონალური წესით. ანუ თითოეული რეგისტრის მისამართის ბიტი 0 ეხება იმავე გარე I/O პინს.

ჩვენ გავიმეორეთ იდეა, რომ ამ პორტისთვის საჭიროა რამდენიმე რეგისტრირებული მისამართი, რაღაცის გასაკეთებლად თუნდაც ერთი ბიტით ან პინით.

მაგრამ ამ შემთხვევაში, ვინაიდან საქმე გვაქვს RGB LED– სთან, ჩვენ უნდა გავუმკლავდეთ სამ ბიტს თითოეული რეგისტრის მისამართისთვის.

ჩვენ გავამყარეთ, რომ ჩვენ გვჭირდება რამდენიმე რეგისტრი: DIR რეგისტრი, SEL0 რეგისტრი, SEL1 რეგისტრი და OUTPUT რეგისტრი. და ყოველ ჯერზე სამი ბიტი.

ნაბიჯი 2: გააუმჯობესეთ კოდი - დაამატეთ ფუნქცია

Image
Image

როგორც ხედავთ ზემოთ მოცემულ ნაბიჯში, მთავარ პროგრამულ მარყუჟს ჰქონდა ბევრი განმეორებითი კოდი, კერძოდ, როდესაც ჩვენ ვთიშავდით LED- ებს.

ამრიგად, ჩვენ შეგვიძლია დავამატოთ პროგრამაში ფუნქცია. ჩვენ კვლავ უნდა გამოვიძახოთ ეს ფუნქცია ყოველ ჯერზე, როდესაც გვსურს LED- ების გამორთვა, მაგრამ ეს იწვევს ზოგიერთი კოდის დაშლას ერთ განცხადებაში.

ჩვენი LED- გამორთვის კოდი რომ უფრო მეტი ინსტრუქციით ყოფილიყო ჩართული, ეს იქნებოდა მეხსიერების ნამდვილი დამზოგველი.

ჩამონტაჟებული პროგრამირების და მიკროკონტროლერების ნაწილი ბევრად უფრო მეტად იცნობს პროგრამის ზომას.

ვიდეო განმარტავს.

არსებითად, ჩვენ ვამატებთ განშტოების დებულებას ჩვენს მთავარ კოდს და ჩვენ გვაქვს კოდის კიდევ ერთი ბლოკი, რომელიც არის ის ფუნქცია, რომლისკენაც ჩვენ განშტოება გვაქვს. შემდეგ კი, როდესაც ჩვენ დავასრულებთ, ან ფუნქციის ბოლოს, ჩვენ დავუბრუნდებით შემდეგ განცხადებას ძირითადი პროგრამის ფარგლებში.

ნაბიჯი 3: დაამატეთ Busy-Loop Delay

კოდის დეკლარაციების განყოფილებაში დაამატეთ მუდმივი, რომ გაადვილოთ სასურველი დროის შერჩევა:

; ნებისმიერი სიტყვა ნახევრად კოლონის შემდეგ (';') იწყებს კომენტარს.

; ამ ნაწილის კოდი მნიშვნელობას ანიჭებს სახელს.; თქვენ ასევე შეგიძლიათ გამოიყენოთ ".equ", მაგრამ ისინი ოდნავ განსხვავდებიან.; ".equ" (მე ვფიქრობ) არ შეიძლება შეიცვალოს, ხოლო ".set" ნიშნავს თქვენ შეგიძლიათ; სურვილის შემთხვევაში შეცვალეთ 'DLYCNT' მნიშვნელობა მოგვიანებით კოდში.; 'DLYCNT' გამოყენებული იქნება როგორც ათვლის მნიშვნელობა დაგვიანების ქვეგეგმაში. DLYCNT.დააყენეთ 0x30000

დაამატეთ შეფერხების ახალი ფუნქცია:

დაგვიანებით:.asmfunc; დაწყების "დაგვიანებით" subroutine ან ფუნქცია.

MOV R5, #DLYCNT; ჩატვირთეთ ძირითადი CPU რეგისტრი R5 მნიშვნელობით მინიჭებული 'DLYCNT'. დლილოპი; ეს ნიშნავს დაგვიანების მარყუჟის დაწყებას. ასამბლეა განსაზღვრავს მისამართს. 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, #REDON; წითელი - კომპლექტი ძირითადი CPU რეგისტრი R0 მნიშვნელობით 'REDON'. STRB R0, [R4]; ძირითადი რეგისტრი R4 ადრე დაყენებული იყო GPIO გამომავალი მისამართით. ჩაწერეთ რა არის R0– ში, R4– ით განსაზღვრულ მისამართზე. BL შეფერხება; განშტოება ახალ "დაგვიანებულ" ფუნქციაზე. BL ledsoff; ფილიალი ადრე არსებული "ledsoff" ფუნქციისკენ. BL შეფერხება; ditto MOV R0, #GRNON; მწვანე - ditto STRB R0, [R4]; და ასე შემდეგ. BL შეფერხება BL ledsoff BL შეფერხება

ვიდეო გადის დეტალებში.

ნაბიჯი 4: ARM Architecture Procedure 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
  • პორტი 1 რეზისტორი ჩართეთ რეგისტრაციის მისამართი = 0x40004C06
  • პორტი 1 აირჩიეთ 0 რეგისტრაციის მისამართი = 0x40004C0A
  • პორტი 1 აირჩიეთ 1 რეგისტრაციის მისამართი = 0x40004C0C

პორტების შესასვლელად გამოყენებისას კარგია MSP432- ის შიდა გამწევ ან გამწევ რეზისტორების გამოყენება.

მას შემდეგ, რაც Launchpad– ის განვითარების დაფამ დააკავშირა ორი გადამრთველი მიწაზე (LOW როდესაც დაპრესილია), ეს ნიშნავს, რომ ჩვენ უნდა გამოვიყენოთ pull UP რეზისტორები, რათა დავრწმუნდეთ, რომ მყარი HIGH გვაქვს, როდესაც ისინი არ არის დაჭერილი.

გაიყვანეთ ზემოთ / ჩამოწიეთ რეზისტორები

ორი განსხვავებული პორტი 1 რეგისტრაციის მისამართია საჭირო იმისათვის, რომ გადამრთველები შეაერთოს გამწევ რეზისტორებთან.

1) გამოიყენეთ Port 1 Resistor-Enable რეგისტრი (0x40004C06), რომ მიუთითოთ, რომ გსურთ რეზისტორები (იმ ორი ბიტისთვის), 2) და შემდეგ გამოიყენეთ პორტი 1 გამოყვანის რეგისტრი (0x40004C02), რომ დააყენოთ რეზისტორები როგორც გამწევი, ისე ჩამოსაშლელი. შეიძლება დამაბნეველი ჩანდეს, რომ ჩვენ ვიყენებთ გამომავალ რეგისტრს შეყვანისას. გამოყვანის რეგისტრს აქვს თითქმის ორმხრივი დანიშნულება.

სხვაგვარად რომ ვთქვათ, გამომავალ რეგისტრს შეუძლია გამოაგზავნოს HIGH ან LOW გამომავალზე (მაგალითად, ერთი წითელი LED), და / ან გამოიყენება შესასვლელებისთვის გამწევი ან ჩამოსაშლელი რეზისტორების დასაყენებლად, მაგრამ მხოლოდ იმ შემთხვევაში, თუ ეს ფუნქცია ჩართულია Resistor-Enable რეგისტრის საშუალებით.

მნიშვნელოვანია ზემოაღნიშნულიდან-ნებისმიერ გამომავალ ბიტზე LOW ან HIGH გაგზავნის/დაყენებისას, თქვენ უნდა შეინარჩუნოთ ერთდროულად შეყვანის ბიტების გაყვანის/გაყვანის მდგომარეობა.

(ვიდეო ცდილობს ახსნას)

პორტის შეყვანის ბიტის კითხვა

  • დააყენეთ SEL0 / SEL1 GPIO ფუნქციონირებისთვის
  • დააყენეთ DIR რეგისტრი, როგორც შეყვანის გადართვის ბიტი, მაგრამ როგორც გამომავალი LED (ერთდროულად იმავე ბაიტში)
  • რეზისტორების ჩართვა
  • დააყენეთ ისინი გამწევ რეზისტენტებად
  • წაიკითხეთ პორტი
  • თქვენ შეიძლება გაფილტროთ წაკითხული მნიშვნელობა, რათა გამოყოთ მხოლოდ თქვენთვის საჭირო ბიტები (გადართეთ 1 და 2)

გირჩევთ: