مدیریت وقفه ها با NVIC و EXTI - قسمت دهم آموزش CH32

blog
۱۴۰۳-۱۱-۲۹
6 دقیقه

با سلام، در این قسمت از آموزش‌ها میریم سراغ مبحث وقفه‌ها در میکروکنترلر CH32 وقفه‌ها بخش مهمی از میکروکنترلرها هستند که در نوشتن یک برنامه کامل میتونن همه‌جوره به کمک ما بیان، اگر بخوایم یک توضیح مختصری در مورد وقفه‌ها بگم به این شکل هست که باعث میشه CPU کاری که داره انجام میده رو ول کنه و کاری که در وقفه تعیین شده رو انجام بده، این وقفه‌ها میتونن از هر قسمتی به CPU برسن، مثلاً گاهی واحد ADC تبدیلش تموم شده و به CPU میگه که من تبدیلم تموم شد بیا دیتا رو ببر؛ ولی اگر نبود CPU هی باید واحد ADC رو چک می‌کرد که آیا تبدیلت تموم شده یا نه؟ اگه اره دیتا رو میبره، اگه نه میره بعد دوباره میاد چک میکنه که این کار وقت CPU رو میگیره، اینجاست که وقفه‌ها به کمکمون میان.

آشنایی با واحدهای وقفه در میکروکنترلر NVIC CH32 و PFIC

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

طبق گفته‌های دیتاشیت این سری از میکرو ها که باهاشون کار می‌کنیم دو جور واحد وقفه دارن این میکرو ها برای سری CH32F2XX به نام NVIC و برای میکرو های CH32V2XX , CH32V3XX یک‌واحدی جایگزین‌کردن به نام PFIC

که برخی ویژگی هاش فرق دارن که در شکل زیر میتونید ببینید:

انواع واحد وقفه CH32F2XX

انواع واحد وقفه CH32F2XX

ولی خب نگران یک واحد جدید و ناشناخته نباشید و داخل توابع خودشون تبدیلش کردن به توابع استاندارد NVIC .

توابع استاندارد NVIC

شما هیچ تابع آماده که بر پایه PFIC باشه پیدا نمی‌کنید، اگر حتماً اسرار به استفاده از آنها رو دارید باید با رجیستر مستقیم به واحد PFIC دستور بدید و رجیستری باهاش کار کنید.

دستور دادن به واحد PFIC

توابع مدیریت وقفه در میکروکنترلر CH32

خب بریم سراغ خود توابع،

تابع NVIC_SystemReset() هست که مشخصه برای ریست‌کردن میکرو ازش استفاده می‌کنید، پس از ران شدن این خط از برنامه میکرو به خونه صفر برمیگرده و میکرو از اول برنامه شروع به کار میکنه.

توابع ENABLE و Disable رو داریم که وقفه رو فعال یا غیرفعال میکنن.

توابعی که اول آنها GET دارند نشان‌دهنده وضعیت رجیسترهای داخلی واحد وقفه هستند برای مثال NVIC_GetActive()

وضعیت فعال‌بودن یا نبودن وقفه رو بهتون نشون میده، اگه یک برگرداند؛ یعنی وقفه فعال هست و اگه صفر برگرداند؛ یعنی وقفه غیرفعال هست.

تابع NVIC_Init رو درصورتی‌که می‌خواهید از پارامترهای داخل استراکت اش استفاده کنید، ازش استفاده کنید وگرنه بدون این تابع هم وقفه میتونه راه‌اندازی بشه توسط  NVIC_EnableIRQ ()، حالا این پارامترهای داخل استراکت چی هستن؟

تابع NVIC_Init

این موارد عکس بالا هستن که تقریباً همش رو میشه با توابع دیگه هم تنظیم کرد. داخل نمونه کد بیشتر متوجه میشید.

اولویت بندی وقفه ها

با استفاده از توابع NVIC_SetPriority()  میتونید به وقفه‌ها اولویت بدید که در صورت روی‌دادن دو وقفه هم‌زمان کدام‌یک باید اول اجرا بشه و کدوم یک باید در صف انتظار باقی بمونه.

این تابع NVIC_PriorityGroupConfig() برای گروه‌بندی اولویت‌ها استفاده می‌شود که در عکس زیر توضیحاتش هست.

تابع NVIC_PriorityGroupConfig()

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

این کد یک وقفه روی GPIO ورودی هست، برای شروع یک GPIO رو ورودی می‌کنیم برای وقفه و یکی رو خروجی می‌کنیم تا بتونیم خروجی وقفه رو با یک LED نمایش بدیم، به این صورت: (فعال‌کردن کلاک GPIO مدنظر فراموش نشه).

وقفه روی GPIO ورودی

در مرحله بعدی باید تنظیمات وقفه GPIO یا همون واحد EXTI رو انجام بدیم که به‌صورت زیر هست:

تنظیمات وقفه GPIO یا همون واحد EXTI

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

کد EXTI_Trigger

از EXTI_Line برای انتخاب اینکه توسط کدوم لاین وقفه روی بده استفاده میشه، در اینجا میتونید استفاده از هر لاین رو ببینید:

EXTI_Lineدر مقدار Mode میتونید اینکه این رویداد یک وقفه باشه یا یک Event رو هم مشخص کنید که ما وقفه رو انتخاب می‌کنیم.

در مقدار CMD هم فعال‌بودن یا نبودن واحد EXTI رو مشخص می‌کنیم. سپس مقادیر را به تابع EXTI_Init پاس میدیم.

پس از این واحد نوبت خود واحد NVIC هست که به‌صورت زیر تنظیمش می‌کنیم برای بالاترین اولویت برای EXTI_0:

تابع EXTI_Init

تعریف و پیاده‌سازی روتین وقفه در میکروکنترلر CH32 با استفاده از EXTI

خب بعدازاین کار دیگه تنظیمات اصلی ما تموم شده و فقط میمونه خود روتین وقفه که راه‌های زیادی داره که یکی از راه هاش اینکه بیایم و اسم تابع رو از فایل Startup  برداریم و ازش استفاده کنیم به این صورت:

من خود اسم تابع رو کپی می‌کنم و میارم داخل main اصلی برنامه و یک void اولش میزارم به این صورت:

مدیریت وقفه ها با NVIC و EXTI - قسمت دهم آموزش CH32

این تابع وقفه ما هست فقط دوتا نکته داره، اولین نکته که باید پرچم وقفه صفر بشه که پس از یک با اتفاق‌افتادن وقفه گیر نکنه و همیشه ادامه پیدا کنه که تابع EXTI_ClearFlag این کارو اینجا برای ما انجام میده، نکته دوم هم این است که باید تابع رو بالاتر در داخلmain تعریف کنید با ویژگی وقفه که خط زیر برای ما انجامش میده:

خب این کل کد ما برای وقفه بود، ازاین‌پس برای هر لبه پایین‌رونده روی پایه A0 پایه A1 تغییر وضعیت میده.

کد کامل مثال بالا:

نمونه کد وقفه با تایمر در میکروکنترلر CH32: استفاده از وقفه سرریز

در ادامه یک کد نمونه وقفه با تایمر رو هم ببینید، زیرا ما هم واحد وقفه رو توضیح دادیم هم واحد تایمر رو.

از تایمر میشه وقفه‌های زیادی گرفت در اینجا وقفه سرریز مثال زده شده:

تا قسمت بعدی شما را به خدا می‌سپارم.

اطلاعات
0
0
لینک و اشتراک
profile

عرفان رفیعی

متخصص الکترونیک

erixson.elc@gmail.com

مقالات بیشتر
slide

پالت | بازار خرید و فروش قطعات الکترونیک

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

آیسی | موتور جستجوی قطعات الکترونیک

سامانه آی سی سیسوگ (Isee) قابلیتی جدید و کاربردی از سیسوگ است. در این سامانه سعی شده است که جستجو، انتخاب و خرید مناسب تر قطعات برای کاربران تسهیل شود. وقتی شما در این سامانه، قطعه الکترونیکی را جستجو می‌کنید؛ آی سی به سرعت نتایج جستجوی شما در اکثر فروشگاه‌های آنلاین در حوزه قطعات الکترونیک را نمایش می‌دهد. جستجو در آیسی
family

فروشگاه سیسوگ

فروشگاه سیسوگ مجموعه ای متمرکز بر تکنولوژی های مبتنی بر IOT و ماژول های M2M نظیر GSM، GPS، LTE، NB-IOT، WiFi، BT و ... جایی که با تعامل فنی و سازنده، بهترین راهکارها انتخاب می شوند. برو به فروشگاه سیسوگ
family

سیسوگ فروم | محلی برای پاسخ پرسش‌های شما

دغدغه همیشگی فعالان تخصصی هر حوزه وجود بستری برای گفتگو و پرسش و پاسخ است. سیسوگ فروم یک انجمن آنلاین است که بصورت تخصصی امکان بحث، گفتگو و پرسش و پاسخ در حوزه الکترونیک را فراهم می‌کند. پرسش در سیسوگ فرم
become a writer

نویسنده شو !

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

ارسال مقاله
become a writer

نویسنده شو !

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

ارسال مقاله
خانواده سیسوگ

پالت | بازار خرید و فروش قطعات الکترونیک

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

آیسی | موتور جستجوی قطعات الکترونیک

سامانه آی سی سیسوگ (Isee) قابلیتی جدید و کاربردی از سیسوگ است. در این سامانه سعی شده است که جستجو، انتخاب و خرید مناسب تر قطعات برای کاربران تسهیل شود. وقتی شما در این سامانه، قطعه الکترونیکی را جستجو می‌کنید؛ آی سی به سرعت نتایج جستجوی شما در اکثر فروشگاه‌های آنلاین در حوزه قطعات الکترونیک را نمایش می‌دهد.
family

فروشگاه سیسوگ

فروشگاه سیسوگ مجموعه ای متمرکز بر تکنولوژی های مبتنی بر IOT و ماژول های M2M نظیر GSM، GPS، LTE، NB-IOT، WiFi، BT و ... جایی که با تعامل فنی و سازنده، بهترین راهکارها انتخاب می شوند.
family

سیسوگ فروم | محلی برای پاسخ پرسش‌های شما

دغدغه همیشگی فعالان تخصصی هر حوزه وجود بستری برای گفتگو و پرسش و پاسخ است. سیسوگ فروم یک انجمن آنلاین است که بصورت تخصصی امکان بحث، گفتگو و پرسش و پاسخ در حوزه الکترونیک را فراهم می‌کند.
family

دیدگاه ها

become a writer

نویسنده شو !

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

ارسال مقاله
become a writer

نویسنده شو !

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

ارسال مقاله