विषयसूची:

GPIO आर्म असेंबली - टी.आई. रोबोटिक्स सिस्टम लर्निंग किट - लैब 6: 3 चरण
GPIO आर्म असेंबली - टी.आई. रोबोटिक्स सिस्टम लर्निंग किट - लैब 6: 3 चरण

वीडियो: GPIO आर्म असेंबली - टी.आई. रोबोटिक्स सिस्टम लर्निंग किट - लैब 6: 3 चरण

वीडियो: GPIO आर्म असेंबली - टी.आई. रोबोटिक्स सिस्टम लर्निंग किट - लैब 6: 3 चरण
वीडियो: Technical Session-7.2: eLinux BSP U-Boot Porting on ARM Processors Boards 2024, जुलाई
Anonim
GPIO आर्म असेंबली - टी.आई. रोबोटिक्स सिस्टम लर्निंग किट - लैब 6
GPIO आर्म असेंबली - टी.आई. रोबोटिक्स सिस्टम लर्निंग किट - लैब 6

नमस्ते, टेक्सास इंस्ट्रूमेंट्स TI-RSLK (MSP432 माइक्रोकंट्रोलर का उपयोग करता है), उर्फ लैब 3 का उपयोग करके ARM असेंबली सीखने के बारे में पिछले निर्देश में यदि आप T. I कर रहे हैं। बेशक, हमने कुछ बहुत ही बुनियादी निर्देशों पर ध्यान दिया जैसे कि एक रजिस्टर में लिखना, और सशर्त लूपिंग। हमने एक्लिप्स आईडीई का उपयोग करके निष्पादन के माध्यम से कदम रखा।

हमने जिन नन्हे-मुन्नों के कार्यक्रमों को अंजाम दिया, उनका बाहरी दुनिया से कोई लेना-देना नहीं था।

उबाऊ किस्म का।

आइए आज इनपुट/आउटपुट पोर्ट, विशेष रूप से डिजिटल GPIO पिन के बारे में कुछ सीखकर इसे थोड़ा बदलने की कोशिश करें।

ऐसा होता है कि यह एमएसपी 432 एक विकास बोर्ड पर आता है जिसमें पहले से ही दो पुश-बटन स्विच, एक आरजीबी एलईडी और एक लाल एलईडी है, जो सभी कुछ जीपीआईओ बंदरगाहों से बंधे हैं।

इसका मतलब यह है कि जैसा कि हम असेंबली के माध्यम से इन पिनों को सेटअप और हेरफेर करना सीखते हैं, हम उन प्रभावों को नेत्रहीन रूप से देख सकते हैं।

डीबगर के माध्यम से कदम उठाने से कहीं ज्यादा दिलचस्प।

(हम अभी भी कदम रखने जा रहे हैं - यह हमारा 'देरी' कार्य होगा):-D

चरण 1: आइए RAM से लिखने/पढ़ने का प्रयास करें

इससे पहले कि हम GPIO तक पहुँचने और उसे नियंत्रित करने के लिए कूदें, हमें एक छोटा कदम उठाना चाहिए।

आइए मानक मेमोरी एड्रेस को केवल पढ़ने और लिखने से शुरू करें। हम पिछले इंस्ट्रक्शनल (वहां चित्र देखें) से जानते हैं कि RAM 0x2000 0000 से शुरू होती है, तो चलिए उस पते का उपयोग करते हैं।

हम डेटा को एक कोर रजिस्टर (R0) और 0x2000 0000 के बीच स्थानांतरित करने जा रहे हैं।

हम मूल फ़ाइल संरचना या असेंबली प्रोग्राम की सामग्री से शुरू करते हैं। कृपया TI के कोड कम्पोज़र स्टूडियो (CCS) और कुछ नमूना परियोजनाओं का उपयोग करके एक असेंबली प्रोजेक्ट बनाने के लिए इस निर्देश को देखें।

अंगूठा

.text.align 2.global main.thumbfunc main main:.asmfunc; -------------------------------------------; (हमारा कोड यहां जाएगा) ------------------------------------------ ---------------------------------------.endasmfunc.end

मैं शीर्ष खंड में कुछ नया जोड़ना चाहता हूं, क्या कुछ घोषणाएं (निर्देश) हैं। यह बाद में स्पष्ट हो जाएगा।

ACONST.सेट 0x20000000; हम इसे और नीचे उपयोग करेंगे (यह स्थिर है)

; जाहिर है, '0x' इंगित करता है कि हेक्स मान निम्नानुसार है।

तो हमारी प्रारंभिक फ़ाइल सामग्री अब इस तरह दिखती है:

अंगूठा

.text.align 2 ACONST.set 0x20000000; हम इसे और नीचे उपयोग करेंगे (यह स्थिर है); जाहिर है, '0x' इंगित करता है कि हेक्स मान निम्नानुसार है। वैश्विक मुख्य.थंबफंक मुख्य मुख्य:.asmfunc -------------------------------------------; (हमारा कोड यहां जाएगा) ------------------------------------------ ---------------------------------------.endasmfunc.end

अब जब हमारे पास उपरोक्त है, तो धराशायी लाइनों के बीच में कोड जोड़ें।

हम रैम लोकेशन पर लिखना शुरू करते हैं। सबसे पहले हम डेटा पैटर्न, एक मान स्थापित करेंगे, जिसे हम रैम में लिखेंगे। हम उस मूल्य या डेटा को स्थापित करने के लिए एक कोर रजिस्टर का उपयोग करते हैं।

नोट: याद रखें कि कोड में, सेमी-कोलन (';') वाली किसी भी लाइन का मतलब है कि यह सेमी-कोलन के बाद की एक टिप्पणी है।

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

; लिखना;------------------------------------------------ ------------------------------------------- MOV R0, #0x55; कोर रजिस्टर R0 में वह डेटा होगा जिसे हम RAM लोकेशन पर लिखना चाहते हैं।; जाहिर है, '0x' इंगित करता है कि हेक्स मान निम्नानुसार है।

इसके बाद, आइए उन बयानों पर एक नज़र डालें जो काम नहीं करते हैं।

; MOV MOV RAM स्थान पर डेटा लिखने के लिए प्रयोग करने योग्य नहीं है।

; MOV केवल रजिस्टर में तत्काल डेटा के लिए है; या एक रजिस्टर से दूसरे रजिस्टर में; यानी, MOV R1, R0।; STR को STR का उपयोग करना चाहिए।; एसटीआर R0, =ACONST; अभिव्यक्ति में खराब शब्द ('='); एसटीआर आर0, 0x20000000; स्टोर निर्देश के लिए अवैध एड्रेसिंग मोड; एसटीआर R0, ACONST; स्टोर निर्देश के लिए अवैध एड्रेसिंग मोड

बहुत अधिक व्याख्या किए बिना, हमने ऊपर उस 'ACONST' का उपयोग करने का प्रयास किया। अनिवार्य रूप से, यह 0x20000000 जैसे शाब्दिक मूल्य का उपयोग करने के बजाय स्टैंड-इन या स्थिर है।

हम उपरोक्त का उपयोग करके रैम स्थान पर लिखने के लिए लिखने में सक्षम नहीं थे। आइए कुछ और कोशिश करें।

; ऐसा लगता है कि हमें किसी अन्य रजिस्टर का उपयोग करना चाहिए जिसमें RAM स्थान है

; उस RAM स्थान MOV R1, #0x20000000 पर स्टोर करने का आदेश; RAM स्थान (इसकी सामग्री नहीं, बल्कि स्थान) को R1 में सेट करें।; जाहिर है, '0x' इंगित करता है कि हेक्स मान निम्नानुसार है। एसटीआर आर0, [आर1]; R1 का उपयोग करके R0 (0x55) में RAM (0x20000000) में क्या लिखें।; हम एक अन्य रजिस्टर (R1) का उपयोग करते हैं जिसमें RAM स्थान का पता होता है; उस RAM स्थान को लिखने के लिए।

उपरोक्त करने का दूसरा तरीका, लेकिन शाब्दिक पता मान के बजाय 'ACONST' का उपयोग करना:

; चलो ऊपर फिर से करते हैं, लेकिन एक शाब्दिक RAM स्थान मान के बजाय एक प्रतीक का उपयोग करते हैं।

; हम 0x20000000 के लिए स्टैंड-इन के रूप में 'ACONST' का उपयोग करना चाहते हैं।; तत्काल मूल्य को दर्शाने के लिए हमें अभी भी '#' करना है; इसलिए (ऊपर देखें), हमें '.set' निर्देश का उपयोग करना पड़ा।; इसे साबित करने के लिए, आइए डेटा पैटर्न को R0 में बदलें। MOV R0, #0xAA; ठीक है, हम MOV R1, #ACONST STR R0, [R1] के शाब्दिक पता मान के बजाय प्रतीक का उपयोग करके RAM को लिखने के लिए तैयार हैं।

वीडियो कुछ और विस्तार में जाता है, साथ ही स्मृति स्थान से पढ़ने के माध्यम से आगे बढ़ता है।

आप संलग्न स्रोत.asm फ़ाइल भी देख सकते हैं।

चरण 2: कुछ बुनियादी पोर्ट जानकारी

Image
Image
कुछ बुनियादी बंदरगाह जानकारी
कुछ बुनियादी बंदरगाह जानकारी
कुछ बुनियादी बंदरगाह जानकारी
कुछ बुनियादी बंदरगाह जानकारी

अब जब हमारे पास एक अच्छा विचार है कि रैम स्थान से कैसे लिखना/पढ़ना है, तो इससे हमें बेहतर ढंग से समझने में मदद मिलेगी कि जीपीआईओ पिन को कैसे नियंत्रित और उपयोग किया जाए

तो हम GPIO पिन के साथ कैसे इंटरैक्ट करते हैं? इस माइक्रोकंट्रोलर और इसके एआरएम निर्देशों पर हमारे पिछले नज़र से, हम जानते हैं कि इसके आंतरिक रजिस्टरों से कैसे निपटना है, और हम जानते हैं कि मेमोरी (रैम) पते के साथ कैसे बातचीत करें। लेकिन GPIO पिन?

ऐसा होता है कि वे पिन मेमोरी-मैप्ड होते हैं, इसलिए हम उन्हें मेमोरी एड्रेस के समान ही मान सकते हैं।

इसका मतलब है कि हमें यह जानने की जरूरत है कि वे पते क्या हैं।

नीचे बंदरगाह के शुरुआती पते हैं। वैसे, MSP432 के लिए, एक "पोर्ट" पिन का एक संग्रह है, न कि केवल एक पिन। यदि आप रास्पबेरी पाई से परिचित हैं, तो मेरा मानना है कि यह यहां की स्थिति से अलग है।

उपरोक्त छवि में नीले घेरे दो स्विच और एलईडी के लिए बोर्ड पर लेखन दिखाते हैं। नीली रेखाएं वास्तविक एल ई डी की ओर इशारा करती हैं। हमें हैडर जंपर्स को छूना नहीं पड़ेगा।

मैंने उन बंदरगाहों को बनाया है जिनसे हम चिंतित हैं नीचे बोल्ड में।

  • 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 रजिस्टर एड्रेस की रेंज जानते हैं।

एक बहुत ही महत्वपूर्ण नोट: MSP432 लॉन्चपैड बोर्ड पर प्रत्येक I/O पोर्ट कई (आमतौर पर 8) पिन या लाइनों का एक संग्रह है, और प्रत्येक को व्यक्तिगत रूप से इनपुट या आउटपुट के रूप में सेट किया जा सकता है।

इसका मतलब है, उदाहरण के लिए, यदि आप "पोर्ट 1 दिशा रजिस्टर पता" के लिए मान सेट कर रहे हैं, तो आपको इस बात से चिंतित होना चाहिए कि आप उस पते पर किस बिट (या बिट्स) को सेट कर रहे हैं या बदल रहे हैं। इस पर और बाद में।

GPIO पोर्ट प्रोग्रामिंग अनुक्रम

एलईडी को नियंत्रित करने के लिए हमें जिस अंतिम टुकड़े की आवश्यकता है, वह एक प्रक्रिया या एल्गोरिथ्म है।

एक बार की शुरुआत:

  • सामान्य GPIO कार्यक्षमता के लिए P1.0 (P1SEL1REG:P1SEL0REG रजिस्टर) <--- 0x00, 0x00 कॉन्फ़िगर करें।
  • डायरेक्शन रजिस्टर बिट 1of P1DIRREG को आउटपुट या हाई के रूप में सेट करें।

कुंडली:

लाल एलईडी चालू करने के लिए P1OUTREG रजिस्टर का हाई टू बिट 0 लिखें

  • विलंब फ़ंक्शन को कॉल करें
  • लाल एलईडी को बंद करने के लिए P1OUTREG रजिस्टर का LOW से बिट 0 लिखें
  • विलंब फ़ंक्शन को कॉल करें
  • लूप दोहराएं

कौन सा इनपुट/आउटपुट फंक्शन (SEL0 और SEL1 कॉन्फ़िगर करें)

लॉन्चपैड पर कई पिनों के कई उपयोग हैं। उदाहरण, एक ही पिन मानक डिजिटल GPIO हो सकता है, या इसका उपयोग UART, या I2C सीरियल संचार में भी किया जा सकता है।

उस पिन के लिए किसी विशिष्ट फ़ंक्शन का उपयोग करने के लिए, आपको उस फ़ंक्शन का चयन करना होगा। आपको पिन के फ़ंक्शन को कॉन्फ़िगर करने की आवश्यकता है।

इस चरण के लिए ऊपर एक छवि है जो इस अवधारणा को दृश्य रूप में समझाने का प्रयास करती है।

SEL0 और SEL1 पते एक जोड़ी संयोजन बनाते हैं जो किसी प्रकार के फ़ंक्शन / फीचर चयन के रूप में कार्य करते हैं।

हमारे उद्देश्यों के लिए, हम बिट 0 के लिए मानक डिजिटल GPIO चाहते हैं। इसका मतलब है कि हमें SEL0 और SEL1 को कम होने के लिए बिट 0 की आवश्यकता है।

पोर्ट प्रोग्रामिंग अनुक्रम (फिर से)

1. 0x00 से P1 SEL 0 रजिस्टर (पता 0x40004C0A) लिखें। यह बिट 0. के लिए LOW सेट करता है

2. 0x00 से P1 SEL 1 रजिस्टर (पता 0x40004C0C) लिखें। यह बिट 0 के लिए LOW सेट करता है, GPIO के लिए सेटिंग करता है।

3. 0x01 से P1 DIR रजिस्टर (पता 0x40004C04) लिखें। यह बिट 0 के लिए एक उच्च सेट करता है, जिसका अर्थ है OUTPUT।

4. 0x01 से P1 OUTPUT रजिस्टर (पता 0x40004C02) लिखकर LED चालू करें

5. किसी प्रकार की देरी करें (या डिबगिंग के दौरान केवल सिंगल-स्टेप थ्रू)

6. 0x00 से P1 OUTPUT रजिस्टर (पता 0x40004C02) लिखकर एलईडी बंद करें

7. किसी प्रकार की देरी करें (या डिबगिंग के दौरान केवल सिंगल-स्टेप थ्रू)

8. चरण 4 से 7 तक दोहराएं।

इस चरण के लिए संबद्ध वीडियो हमें एक लाइव डेमो में पूरी प्रक्रिया के माध्यम से ले जाता है, क्योंकि हम प्रत्येक असेंबली निर्देश के माध्यम से एकल-चरण और बात करते हैं, और एलईडी क्रिया दिखाते हैं। कृपया वीडियो की लंबाई के लिए क्षमा करें।

चरण 3: क्या आपने वीडियो में एक दोष पकड़ा?

उस वीडियो में जो प्रोग्रामिंग और एलईडी की रोशनी की पूरी प्रक्रिया से चलता है, मुख्य लूप में एक अतिरिक्त कदम था, जिसे एक बार के आरंभीकरण तक ले जाया जा सकता था।

इस निर्देश के माध्यम से जाने के लिए समय निकालने के लिए धन्यवाद।

अगला जो हमने यहां शुरू किया है उस पर विस्तार करता है।

सिफारिश की: