برد STM سخت افزار

آموزش میکروکنترلرهای STM32 بخش دوم آشنایی با وقفه خارجی EXTI

نوشته شده توسط علی زاهدی

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

 


آشنایی با وقفه


وقفه یا Interrupt فرایندی است که باعث می‌شود تا CPU از وقوع یک رخداد مطلع شود. وقفه یک امکان سخت افزاری است. با فعال کردن وقفه بدون این که نیاز باشد CPU شرطی را بررسی کند. از رویدادی مطلع می‌شود. این رویداد ممکن است تغیر سطح ولتاژ یک پایه، سرریز تایمر، دریافت کاراکتری از USART و … باشد. زمانی که وقفه رخ می‌دهد. برنامه در هر قسمتی که هست، متوقف شده و قسمت روتین وقفه اجرا می‌شود. سپس برنامه از قسمتی که متوقف شده است. ادامه می‌دهد. این عمل باعث قابلیت Real Time بودن در برنامه می‌شود.

 


منابع تحریک وقفه


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

وقفه داخلی

منبع تحریک داخلی وقفه همان طور که از نامش پیداست، از المان های داخلی میکروکنترلر است. تقریبا تمامی پریفرال (Peripheral ) های میکروکنترلر Stm32 دارای وقفه هستند. و منبع تحریک این نوع وقفه همین پریفرال ها هستند. از جمله پریفرال هایی که دارای وقفه هستند میتوان به تایمر/کانتر، USART، SPI، ADC اشاره نمود.

وقفه خارجی EXTI

منابع تحریک خارجی وقفه بر روی GPIOها فعال می‌شود. این نوع منبع تحریک وقفه که انحصارا آن را EXTI می‌نامند، به صورتی است که با تغیر سطح ولتاژ یک GPIO مشخص وقفه فعال شده و برنامه وارد روتین وقفه می‌شود. راه اندازی این نوع وقفه موضوع اصلی این آموزش است.

در میکروکنترلرهای Stm32 بر خلاف میکروکنترلرهای AVR قابلیت فعال کردن وقفه خارجی بر روی تمامی GPIO ها وجود دارد. تنها نکته ای که بایستی به ان توجه شود، این است که زمانی که وقفه خارجی بر روی یکی از پایه های یک پورت فعال می‌شود. دیگر امکان فعال کردن وقفه بر روی همان شماره پایه بر روی پورت های دیگر نیست. برای مثال زمانی که وقفه خارجی بر روی پین PC15 فعال می‌شود. درگر نمیتوان بر روی پایه PA15 ، PB15 و … وقفه خارجی را فعال نمایید. برای درک بهتر این مطلب به تصویر زیر توجه نمایید.

 


روتین وفقه


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

 


پیکر بندی وقفه خارجی EXTI


در صورتی که آشنایی کافی با میکروکنترلر های ARM را ندارید و یا نحوه ساخت پروژه جدید در نرم افزار STM32CubeMX را نمی‌دانید. به ترتیب آموزش های معرفی انواع میکروکنترلرهای STM32 و آموزش میکروکنترلرهای STM32 بخش اول شناخت GPIO راه اندازی نرم افزاری که قسمت های قبلی این آموزش هستند را مطالعه فرمایید.

تنظیمات GPIO

پس از انتخاب میکروکنترلر مورد نظر در نرم افزار STM32CubeMX ابتدا مطابق آموزش قبل قسمت های SYS و RCC را تنظیم نمایید و پس از آن در صفحه Pinout & Configuration بر روی GPIO مورد نظر خود کلیک کنید. سپس بر روی گزینه GPIO_EXTI کلیک کنید. تا به این قسمت GPIO بعنوان وقفه خارجی تنظیم شده است.در ادامه بایستی در نوار سمت چپ گزینه A->Z را انتخاب کنید. در قسمت GPIO بر روی پین هایی که بعنوان EXTI تعریف شده کلیک کنید در قسمت Configuration می‌توانید با استفاده از گزینه GPIO mode حساسیت وقفه خارجی را بصورت حساس به لبه ها و یا سطح مورد نظر خود تنظیم نمایید. همچنین با استفاده از گزینه GPIO Pull-up/Pull-down وضعیت سطح پایه وروردی را تعیین کنید.

 

تنظیمات وقفه EXTI در STM32CubemX - دیجی اسپارک

 

تنظیمات NVIC

و سپس از قسمت NVIC تیک مربوط به این وقفه را فعال کنید. تا وقفه بصورت کامل فعال شود. وقفه خارجی در میکروکنترلر های Stm32 به این صورت است که برای پین های ۰ تا ۴ پورت ها، روتین های جداگانه ای تعریف شده است. اما برای پین های ۵ تا ۹  یک روتین و همچنین برای پین های ۱۰ تا ۱۵ نیز یک پین تعریف شده است. با توجه به تصویر زیر که قسمتی از فایل stm32f103xb.h است. این مطلب را بهتر متوجه می شوید. در ادامه با نحوه برنامه نویسی این بخش بیشتر آشنا خواهید شد.

تنظیمات NVIC وقفه‌ها در Stm32F1 - دیجی اسپارک

 

در این آموزش ما GPIO های PC14 و PC15 بعنوان وقفه خارجی حساس به لبه پایین رونده و پایه PC13 بعنوان خروجی تعریف شده است. پایه PC13 بر روی برد BluePill به یک LED متصل است. همچنین فراموش نکنید مطابق آموزش قبل در قمست GPIO برای پین PC13 لیبل LED انتخاب کنید و گزینه GPIO output level را بر روی High تنظیم نمایید. در بخش NVIC تیک گزینه EXTI line [10:15] interrupts فعال شده است.

آموزش وقفه خارجی Pinout میکروکنترلر

سپس به صفحه Clock Configuration رفته و قسمت HCLK را به ۷۲ مگا هرتز تغییر دهید. در ادامه باسیتی به صفحه Project Manager رفته و مطابق آموزش های قبلی این قسمت را نیز تنظیم نمایید. سپس پس از انجام کامل تنظیمات بر روی گزینه GENERATE CODE کلیک کنید تا پروژه ساخته شود.

 

 


کد نویسی پروژه


داخل نرم افزار KEIL ابتدا بایستی فایل stm32f1xx_it.c را باز کنید. اگر به انتهای این فایل بروید کد زیر که روتین وقفه های فعال شده است. را مشاهده می‌کنید. شما میتوانید کد مورد نظر خود را در همین قسمت بنویسید. و یا به روشی که در ادامه توضیح داده میشود. از تابع Call Back روتین وقفه استفاده کنید و این بخش را به فایل main.c انتقال دهید.

void EXTI15_10_IRQHandler(void)
{
  /* USER CODE BEGIN EXTI15_10_IRQn 0 */

  /* USER CODE END EXTI15_10_IRQn 0 */
  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_14);
  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_15);
  /* USER CODE BEGIN EXTI15_10_IRQn 1 */

  /* USER CODE END EXTI15_10_IRQn 1 */
}

برای انتقال این بخش به فایل main.c بایستی ابتد وارد این فایل شده و سپس کد زیر را که تابع Call Back روتین وقفه است را در یکی از قسمت های مجاز به نوشتن قبل از تابع main کپی کنید. سپس با تحریک هر وقفه برنامه وارد این قسمت میشود.

HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
  if(GPIO_Pin == GPIO_Pin_14)
  {
    // این قسمت روتین وقفه خارجی پین ۱۴ است.
  }
  else if(GPIO_Pin == GPIO_Pin_15)
  {
    // این قسمت روتین قفه خارجی پین ۱۵ است.
  }
}

در ادامه قصد داریم تا با استفاده از دو کلید بر روی وقفه های فعال شده. LED موجود بر روی برد Blue Pill را خاموش و روشن کنیم. برای این کار تنها نیاز است. که دستور خاموش و روشن کردن LED را به کد بالا اضافه کنیم. که در کد زیر این عمل انجم شده است.

HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) 
{ 
  if(GPIO_Pin == GPIO_Pin_14) 
  { 
    HAL_GPIO_WritePin(LED_GPIO_Port,LED_GPIO_Pin,GPIO_Pin_RESET);
  } 
  else if(GPIO_Pin == GPIO_Pin_15) 
  {  
    HAL_GPIO_WritePin(LED_GPIO_Port,LED_GPIO_Pin,GPIO_Pin_SET);
  } 
}

پس از پراگرام کد بالا بر روی میکروکنترلر و بایستی ابتدا یک بار میکروکنترلر را سیت کنید. سپس با فشردن کلید متصل به پین PC14 ال ای دی موجود بر روی برد Blue Pill روشن و با فشردن کلید متصل به پین PC15 ال ای دی خاموش خواهد شد. نحوه پروگرام کردن برنامه بر روی میکروکنترلر در قسمت قبلی آموزش توضیح داده شده است. در صورتی که با نحوه پروگرام کردن میکروکنترلر های Stm32 آشنا نیستید. لطفا بخش اول این آموزش را مطالعه نمایید.

 


اتصالات برد STM32


اتصالات وقفه خارجی EXTI میکروکنترلرهای stm32 مدار مطابق تصویر به صورت زیر است. پایه PC14 میکروکنترلر به یک سمت کلید، و سمت دیگر کلید به GND برد متصل می‌شود. کلید مربوط به پایه PC15 نیز به همین ترتیب متصل می‌شود.

اتصالات برد STM32 F103C8T6 در آموزش EXTI - دیجی اسپارک

 


لوازم مورد نیاز


 

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

 


پروژه و دریافت بن ارسال رایگان


برای دریافت بن خرید از دانشجو کیت، کاربران بایستی با استفاده از وسایل این آموزش، پروژه را اجرا کرده و یا حتی مدار جدیدی تعریف کنید. سپس از اجرای کار فیلم گرفته و در شبکه‌های اجتماعی از جمله آپارات و اینستگرام، با هشتگ‌های #دیجی_اسپارک ،  #دانشجوکیت ،  digispark#  و  daneshjookit# منتشر کنند. سپس از طریق بخش نظرات در ادامه همین آموزش، جهت دریافت بن خرید ارسال رایگان به ارزش ۱۲۰۰۰ تومان از دانشجو کیت، لینک را زیر همین پست ارسال کنید.

 

در پایان نظرات و پیشنهادات خود را با ما درمیان بگذارید و با اشتراک گذاری این آموزش در شبکه های اجتماعی , از وبسایت دیجی اسپارک حمایت کنید.

 

درباره نویسنده

علی زاهدی

برنامه نویس و طراح سیستم های مبتنی بر میکروکنترلر

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

تبادل نظر و رفع عیب با ثبت دیدگاه

۹ دیدگاه

  • خیلی عالی بود آقای زاهدی واقعا ممنونم ازتون
    یعنی به سادگی و روانی آموزش هاتون ندیدم خسته نباشید میگم خدمت تون بابت انرژی و وقتی که برای آموزش ها میذارید
    من به شخصه از شما فراوان یاد گرفتم

    • با سلام از توجه شما سپاسگزارم
      در اولین فرصت پست بررسی ADC میکروکنترلر های STM32 را منتشر می‌کنم.

  • سلام و وقت بخیر و خسته نباشید خدمت آقای زاهدی
    ببخشید در مورد نحوه کارکرد کد پون ما در نرم افزار cube پایه PC14 را به صورت falling edge تعریف کردیم وقتی کلید مربوطه را میزنیم led روی برد روشن میشود چون ظاهر کد به این صورت است که وقتی کلید PC14 را زدیم باید led خاموش شود؟

    • با سلام
      LED موجود بر روی برد Bluepill طوری متصل شده که کاتد LED به مکیروکنترلر و آند به VCC متصل است. بنابر این زمانی که دستور RESET بر روی پایه LED قرار بگیرد، LED روشن خواهد شد.

  • سلام، برای من دقیقا در خطی که تابع HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) در فایل main و قبل از int main نوشته شده، این ارور رو میده warning type specifier missing, defaults to int
    راه حل چیه؟

    • با سلام
      توجه داشته باشید که قبل از این تابع بایستی void قرار بگیرد. و هچنین NVIC مربوط به اینتراپت خارجی بایستی حتما تیک خورده باشد.