ARM, STM, STM8, آموزش, توصیه شده, مقاله

آموزش میکروکنترلر STM8 قسمت نهم: وقفه خارجی (EXTI)

آموزش میکروکنترلر STM32

آموزش میکروکنترلر STM8; سیسوگ در قسمت هشتم آموزش میکروکنترلر STM8 سیستم کلاک میکروکنترلر را آموزش داد. در این قسمت از  آموزش میکروکنترلر STM8 قصد دارد وقفه خارجی را توضیح دهد. با سیسوگ همراه باشید.

وقفه خارجی یکی از ویژگی های اضافه شده به GPIO ها در حالت ورودی است. که باعث می‌شود میکروکنترلر روال فرآیندهایش را متوقف کند و به تغییرات اعمالی در پین‌های ورودی توسط event ها یا trigger ها پاسخ فوری بدهد. در بسیاری از موارد استفاده از وقفه خارجی سودمند است. به عنوان مثال، دکمه اضطراری موجود روی تردمیل را در نظر بگیرید. شما با سرعت زیاد در حال دویدن هستید که ناگهان مچ پایتان درد می‌گیرد. مطمئناً شما در این حالت میخواهید بلافاصله متوقف شوید، به جای کاهش سرعت به صورت مرحله به مرحله، می‌توانید دکمه اضطراری را بزنید تا تردمیل سریعاً متوقف شود. دکمه اضطراری تمام فرآیندهای دیگر را متوقف می‌کند و بلافاصله به CPU تردمیل دستور می‌دهد تا سرعت را سریع‌تر از حد امکان تغییر دهد. در واقع اولویت آن بالاتر از سایر فرآیندها می‌باشد.

اکثر میکروکنترلرهای 8 بیتی، پین‌های وقفه خارجی کمی دارند و دارای محدودیت هستند، اما چنین محدودیتی برای میکروکنترلر‌های STM8 وجود ندارد. در STM8، تقریباً تمامی پین‌های GPIO دارای قابلیت وقفه خارجی با ورودی اشمیت تریگر هستند. علاوه بر این، کنترل کننده وقفه برای تعیین اولویت وقفه‌ها وجود دارد.

وقفه خارجی میکروکنترلر STM8

وقفه خارجی میکروکنترلر STM8

اتصالات سخت افزاری

اتصالات سخت افزاری وقفه خارجی میکروکنترلر STM8

اتصالات سخت افزاری وقفه خارجی میکروکنترلر STM8

نمونه کد

همان LED ای که در مثال GPIO استفاده کردیم را در اینجا نیز مجدداً استفاده می‌کنیم، اما این بار از سوئیچ به عنوان وقفه خارجی استفاده می‌کنیم. اکنون باید ببینیم که چگونه باید وقفه را پیکربندی و کدگذاری کرد. این کد با تمام چیزهایی که قبلاً دیده اید متفاوت است و نیاز به توجه بیشتری دارد. چون بر خلاف کامپایلرهای دیگر شما باید گام‌های خاصی را بردارید. در دیگر کامپایلرها، تنها چیزی که انجام میدادیم این بود که تابع وقفه را ایجاد کنیم و آدرس بردار وقفه را به کامپایلر بدهیم. در اینجا علاوه بر این کار مراحل دیگری را نیز باید انجام دهیم.

جدول بردار وقفه برای STM8S003 در زیر نشان داده  شده است:

جدول بردار وقفه برای STM8S003

 

این جدول را می‌توانید در دیتاشیت آی سی نیز پیدا کنید. این جدول برای هر آی سی متفاوت است پس مطمئن شوید که دیتاشیت آی سی مورد نظر خود را دریافت کرده‌اید. از آنجا که ما قصد داریم سوئیچ را به PB5 وصل کنیم پس باید از  IRQ4 ، وقفه خارجی PORTB یا EXTI1 استفاده کنیم. تمام وقفه‌های خارجی روی پین‌های GPIOB در این آدرس قرار گرفته است.

main.c

stm8_interrupt_vector.c

 

حالا قسمت‌های بالای فایل‌های stm8s_it.h و stm8s_it.c را چک کنید.

stm8s_it.h

 

stm8s_it.h

stm8s_it.c

 

stm8s_it.c

کد شما باید به صورت بالا نوشته شده باشد.

توضیح

اکثر قسمت‌های کد همانند کدهای قبلی هستند، بنابراین از توضیح آن‌ها می‌گذریم. با این حال، چیزی جدید وجود دارد:

 

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

حال وقت آن رسیده تا فایل stm8_interrupt_vector.c را توضیح دهیم. قسمت بالای این فایل باید شامل خط #include “stm8s_it.h”  باشد. همچنین باید بخش زیر را در نظر داشته باشید:

 

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

 

 

در قسمت بعدی آموزش میکروکنترلر STM8 سیسوگ قصد دارد، برنامه ای با استفاده از بیپر (Beeper) را آموزش دهد. با سیسوگ همراه باشید.

 

منبع


انتشار مطالب با ذکر نام و آدرس وب سایت سیسوگ، بلامانع است.

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

 

نوشته های مشابه

5 دیدگاه در “آموزش میکروکنترلر STM8 قسمت نهم: وقفه خارجی (EXTI)

  1. Winiston ZZZ Winiston ZZZ گفت:

    با سلام
    با ارور : ?ASlink-Warning-Undefined Global ‘_EXTI_SetTLISensitivity’ referenced by module ‘main’
    make: *** [makefile:56: main] Error 1
    “make all” terminated with exit code 2. Build might be incomplete.
    مواجه میشوم

    1. Winiston ZZZ Winiston ZZZ گفت:

      22:07:32 **** Incremental Build of configuration Default for project STM8 ****
      make all
      sdcc -c -IStdPeriphLib/inc -DUSE_STDPERIPH_DRIVER -mstm8 -Ddouble=float –std-c99 –nolospre –opt-code-size –out-fmt-ihx –debug -obin/StdPeriphLib/src/ StdPeriphLib/src/stm8s_clk.c
      sdcc -c -IStdPeriphLib/inc -DUSE_STDPERIPH_DRIVER -mstm8 -Ddouble=float –std-c99 –nolospre –opt-code-size –out-fmt-ihx –debug -obin/StdPeriphLib/src/ StdPeriphLib/src/stm8s_gpio.c
      sdcc -IStdPeriphLib/inc -DUSE_STDPERIPH_DRIVER -mstm8 -Ddouble=float –std-c99 –nolospre –opt-code-size –out-fmt-ihx –debug main.c -o bin/ bin/StdPeriphLib/src/stm8s_gpio.rel bin/StdPeriphLib/src/stm8s_clk.rel

      ?ASlink-Warning-Undefined Global ‘_ITC_DeInit’ referenced by module ‘main’

      ?ASlink-Warning-Undefined Global ‘_EXTI_SetExtIntSensitivity’ referenced by module ‘main’

      ?ASlink-Warning-Undefined Global ‘_EXTI_DeInit’ referenced by module ‘main’

      ?ASlink-Warning-Undefined Global ‘_ITC_SetSoftwarePriority’ referenced by module ‘main’

      ?ASlink-Warning-Undefined Global ‘_EXTI_SetTLISensitivity’ referenced by module ‘main’
      make: *** [makefile:56: main] Error 1
      “make all” terminated with exit code 2. Build might be incomplete.

      22:07:33 Build Failed. 1 errors, 0 warnings. (took 1s.535ms)

      1. زئوس Zeus زئوس Zeus گفت:

        سلام دوست عزیز
        خطاهایی که مواجه شدید به این معنی است که از توابعی استفاده کردید که توی فایل های پروژه تعریفی برای اون وجود نداره ؛ الان داره میگه که مثلا ‘_ITC_DeInit’ تایعی رو که توی مین برنامه مورد استفاده قرار دادید ؛ هیچ کجا دیفاین نشده و هیچ تعریفی براش پیدا نمیکنه

  2. zeos گفت:

    خیلی ببخشید مطالب سایتتون مفت نمی ارزه.همش یا کپی پیسته یا ترجمه
    بعضی مطالبی که میذارین اصلا تست شده هم نسیتن ناقص کپی شدن فقط باعث سردرگمی ادم میشن
    با تشکر

    1. Sisoog Os Sisoog Os گفت:

      ممنون از نظر شما
      این اولین نظر به این تندی در حدود یکسال کاری سیسوگ هست 🙂
      و به جرات میتونم بگم شاید دو مطلب در کل سایت داریم که قسمتهایی از اون کپی شدند که دقیقا هم اشاره شده
      خیلی از محتواهای ایجاده شده هم عملی تست شده اند و اکثر آموزش میکروکنترلر STM8 دقیقا تست شده که میتونید حتی نمونه بردهای تست شده را هم در زیر برخی از پست ها ببنید

      بسیاری از مطالب وب سایت هیچ نمونه حتی خارجی ندارند و خیلی از اونها هم دقیقا ایجاد شده اند

      اگر قسمتی اش به نظرتون دچار اشکال هست و اگر نظری دارید در مورد قسمتی اش که میتونه بهتر کنه اموزش را ممنون میشم بگید تا ما سعی کنیم تصحیح کنیم

پاسخی بگذارید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *