فهرست مطالب:

GPIO ARM ASMEMBLY - T.I. کیت یادگیری سیستم ROBOTICS - آزمایشگاه 6: 3 مرحله
GPIO ARM ASMEMBLY - T.I. کیت یادگیری سیستم ROBOTICS - آزمایشگاه 6: 3 مرحله

تصویری: GPIO ARM ASMEMBLY - T.I. کیت یادگیری سیستم ROBOTICS - آزمایشگاه 6: 3 مرحله

تصویری: GPIO ARM ASMEMBLY - T.I. کیت یادگیری سیستم ROBOTICS - آزمایشگاه 6: 3 مرحله
تصویری: ESP32 Turorial 1 - Introduction to SunFounder's ESP32 IoT Learnig kit Software and Arduino IDE 2024, نوامبر
Anonim
GPIO ARM ASMEMBLY - T. I. کیت یادگیری سیستم روباتیک - آزمایشگاه 6
GPIO ARM ASMEMBLY - T. I. کیت یادگیری سیستم روباتیک - آزمایشگاه 6

سلام،

در دستورالعمل قبلی در مورد یادگیری مونتاژ ARM با استفاده از Texas Instruments TI-RSLK (از میکروکنترلر MSP432 استفاده می کند) ، با نام مستعار آزمایشگاه 3 اگر T. I. را انجام می دهید. البته ، ما برخی از دستورالعمل های اساسی مانند نوشتن در ثبت نام و حلقه مشروط را مرور کردیم. ما با استفاده از Eclipse IDE مراحل اجرا را طی کردیم.

برنامه های نوجوانی که اجرا کردیم هیچ تاثیری در تعامل با دنیای خارج نداشت.

به نوعی کسل کننده.

بیایید سعی کنیم امروز با یادگیری کمی در مورد پورت های ورودی/خروجی ، به ویژه پین های دیجیتال GPIO ، آن را کمی تغییر دهیم.

این اتفاق می افتد که این MSP432 بر روی یک برد توسعه عرضه می شود که دارای دو سوئیچ دکمه ای ، یک LED RGB و یک LED قرمز است که همه آنها به برخی از پورت های GPIO متصل شده اند.

این بدان معناست که با یادگیری تنظیم و دستکاری این پین ها از طریق اسمبلی ، می توانیم آن جلوه ها را بصری مشاهده کنیم.

بسیار جالب تر از قدم زدن در اشکال زدایی.

(ما هنوز قدم بر می داریم - این تابع "تاخیر" ما خواهد بود):-D

مرحله 1: بیایید سعی کنیم در RAM بنویسیم / بخوانیم

قبل از اینکه به سراغ دسترسی و کنترل GPIO برویم ، باید قدمی کوچک برداریم.

بیایید فقط با خواندن و نوشتن در یک آدرس حافظه استاندارد شروع کنیم. ما از دستورالعمل قبلی (تصاویر را در آنجا ببینید) می دانیم که RAM از 0x2000 0000 شروع می شود ، بنابراین اجازه دهید از آن آدرس استفاده کنیم.

ما قصد داریم داده ها را بین یک ثبات اصلی (R0) و 0x2000 0000 جابجا کنیم.

ما با یک ساختار فایل اصلی یا محتویات یک برنامه مونتاژ شروع می کنیم. لطفاً برای ایجاد یک پروژه مونتاژ با استفاده از TI's Code Composer Studio (CCS) و برخی پروژه های نمونه به این دستورالعمل مراجعه کنید.

.شست

.text.align 2.global main.thumbfunc main main:.asmfunc؛ -------------------------------------- -------------------------------------------------- ؛ (کد ما به اینجا می رود) ؛ ------------------------------------------ --------------------------------------.. endasmfunc. پایان

من می خواهم چیز جدیدی را به بخش بالا اضافه کنم ، اگر برخی اعلامیه ها (دستورالعمل ها) وجود داشته باشد. بعداً روشن تر می شود.

ACONST. تنظیم 0x20000000 ؛ ما از این بیشتر در پایین استفاده خواهیم کرد (ثابت است)

؛ بدیهی است که "0x" نشان دهنده مقدار شش ضلعی است.

بنابراین محتویات فایل شروع ما اکنون به این شکل است:

.شست

.text.align 2 ACONST. تنظیم 0x20000000؛ ما از این بیشتر در پایین استفاده خواهیم کرد (این یک ثابت است). بدیهی است که '0x' نشان دهنده مقدار شش ضلعی است..global main.thumbfunc اصلی اصلی:.asmfunc ؛ --------------------------------------- ---------------------------------------------- ؛ (کد ما به اینجا می رود) ؛ ------------------------------------------ --------------------------------------.. endasmfunc. پایان

اکنون که موارد بالا را داریم ، بیایید کد را بین خطوط تیره اضافه کنیم.

ما با نوشتن در محل RAM شروع می کنیم. ابتدا الگوی داده را تعیین می کنیم ، مقداری که باید در RAM بنویسیم. ما از یک ثبات اصلی برای تعیین آن مقدار یا داده استفاده می کنیم.

توجه: به خاطر داشته باشید که در کد ، هر خطی که دارای نیمه کولون ('؛') باشد به این معنی است که همه آن کامنت بعد از آن نیمه کولون است.

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

؛ نگارش ؛ ------------------------------------------------ -------------------------------------------------- MOV R0 ، #0x55؛ core register R0 شامل داده هایی است که می خواهیم در محل RAM بنویسیم. ؛ بدیهی است که "0x" نشان دهنده مقدار شش ضلعی است.

در مرحله بعد ، بیایید نگاهی به بیانیه هایی بیاندازیم که کار نمی کنند.

؛ MOV MOV برای نوشتن داده در محل RAM قابل استفاده نیست.

؛ MOV فقط برای داده های فوری به ثبت می رسد ، یا از یک ثبت به ثبت دیگر ؛ یعنی MOV R1 ، R0. ؛ STR باید از STR استفاده کند. ؛ STR R0 ، = ACONST ؛ اصطلاح بد در بیان (the '=')؛ 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 را دارد. به منظور نوشتن TO آن محل RAM

روش دیگری برای انجام موارد بالا ، اما استفاده از "ACONST" به جای مقدار آدرس واقعی:

؛ اجازه دهید دوباره موارد بالا را انجام دهیم ، اما اجازه دهید از یک نماد به جای مقدار واقعی RAM استفاده کنیم.

؛ ما می خواهیم از 'ACONST' بعنوان ایستاده برای 0x20000000 استفاده کنیم. ؛ ما هنوز باید "#" را برای نشان دادن یک مقدار فوری انجام دهیم ، بنابراین (در بالا مشاهده کنید) ، ما مجبور بودیم از دستور ".set" استفاده کنیم. ؛ به منظور اثبات این امر ، اجازه دهید الگوی داده را در R0 تغییر دهیم. MOV R0 ، #0xAA ؛ خوب ، ما آماده ایم تا با استفاده از نماد به جای مقدار آدرس واقعی MOV R1 ، #ACONST STR R0 ، [R1] به RAM بنویسیم.

این ویدئو به جزئیات بیشتری می پردازد و همچنین خواندن را از محل حافظه انجام می دهد.

همچنین می توانید فایل.asm منبع پیوست را مشاهده کنید.

مرحله 2: برخی از اطلاعات اولیه بندر

Image
Image
برخی از اطلاعات اولیه بندر
برخی از اطلاعات اولیه بندر
برخی از اطلاعات اولیه بندر
برخی از اطلاعات اولیه بندر

اکنون که ایده خوبی در مورد نحوه نوشتن / خواندن از محل RAM داریم ، این امر به ما کمک می کند تا نحوه کنترل و استفاده از پین GPIO را بهتر درک کنیم.

بنابراین چگونه با پین های GPIO تعامل داریم؟ از نگاه قبلی ما به این میکروکنترلر و دستورالعمل های ARM آن ، می دانیم که چگونه با رجیسترهای داخلی آن برخورد کنیم و نحوه تعامل با آدرس های حافظه (RAM) را می دانیم. اما پین GPIO؟

این اتفاق می افتد که آن پین ها با حافظه ترسیم می شوند ، بنابراین ما می توانیم آنها را مانند آدرس های حافظه یکسان رفتار کنیم.

این بدان معناست که ما باید بدانیم آن آدرس ها چیست.

در زیر آدرس های شروع پورت آمده است. به هر حال ، برای MSP432 ، "پورت" مجموعه ای از پین ها است و فقط یک پین نیست. اگر با رزبری پای آشنایی دارید ، من معتقدم که متفاوت از وضعیت اینجاست.

دایره های آبی رنگ در تصویر بالا نوشته روی برد دو کلید و 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 (آدرس های فرد)

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

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

ورود/خروج بلوک آدرس

ما به آدرسهای دیگری مانند:

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

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

خوب ، ما اکنون محدوده آدرس های ثبت شده GPIO را برای کنترل LED قرمز قرمز می شناسیم.

یک نکته بسیار مهم: هر پورت ورودی/خروجی روی برد MSP432 LaunchPad مجموعه ای از چندین (معمولاً 8) پین یا خط است و هر کدام را می توان به صورت جداگانه به عنوان ورودی یا خروجی تنظیم کرد.

به عنوان مثال ، این بدان معناست که اگر مقادیری را برای "آدرس 1 جهت ثبت نام پورت 1" تنظیم می کنید ، باید توجه داشته باشید که کدام بیت (یا بیت) را در آن آدرس تنظیم یا تغییر می دهید. بعداً در این باره بیشتر.

دنباله برنامه نویسی GPIO

در نهایت قطعه مورد نیاز ما یک فرایند یا الگوریتم برای کنترل LED است.

راه اندازی اولیه یکبار مصرف:

  • پیکربندی P1.0 (P1SEL1REG: P1SEL0REG Register) <--- 0x00 ، 0x00 برای عملکرد معمولی GPIO.
  • بیت Direction register 1 از P1DIRREG را به عنوان خروجی یا HIGH تنظیم کنید.

حلقه:

برای روشن کردن LED قرمز ، مقدار کمی را در بیت 0 ثبت P1OUTREG بنویسید

  • با تابع تاخیر تماس بگیرید
  • برای خاموش کردن LED قرمز LIT را به بیت 0 ثبت P1OUTREG بنویسید
  • با تابع تاخیر تماس بگیرید
  • حلقه را تکرار کنید

کدام عملکرد ورودی / خروجی (پیکربندی SEL0 و SEL1)

بسیاری از پین های LaunchPad کاربردهای متعددی دارند. به عنوان مثال ، همان پین می تواند GPIO دیجیتال استاندارد باشد ، یا می تواند در ارتباطات سریال UART یا I2C نیز استفاده شود.

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

تصویری در بالا برای این مرحله وجود دارد که سعی می کند این مفهوم را به صورت بصری توضیح دهد.

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

برای اهداف ما ، ما GPIO دیجیتالی استاندارد را برای بیت 0 می خواهیم. این بدان معناست که برای SEL0 و SEL1 برای پایین بودن ، به بیت 0 نیاز داریم.

دنباله برنامه نویسی بندر (دوباره)

1. 0x00 در P1 SEL 0 Register (آدرس 0x40004C0A) بنویسید. این یک مقدار پایین برای بیت 0 تعیین می کند

2. 0x00 را در P1 SEL 1 Register (آدرس 0x40004C0C) بنویسید. این مقدار برای بیت 0 LOW ، برای GPIO تنظیم می کند.

3. 0x01 را در P1 DIR Register (آدرس 0x40004C04) بنویسید. این یک عدد HIGH برای بیت 0 ، به معنی خروجی ، تعیین می کند.

4. با نوشتن 0x01 در P1 OUTPUT Register (آدرس 0x40004C02) LED را روشن کنید

5. انجام برخی از تاخیرها (یا فقط در یک مرحله در حین اشکال زدایی)

6. با نوشتن 0x00 در P1 OUTPUT Register (آدرس 0x40004C02) LED را خاموش کنید

7. انجام برخی از تاخیرها (یا فقط یک مرحله ای در حین اشکال زدایی)

8. مراحل 4 تا 7 را تکرار کنید.

ویدئوی مربوط به این مرحله ما را در یک دموی زنده از تمام مراحل راهنمایی می کند ، زیرا ما در هر دستور مونتاژ به صورت تک مرحله ای صحبت می کنیم و عملکرد LED را نشان می دهیم. لطفا طول ویدئو را معذور کنید.

مرحله 3: آیا یک نقص را در ویدیو گرفتید؟

در ویدئویی که کل مراحل برنامه نویسی و روشن کردن LED را طی می کند ، یک مرحله اضافی در حلقه اصلی وجود داشت که می توانست به مرحله راه اندازی اولیه برسد.

از اینکه وقت گذاشتید و این دستورالعمل را گذراندید متشکرم.

مورد بعدی به آنچه ما در اینجا شروع کرده ایم بسط می دهد.

توصیه شده: