جدول المحتويات:

الجزء 2 - تجميع GPIO ARM - RGB - المكالمات الوظيفية - المفاتيح: 6 خطوات
الجزء 2 - تجميع GPIO ARM - RGB - المكالمات الوظيفية - المفاتيح: 6 خطوات

فيديو: الجزء 2 - تجميع GPIO ARM - RGB - المكالمات الوظيفية - المفاتيح: 6 خطوات

فيديو: الجزء 2 - تجميع GPIO ARM - RGB - المكالمات الوظيفية - المفاتيح: 6 خطوات
فيديو: Part 3 ARM Assembly MSP432 TI RSLK GPIO RGB Lab 6 2024, يوليو
Anonim
الجزء 2 - تجميع GPIO ARM - RGB - المكالمات الوظيفية - المفاتيح
الجزء 2 - تجميع GPIO ARM - RGB - المكالمات الوظيفية - المفاتيح

في الجزء الأول ، تعلمنا كيفية تبديل مؤشر LED أحمر واحد على لوحة تطوير MSP432 LaunchPad من شركة Texas Instruments ، باستخدام التجميع بدلاً من C / C ++.

في Instructable ، سنفعل شيئًا مشابهًا - التحكم في RGB LED الموجود أيضًا على نفس اللوحة.

على طول الطريق ، نأمل في زيادة معرفتنا بتجميع ARM ، وليس مجرد الاستمتاع بإضاءة بعض مصابيح LED.

الخطوة 1: دعنا ننتقل مباشرة

حقًا ، الفيديو الأول يوضح كل شيء. ليس هناك الكثير لإضافته.

والهدف الرئيسي منه هو إعادة فكرة أن كل منفذ إدخال / إخراج على MSP432 يتكون من كتلة من عناوين "التسجيل" ، والتي تتكون بدورها من عدة بتات لكل منها.

علاوة على ذلك ، يتم تجميع البتات بطريقة متعامدة. أي أن البتة 0 من كل عنوان سجل تشير إلى نفس رقم التعريف الشخصي I / O الخارجي.

كررنا فكرة أن الأمر يتطلب عدة عناوين تسجيل لهذا المنفذ ، لفعل شيء حتى ولو بت واحد أو دبوس.

ولكن في هذه الحالة ، نظرًا لأننا نتعامل مع RGB LED ، نحتاج إلى التعامل مع ثلاث بتات لكل عنوان تسجيل.

لقد أكدنا أننا بحاجة إلى العديد من السجلات: سجل DIR ، وسجل SEL0 ، وسجل SEL1 ، وسجل الإخراج. وثلاث بتات في كل مرة.

الخطوة 2: تحسين الكود - أضف وظيفة

Image
Image

كما رأيت في الخطوة أعلاه ، كانت حلقة البرنامج الرئيسية تحتوي على الكثير من التعليمات البرمجية المتكررة ، أي عندما نقوم بإيقاف تشغيل مصابيح LED.

لذلك يمكننا إضافة دالة إلى البرنامج. لا يزال يتعين علينا استدعاء هذه الوظيفة في كل مرة نريد إيقاف تشغيل مصابيح LED ، ولكنها تؤدي إلى انهيار بعض الكود إلى عبارة واحدة.

لو كان كود LED-off الخاص بنا أكثر ارتباطًا بالعديد من الإرشادات ، لكان هذا بمثابة توفير حقيقي للذاكرة.

جزء من البرمجة المدمجة ووحدات التحكم الصغيرة هو إدراك حجم البرنامج بشكل أكبر.

يوضح الفيديو.

بشكل أساسي ، نضيف تعليمة متفرعة إلى الكود الرئيسي لدينا ، ولدينا كتلة أخرى من الكود وهي الوظيفة التي نتفرع إليها. وبعد ذلك ، بمجرد أن ننتهي ، أو في نهاية الوظيفة ، نعود إلى العبارة التالية داخل البرنامج الرئيسي.

الخطوة 3: إضافة "تأجيل تكرار الانشغال"

في قسم التعريفات من الكود ، أضف ثابتًا لتسهيل عملية tweek للتوقيت المطلوب:

؛ أي كلمات بعد الفاصلة المنقوطة ("؛") تبدأ تعليقًا.

؛ الرمز في هذا الجزء يعين اسمًا لقيمة. ؛ يمكنك أيضًا استخدام ".equ" لكنها مختلفة قليلاً. ؛ ".equ" (أعتقد) لا يمكن تغييره ، بينما ". set" تعني أنه يمكنك ؛ قم بتغيير قيمة "DLYCNT" لاحقًا في الكود إذا كنت ترغب في ذلك. ؛ سيتم استخدام "DLYCNT" كقيمة للعد التنازلي في الروتين الفرعي للتأخير. مجموعة DLYCNT 0x30000

أضف وظيفة تأخير جديدة:

تأخير:.asmfunc؛ بداية روتين أو وظيفة "تأخير".

MOV R5 ، #DLYCNT ؛ تحميل وحدة المعالجة المركزية الأساسية R5 مع القيمة المعينة إلى "DLYCNT". dlyloop. هذا يشير إلى بداية حلقة التأخير. المجمع يحدد العنوان. SUB R5 ، # 0x1 ؛ اطرح 1 من القيمة الحالية في سجل وحدة المعالجة المركزية الأساسية R5. CMP R5 ، # 0x0 ؛ قارن القيمة الحالية في R5 إلى 0. BGT dlyloop ؛ الفرع إذا كانت القيمة في R5 أكبر من 0 ، لتسمية (العنوان) "dlyloop". BX LR ؛ إذا وصلنا إلى هنا ، فهذا يعني أن قيمة R5 كانت 0. العائد من الروتين الفرعي..endasmfunc؛ يمثل نهاية الروتين الفرعي.

ثم في الجسم الرئيسي ، داخل الحلقة الرئيسية ، استدعاء أو استدعاء وظيفة التأخير هذه:

؛ هذا جزء من الكود ، من الجسم الرئيسي أو الوظيفة الرئيسية (انظر ملف "main.asm").

؛ هذه حلقة في "main" ، وتوضح كيف نستدعي أو نستخدم وظيفة "التأخير" الجديدة. ؛ إن '#REDON' و '#GRNON' هي أيضًا تعريفات (ثوابت) (انظر أعلى 'main.asm'). ؛ إنها مجرد طريقة سهلة لضبط اللون المحدد لـ RGB LED. حلقة MOV R0 ، #REDON ؛ أحمر - ضبط سجل وحدة المعالجة المركزية الأساسية R0 مع القيمة المعينة إلى "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 (AAPCS)

ربما يكون هذا هو الوقت المناسب لتقديم شيء ما. إنها اتفاقية لغة التجميع. يُعرف أيضًا باسم معيار استدعاء الإجراء لهندسة ARM.

هناك الكثير لهذا ، لكنه مجرد معيار. لا يمنعنا ذلك من تعلم برمجة التجميع ، ويمكننا اعتماد أجزاء من هذا المعيار أثناء ذهابنا ، بمجرد أن نشعر بالراحة تجاه بعض المفاهيم التي نتعلمها.

خلاف ذلك ، قد نشعر وكأننا نشرب من خرطوم مياه ضخم. الكثير من المعلومات.

السجلات الأساسية

منذ أن أصبحنا على دراية بالسجلات الأساسية لـ MSP432 ، فلنحاول الآن اعتماد بعض هذه المعايير. سنتوافق مع هذا عندما نكتب الوظيفة التالية (تشغيل / إيقاف تشغيل مؤشر LED).

1) من المفترض أن نستخدم R0 كمعامل دالة. إذا كنا نرغب في تمرير قيمة إلى الوظيفة (روتين فرعي) ، فيجب أن نستخدم R0 للقيام بذلك.

2) يتعين علينا استخدام Link Register للغرض المقصود منه - فهو يحتفظ بالعنوان الذي يشير إلى مكان العودة بعد اكتمال الإجراء الفرعي.

سترى كيف نطبق هذه.

الخطوة 5: الوظيفة مع المعلمة - الوظائف المتداخلة

يمكننا تنظيف الكود الخاص بنا وتقليل حجم الذاكرة التي يشغلها من خلال دمج الأقسام المتكررة في وظيفة واحدة. الاختلاف الوحيد في جسم الحلقة الرئيسية هو أننا نحتاج إلى معلمة حتى نتمكن من تمرير الألوان المختلفة المختلفة التي نريد رؤيتها من RGB LED.

ألق نظرة على الفيديو للحصول على التفاصيل. (آسف للطول)

الخطوة 6: إدخال GPIO - إضافة مفاتيح

لنجعله اكثر اهتماما. حان الوقت لإضافة بعض التحكم في التبديل إلى برنامج التجميع الخاص بنا.

يحتوي هذا Instructable على صور توضح كيفية توصيل المحولين الموجودين على اللوحة بـ MSP432.

بشكل أساسي: المحول 1 (SW1 أو S1) متصل بـ P1.1 ، والمحول 2 (SW2 أو S2) متصل بـ P1.4.

هذا يجعل الأمور مثيرة للاهتمام بعض الشيء ، ليس فقط لأننا نتعامل مع المدخلات بدلاً من المخرجات ، ولكن أيضًا لأن هذين المحولين يشغلان أو يشغلان بتتين من نفس كتلة عنوان التسجيل كما يفعل مؤشر LED الأحمر الفردي الذي يعد ناتجًا.

لقد تعاملنا مع تبديل مؤشر LED الأحمر الفردي في Instructable ، لذلك نحتاج فقط إلى إضافة رمز للتعامل مع المفاتيح.

المنفذ 1 سجل كتلة العنوان

تذكر أننا غطينا هذه في Instructable السابق ، لكن علينا تضمين واحدة جديدة:

  • عنوان تسجيل إدخال المنفذ 1 = 0x40004C00
  • عنوان تسجيل إخراج المنفذ 1 = 0x40004C02
  • عنوان تسجيل اتجاه المنفذ 1 = 0x40004C04
  • منفذ 1 المقاوم تمكين عنوان التسجيل = 0x40004C06
  • المنفذ 1 حدد 0 عنوان التسجيل = 0x40004C0A
  • المنفذ 1 حدد 1 عنوان التسجيل = 0x40004C0C

عند استخدام المنافذ كمدخلات ، من الجيد استخدام مقاومات السحب الداخلي أو المنسدلة MSP432.

نظرًا لأن لوحة تطوير Launchpad قد قامت بتوصيل المحولين إلى الأرض (LOW عند الضغط عليها) ، فهذا يعني أنه يجب علينا استخدام مقاومات السحب لأعلى للتأكد من أن لدينا قوة عالية صلبة عندما لا يتم الضغط عليها.

سحب المقاومات لأعلى / اسحب

يتطلب الأمر عنوانين مختلفين من عناوين Port 1 Register لربط مدخلات المحول هذه بمقاومات سحب.

1) استخدم سجل Port 1 Resistor-Enable (0x40004C06) للإشارة فقط إلى أنك تريد مقاومات (لهاتين البتتين) ،

2) ثم استخدم سجل إخراج المنفذ 1 (0x40004C02) لتعيين المقاومات إما على شكل سحب لأعلى أو سحب لأسفل. قد يبدو محيرًا أننا نستخدم سجل الإخراج على المدخلات. سجل المخرجات يشبه الغرض المزدوج تقريبًا.

لذلك ، لإعادة الحالة بطريقة أخرى ، يمكن أن يرسل سجل الإخراج إما مرتفعًا أو منخفضًا لمخرج (مثل مؤشر LED الأحمر الفردي) ، و / أو يتم استخدامه لضبط مقاومات السحب أو المنسدلة للمدخلات ، ولكن فقط إذا تم تمكين هذه الميزة عبر سجل Resistor-Enable.

مهم في ما سبق - عند إرسال / تعيين LOW أو HIGH إلى أي بت إخراج ، ستحتاج إلى الحفاظ على حالة السحب لأعلى / المنسدلة لبتات الإدخال في وقت واحد.

(الفيديو يحاول الشرح)

قراءة بت إدخال المنفذ

  • اضبط SEL0 / SEL1 لوظائف GPIO
  • قم بتعيين سجل DIR كمدخل لبتات التبديل ، ولكن كإخراج لمصباح LED (في نفس الوقت بنفس البايت)
  • تمكين المقاومات
  • قم بتعيينها كمقاومات سحب
  • اقرأ المنفذ
  • قد ترغب في تصفية القيمة المقروءة لعزل البتات التي تحتاجها فقط (التبديل 1 و 2)

موصى به: