فهرست مطالب:

قسمت 2 - GPIO ARM ASMEMBLY - RGB - FUNCTION CALLS - سوئیچ ها: 6 مرحله
قسمت 2 - GPIO ARM ASMEMBLY - RGB - FUNCTION CALLS - سوئیچ ها: 6 مرحله

تصویری: قسمت 2 - GPIO ARM ASMEMBLY - RGB - FUNCTION CALLS - سوئیچ ها: 6 مرحله

تصویری: قسمت 2 - GPIO ARM ASMEMBLY - RGB - FUNCTION CALLS - سوئیچ ها: 6 مرحله
تصویری: ,GPIO, register,cmsis, HAL,( جلسه بیست و دوم ) ARM آموزش 2024, نوامبر
Anonim
قسمت 2 - GPIO ARM ASMEMBLY - RGB - FUNCTION CALLS - سوئیچ ها
قسمت 2 - GPIO ARM ASMEMBLY - RGB - FUNCTION CALLS - سوئیچ ها

در قسمت 1 ، نحوه چگونگی جابجایی یک LED قرمز بر روی برد توسعه MSP432 LaunchPad از Texas Instruments ، با استفاده از اسمبلی به جای C / C ++ را آموختیم.

در این دستورالعمل ، ما کاری مشابه انجام می دهیم - یک LED RGB که روی همان برد قرار دارد را کنترل کنید.

در طول راه ، ما امیدواریم که دانش خود را در مورد مونتاژ ARM بیشتر کنیم ، و فقط از روشن کردن برخی LED ها لذت نبریم.

مرحله 1: بیایید مستقیم وارد شویم

در واقع ، اولین ویدیو گویای همه چیز است. چیز بیشتری برای افزودن نیست.

نکته اصلی این است که این ایده را به خانه منتقل کنید که هر پورت ورودی/خروجی در MSP432 شامل یک بلوک از آدرس های "ثبت" است که به نوبه خود از چندین بیت تشکیل شده است.

علاوه بر این ، بیت ها به صورت متعامد گروه بندی می شوند. یعنی بیت 0 هر آدرس ثبات به همان پین I/O خارجی اشاره دارد.

ما این ایده را تکرار کردیم که برای انجام آن کار فقط با یک بیت یا پین ، چندین آدرس ثبات لازم است.

اما در این مورد ، از آنجا که ما با LED RGB سروکار داریم ، باید برای هر آدرس ثبت سه بیت را در نظر بگیریم.

ما تأیید کردیم که به چندین ثبت نیاز داریم: ثبت DIR ، ثبت SEL0 ، ثبت SEL1 و ثبت OUTPUT. و هر بار سه بیت

مرحله 2: بهبود کد - افزودن یک تابع

Image
Image

همانطور که در مرحله بالا مشاهده کردید ، حلقه اصلی برنامه دارای کد تکراری زیادی بود ، یعنی هنگامی که LED ها را خاموش می کنیم.

بنابراین ما می توانیم یک تابع را به برنامه اضافه کنیم. ما هنوز باید هر بار که می خواهیم LED ها را خاموش کنیم آن تابع را فراخوانی کنیم ، اما باعث می شود برخی از کد در یک دستور واحد جمع شود.

اگر کد خاموش LED ما با دستورالعمل های بیشتری بیشتر درگیر بود ، این یک ذخیره کننده واقعی حافظه بود.

بخشی از برنامه نویسی تعبیه شده و کنترل کننده های میکرو از اندازه برنامه بسیار بیشتر آگاه هستند.

ویدئو توضیح می دهد.

در اصل ، ما یک عبارت انشعاب به کد اصلی خود اضافه می کنیم و یک بلوک کد دیگر داریم که همان تابع است که به آن منشعب می شویم. و پس از اتمام کار یا پایان کار ، به دستور بعدی در برنامه اصلی باز می گردیم.

مرحله 3: یک تاخیر حلقه شلوغ اضافه کنید

در بخش اعلامیه های کد ، یک عدد ثابت اضافه کنید تا بتوانید زمان بندی مورد نظر را به راحتی انجام دهید:

؛ هر کلمه ای بعد از نیمه کولون ('؛') یک نظر را شروع می کند.

؛ کد موجود در این قسمت یک نام را به یک مقدار اختصاص می دهد. ؛ شما همچنین می توانید از.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' مراجعه کنید).

؛ این یک حلقه در "اصلی" است و نحوه تماس یا استفاده از آن تابع "تاخیر" جدید را نشان می دهد. ؛ "#REDON" و "#GRNON" نیز اعلان (ثابت) هستند (به بالای "main.asm" مراجعه کنید). ؛ آنها فقط راهی آسان برای تنظیم رنگ LED RGB هستند. حلقه MOV R0 ، #REDON ؛ قرمز - تنظیم کننده اصلی پردازنده 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 (AAPCS)

احتمالاً زمان خوبی برای معرفی چیزی است. این یک کنوانسیون زبان مجمع است. همچنین به عنوان استاندارد فراخوان رویه برای معماری ARM شناخته می شود.

موارد زیادی وجود دارد ، اما این فقط یک استاندارد است. این امر ما را از یادگیری برنامه نویسی اسمبلی باز نمی دارد و می توانیم هر زمان که احساس می کنیم با مفاهیمی که یاد می گیریم احساس راحتی کنیم ، قطعاتی از آن استاندارد را اتخاذ کنیم.

در غیر این صورت ، ممکن است احساس کنیم از یک شلنگ آب بزرگ می نوشیم. اطلاعات بیش از حد.

ثبت های اصلی

از آنجا که ما با رجیسترهای اصلی MSP432 آشنا شده ایم ، بیایید سعی کنیم برخی از این استانداردها را اتخاذ کنیم. وقتی تابع بعدی را می نویسیم (یک LED را روشن یا خاموش کنید) می نویسیم.

1) ما قرار است از R0 به عنوان پارامتر تابع استفاده کنیم. اگر می خواهیم یک مقدار را به تابع (زیر روال) منتقل کنیم ، باید از R0 برای این کار استفاده کنیم.

2) ما باید از پیوند ثبت نام برای مقصود مورد نظر خود استفاده کنیم - این نشانی دارای آدرس است که نشان می دهد پس از تکمیل زیر روال به کجا مراجعه کنید.

خواهید دید که چگونه این موارد را اعمال می کنیم.

مرحله 5: عملکرد با پارامتر - توابع تو در تو

ما می توانیم کد خود را تمیز کرده و مقدار حافظه اشغال شده را با ترکیب بخش های تکراری در یک عملکرد واحد کاهش دهیم. تنها تفاوت در بدنه حلقه اصلی این است که ما به یک پارامتر نیاز داریم تا بتوانیم رنگهای مختلف مختلف مورد نظر خود را از LED RGB منتقل کنیم.

برای جزئیات بیشتر به ویدیو نگاه کنید. (با عرض پوزش)

مرحله 6: ورودی GPIO - افزودن سوئیچ ها

بگذارید جالب تر شود. وقت آن است که مقداری کنترل سوئیچ به برنامه مونتاژ خود اضافه کنیم.

این دستورالعمل دارای تصاویری است که نحوه اتصال دو سوئیچ روی برد به MSP432 را نشان می دهد.

اساساً: سوئیچ 1 (SW1 یا S1) به P1.1 و سوئیچ 2 (SW2 یا S2) به P1.4 متصل است.

این موضوع را نه تنها به این دلیل که به جای خروجی ها با ورودی ها سروکار داریم ، کمی جالب می کند ، بلکه به این دلیل که این دو سوئیچ دو بیت از یک بلوک آدرس ثابتی را اشغال کرده یا می گیرند ، مانند LED قرمز قرمز که یک خروجی است.

ما در این دستورالعمل با تغییر LED واحد قرمز روبرو بودیم ، بنابراین ما فقط باید کد را برای کنترل سوئیچ ها اضافه کنیم.

بند 1 ثبت آدرس بلوک

به یاد داشته باشید که ما در دستورالعمل قبلی به این موارد پرداخته ایم ، اما باید یک مورد جدید را شامل شود:

  • پورت 1 آدرس ثبت نام ورودی = 0x40004C00
  • پورت 1 آدرس ثبت خروجی = 0x40004C02
  • پورت 1 جهت ثبت آدرس = 0x40004C04
  • Port 1 Resistor فعال کردن آدرس ثبت نام = 0x40004C06
  • پورت 1 0 آدرس ثبت نام = 0x40004C0A را انتخاب کنید
  • پورت 1 1 را انتخاب کنید آدرس ثبت نام = 0x40004C0C

هنگام استفاده از پورت ها به عنوان ورودی ، استفاده از مقاومت های کششی یا کشویی داخلی MSP432 خوب است.

از آنجا که برد توسعه Launchpad دو سوئیچ را به زمین متصل کرده است (در زمان فشار دادن LOW) ، این بدان معناست که ما باید از مقاومت های pull UP استفاده کنیم تا مطمئن شویم که وقتی فشرده نمی شوند یک HIGH قوی داریم.

مقاومت را بالا / پایین بکشید

برای پیوند دادن ورودی های سوئیچ به مقاومت های کششی به دو آدرس مختلف Register 1 نیاز است.

1) از ثبت نام Port 1 Resistor-Enable (0x40004C06) برای نشان دادن اینکه می خواهید مقاومت (برای آن دو بیت) استفاده کنید ،

2) و سپس از رجیستر خروجی Port 1 (0x40004C02) برای تنظیم مقاومتها به صورت pull-up یا pull-down استفاده کنید. ممکن است گیج کننده باشد که ما از یک خروجی خروجی در ورودی ها استفاده می کنیم. ثبت خروجی تقریباً دو منظوره است.

بنابراین ، برای بیان مجدد راه دیگری ، ثبت خروجی می تواند یک HIGH یا LOW به خروجی ارسال کند (مانند LED قرمز قرمز) ، و / یا برای تنظیم مقاومت های کششی یا کشویی برای ورودی ها استفاده می شود. ، اما فقط اگر این ویژگی از طریق Resistor-Enable Register فعال شده باشد.

در موارد بالا مهم است-هنگام ارسال/تنظیم LOW یا HIGH به هر بیت خروجی ، باید وضعیت کشش/کشش بیت های ورودی را به طور همزمان حفظ کنید.

(ویدیو سعی می کند توضیح دهد)

خواندن بیت ورودی پورت

  • SEL0 / SEL1 را برای عملکرد GPIO تنظیم کنید
  • ثبت DIR را به عنوان ورودی برای بیت های سوئیچ ، اما به عنوان خروجی برای LED (همزمان در یک بایت) تنظیم کنید
  • مقاومت ها را فعال کنید
  • آنها را به عنوان مقاومت کششی تنظیم کنید
  • بندر را بخوانید
  • ممکن است بخواهید مقدار خوانده شده را فیلتر کنید تا فقط بیت های مورد نیاز را جدا کنید (سوئیچ 1 و 2)

توصیه شده: