Სარჩევი:

GPIO ARM ASSEMBLY - T.I. ROBOTICS SYSTEM LEARNING KIT - LAB 6: 3 საფეხურები
GPIO ARM ASSEMBLY - T.I. ROBOTICS SYSTEM LEARNING KIT - LAB 6: 3 საფეხურები

ვიდეო: GPIO ARM ASSEMBLY - T.I. ROBOTICS SYSTEM LEARNING KIT - LAB 6: 3 საფეხურები

ვიდეო: GPIO ARM ASSEMBLY - T.I. ROBOTICS SYSTEM LEARNING KIT - LAB 6: 3 საფეხურები
ვიდეო: TI-RSLK Lab 6 GPIO Example 2024, ივლისი
Anonim
GPIO ARM ASSEMBLY - T. I. რობოტიკის სისტემის სწავლის ნაკრები - ლაბორატორია 6
GPIO ARM ASSEMBLY - T. I. რობოტიკის სისტემის სწავლის ნაკრები - ლაბორატორია 6

გამარჯობა, წინა ინსტრუქციებში სწავლის შესახებ ARM ასამბლეის გამოყენებით Texas Instruments TI-RSLK (იყენებს MSP432 მიკროკონტროლერს), aka Lab 3 თუ თქვენ აკეთებთ T. I. რა თქმა უნდა, ჩვენ გავეცანით რამდენიმე ძალიან ძირითად მითითებას, როგორიცაა რეესტრში ჩაწერა და პირობითი მარკირება. ჩვენ გადავდგით აღსრულება Eclipse IDE გამოყენებით.

თინეიჯერული პროგრამები, რომლებიც ჩვენ განვახორციელეთ, არაფერს აკეთებდა გარე სამყაროსთან ურთიერთობისთვის.

სახის მოსაწყენი.

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

ეს ხდება ისე, რომ ეს MSP432 მოდის განვითარების დაფაზე უკვე აქვს ორი ღილაკის ღილაკი, RGB LED და წითელი LED, რომლებიც ყველა GPIO პორტებზეა მიბმული.

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

ბევრად უფრო საინტერესო, ვიდრე უბრალოდ დებაგერატორის გავლა.

(ჩვენ ჯერ კიდევ ვაპირებთ ნაბიჯის გადადგმას - ეს იქნება ჩვენი "დაგვიანების" ფუნქცია):-D

ნაბიჯი 1: შევეცადოთ დავწეროთ / წავიკითხოთ RAM– დან

სანამ ჩვენ გადავალთ GPIO– ს წვდომასა და კონტროლზე, ჩვენ უნდა გადავდგათ მცირე ნაბიჯი.

დავიწყოთ მხოლოდ სტანდარტული მეხსიერების მისამართის კითხვით და წერით. ჩვენ წინა ინსტრუქციიდან ვიცით (იხილეთ სურათები იქ), რომ ოპერატიული მეხსიერება იწყება 0x2000 0000 -ზე, მოდით გამოვიყენოთ ეს მისამართი.

ჩვენ ვაპირებთ მონაცემების გადატანას ძირითად რეგისტრს შორის (R0) და 0x2000 0000.

ჩვენ ვიწყებთ ფაილის ძირითადი სტრუქტურის ან ასამბლეის პროგრამის შინაარსით. გთხოვთ, გაეცნოთ ამ ინსტრუქციას TI– ს Code Composer Studio– ს (CCS) და ზოგიერთი პროექტის მაგალითის შესაქმნელად.

.ცერა თითი

.ტექსტი.წესრიგება 2.გლობალური მთავარი. thumbfunc მთავარი მთავარი:.asmfunc; -------------------------------------- --------------------------------------------------; (ჩვენი კოდი აქ წავა); ---------------------------------------------- ------------------------------------------.endasmfunc.დაასრულე

მე მინდა რაღაც ახალი დავამატო ზედა ნაწილში, თუ იყო რაღაც დეკლარაციები (დირექტივები). მოგვიანებით უფრო ნათელი გახდება.

ACONST. დაყენება 0x20000000; ჩვენ ამას გამოვიყენებთ ქვემოთ (ეს არის მუდმივი)

; ცხადია, '0x' ნიშნავს იმას, რაც შემდგომ არის ჰექსალური მნიშვნელობა.

ასე რომ, ჩვენი საწყისი ფაილის შინაარსი ასე გამოიყურება:

.ცერა თითი

.ტექსტი.გათანაბრება 2 ACONST. დაყენება 0x20000000; ჩვენ ამას გამოვიყენებთ ქვემოთ (ეს არის მუდმივი); ცხადია, '0x' ნიშნავს იმას, რაც შემდგომ არის ჰექსალური მნიშვნელობა..გლობალური მთავარი. thumbfunc მთავარი მთავარი:.asmfunc; ------------------------------------------ ----------------------------------------------; (ჩვენი კოდი წავა აქ); ---------------------------------------------- ------------------------------------------.endasmfunc.დაასრულე

ახლა რაც ზემოთ გვაქვს, მოდით დავამატოთ კოდი დაშორებულ ხაზებს შორის.

ჩვენ ვიწყებთ RAM– ის ადგილას ჩაწერას. პირველ რიგში ჩვენ დავადგენთ მონაცემთა ნიმუშს, მნიშვნელობას, რომელსაც ჩვენ ჩავწერთ RAM- ში. ჩვენ ვიყენებთ ძირითად რეგისტრს ამ ღირებულების ან მონაცემების დასადგენად.

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

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

; ᲬᲔᲠᲐ;------------------------------------------------ -------------------------------------------------- MOV R0, #0x55; ძირითადი რეგისტრი R0 შეიცავს მონაცემებს, რომელთა ჩაწერა გვინდა ოპერატიული მეხსიერების ადგილას.; ცხადია, '0x' ნიშნავს იმას, რაც შემდგომ არის ჰექსალური მნიშვნელობა.

შემდეგი, მოდით შევხედოთ განცხადებებს, რომლებიც არ მუშაობს.

; MOV MOV არ არის გამოსაყენებელი მონაცემების ჩაწერისთვის RAM ადგილას.

; MOV არის მხოლოდ უშუალო მონაცემების რეგისტრაციისთვის; ან ერთი რეგისტრიდან მეორეზე; ანუ, MOV R1, R0.; STR– მა უნდა გამოიყენოს STR.; STR R0, = ACONST; ცუდი ტერმინი გამოხატვაში ('='); STR R0, 0x20000000; მაღაზიის ინსტრუქციის არალეგალური მისამართების რეჟიმი; STR R0, ACONST; მაღაზიის ინსტრუქციის არალეგალური მისამართების რეჟიმი

ზედმეტი ახსნის გარეშე, ჩვენ შევეცადეთ გამოგვეყენებინა ეს 'ACONST' ზემოთ. არსებითად, ეს არის მდგრადი ან მუდმივი იმის ნაცვლად, რომ გამოიყენოთ პირდაპირი მნიშვნელობა, როგორიცაა 0x20000000.

ჩვენ ვერ შევძელით დავწეროთ RAM– ის ადგილმდებარეობის დასაწერად ზემოაღნიშნულის გამოყენებით. მოდი სხვა რამე ვცადოთ.

; როგორც ჩანს, ჩვენ უნდა გამოვიყენოთ სხვა რეესტრი, რომელიც შეიცავს RAM ადგილსამყოფელს

; შეუკვეთეთ RAM– ის იმ ადგილას MOV R1, #0x20000000; დააყენეთ RAM ადგილმდებარეობა (არა მისი შინაარსი, არამედ ადგილმდებარეობა) R1- ში.; ცხადია, '0x' ნიშნავს იმას, რაც შემდგომ არის ჰექსალური მნიშვნელობა. STR R0, [R1]; ჩაწერეთ რა არის R0 (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- ის გასაკონტროლებლად.

ძალიან მნიშვნელოვანი შენიშვნა: თითოეული I/O პორტი MSP432 LaunchPad დაფაზე არის რამდენიმე (ჩვეულებრივ 8) ქინძისთავის ან ხაზის კოლექცია და თითოეული შეიძლება ინდივიდუალურად იყოს შეყვანილი ან გამომავალი.

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

GPIO პორტის პროგრამირების თანმიმდევრობა

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

ერთჯერადი ინიციალიზაცია:

  • კონფიგურაცია P1.0 (P1SEL1REG: P1SEL0REG რეგისტრაცია) <--- 0x00, 0x00 ნორმალური GPIO ფუნქციონირებისთვის.
  • დააყენეთ P1DIRREG- ის მიმართულების რეგისტრის ბიტი 1 გამომავალი, ან მაღალი.

მარყუჟი:

ჩაწერეთ P1OUTREG რეგისტრის ბიტის 0 -ზე მაღალი, რომ ჩართოთ წითელი LED

  • დარეკეთ დაგვიანების ფუნქცია
  • ჩაწერეთ POWOUTREG რეგისტრის 0 ბიტიდან LOW, რომ გამორთოთ წითელი LED
  • დარეკეთ დაგვიანების ფუნქცია
  • გაიმეორეთ მარყუჟი

რომელი შეყვანის / გამოყვანის ფუნქცია (კონფიგურაცია SEL0 და SEL1)

LaunchPad– ის ბევრ ქინძისთავს აქვს მრავალი გამოყენება. მაგალითად, იგივე პინი შეიძლება იყოს სტანდარტული ციფრული GPIO, ან ის შეიძლება გამოყენებულ იქნას UART, ან I2C სერიულ კომუნიკაციებში.

იმისათვის, რომ გამოიყენოთ რაიმე კონკრეტული ფუნქცია ამ პინისთვის, თქვენ უნდა აირჩიოთ ეს ფუნქცია. თქვენ უნდა დააკონფიგურიროთ pin ფუნქცია.

ამ სურათის ზემოთ არის სურათი, რომელიც ცდილობს ახსნას ეს კონცეფცია ვიზუალური ფორმით.

SEL0 და SEL1 მისამართები ქმნიან წყვილთა კომბინაციას, რომლებიც ასრულებენ ფუნქციის / მახასიათებლების შერჩევას.

ჩვენი მიზნებისათვის, ჩვენ გვინდა სტანდარტული ციფრული GPIO ბიტი 0. ეს ნიშნავს, რომ ჩვენ გვჭირდება ბიტი 0 SEL0 და SEL1 იყოს დაბალი.

პორტის პროგრამირების თანმიმდევრობა (ისევ)

1. ჩაწერეთ 0x00 P1 SEL 0 რეგისტრაცია (მისამართი 0x40004C0A). ეს ადგენს LOW- ს 0 ბიტისთვის

2. ჩაწერეთ 0x00 P1 SEL 1 რეგისტრაცია (მისამართი 0x40004C0C). ეს ადგენს LOW- ს ბიტისთვის 0, პარამეტრს GPIO- სთვის.

3. ჩაწერეთ 0x01 P1 DIR რეგისტრში (მისამართი 0x40004C04). ეს ადგენს HIGH 0 ბიტს, რაც ნიშნავს OUTPUT.

4. ჩართეთ LED შუქზე 0x01 P1 OUTPUT რეგისტრაციის ჩაწერით (მისამართი 0x40004C02)

5. გააკეთეთ რაიმე სახის შეფერხება (ან უბრალოდ ერთი ნაბიჯი გამართვის დროს)

6. გამორთეთ LED დაწერეთ 0x00 P1 OUTPUT რეგისტრაცია (მისამართი 0x40004C02)

7. გააკეთეთ რაიმე სახის შეფერხება (ან უბრალოდ ერთი ნაბიჯი გამართვის დროს)

8. გაიმეორეთ ნაბიჯები 4 -დან 7 -მდე.

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

ნაბიჯი 3: თქვენ დაიჭირეთ ერთი ნაკლი ვიდეოში?

ვიდეოში, რომელიც გადის LED– ის პროგრამირების და განათების მთელ პროცესს, იყო დამატებითი ნაბიჯი მთავარ მარყუჟში, რომლის გადატანა შეიძლებოდა ერთჯერადი ინიციალიზაციამდე.

გმადლობთ, რომ დრო დაუთმეთ ამ ინსტრუქციის გასავლელად.

შემდეგი გაფართოვდება იმაზე, რაც აქ დავიწყეთ.

გირჩევთ: