آموزش STM32آموزش های ARM

آموزش استفاده از وقفه ها در STM32 + فیلم

سلام. آموزش استفاده از وقفه ها در STM32 + فیلم را آماده کردیم.

پروژه راه اندازی وقفه در میکروکنترلر STM32

قبلا در مورد وقفه ها بسیار صحبت کردیم و همه با وقفه ها آشنایی داریم. در صورتی که میخواهید با وقفه ها آشنا شوید آموزش مقابل را ببینید: وقفه چیست ؟ آموزش کامل در میکروکنترلر AVR در این آموزش STM32 از یک دکمه برای ایجاد وقفه خارجی استفاده میکنیم در اینجا ما عدد 0 را افزایش میدهیم و آن را روی یک ال سی دی کاراکتری نمایش میدهیم. با هر بار فشار دادن دکمه جراغ ال ای دی روشن میشود و صفحه نمایش Interrupt را نشان میدهد و و به محض رها کردن دکمه ال ای دی خاموش میشود.

فیلم عملکرد وقفه در میکروکنترلر های STM32:

انواع وقفه ها و ISR

وقفه ها را می توان به طور گسترده به دو نوع طبقه بندی کرد: سخت افزاری و نرم افزاری

وقفه های سخت افزاری

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

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

وقفه های نرم افزاری

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

سرویس وقفه روتین

Interput Service Routine یا Interpreler رویدادی است که مجموعه دستورالعملهای کمی در آن وجود دارد و هنگامی که وقفه ای رخ دهد، پردازنده ابتدا کد هایی را که در ISR موجود است اجرا می کند و سپس با کاری که قبل از وقفه انجام می داد ادامه می دهد.

سینتکس های وقفه در STM32

ISR در آردوینو دارای سینتکس های زیر است و در STM32 نیز می توان از آن استفاده کرد زیرا از Arduino IDE برای بارگذاری کد استفاده می کنیم.

  • digitalPinToInterupt (pin): مانند برد های Arduino در Uno ما پین ها 2،3 و در مگا ها 2،3،18،19،20،21 برای وقفه ها داریم. در STM32F103C8 ما همچنین دارای پین های وقفه هستیم که از هر پین GPIO برای وقفه استفاده می شود. ما فقط باید پین ورودی را که برای وقفه استفاده می کنیم مشخص کنیم. اما در استفاده از بیش از یک وقفه در یک زمان ممکن است محدودیت هایی را داشته باشیم.
  • ISR: این یک تابع کنترل کار با وقفه است که هنگام وقوع وقفه خارجی فراخوانی می شود. هیچ نوع استدلال و نوع برگشتی ندارد.
  • Mode: نوع انتقال برای ایجاد وقفه
  1. RISING: هنگام حرکت پین از LOW به HIGH ، وقفه را ایجاد میکند.
  2. FALLING: هنگام حرکت پین از HIGH به LOW ، وقفه را ایجاد میکند.
  3. CHANGE: برای ایجاد وقفه هنگامی که پین از LOW به HIGH یا HIGH به LOW (به عنوان مثال ، هنگامی که پین ​​تغییر می کند) باعث ایجاد وقفه میشود.

برخی از شرط ها در استفاده از وقفه

عملکرد روتین سرویس (ISR) باید تا حد امکان کوتاه باشد. عملکرد Delay () در ISR کار نمی کند و باید از آن اجتناب کرد.

مدار پروژه وقفه در STM32

تصویر زیر شماتیک مدار این پروژه را نشان میدهد. یک طرف پین دکمه به 3.3 ولت برد STM32 متصل میشود و طرف دیگر آن از طریق مقاومت به پین ورودی PA0 از STM32 متصل میشود.

پروژه راه اندازی وقفه در میکروکنترلر STM32

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

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

اتصالات بین STM32 و LCD

جدول زیر اتصال پین بین LCD 16X2 و میکروکنترلر STM32F103C8 را نشان می دهد.

اگر در مورد این مطلب سوالی دارید در قسمت نظرات بپرسید
STM32 ال سی دی کاراکتری
GND VSS
+5V VDD
پتانسیومتر V0
PB0 RS
GND RW
PB1 E
PB10 D4
PB11 D5
PC13 D6
PC14 D7
+5V A
GND K

قطعات مورد نیاز

  1. STM32 – برد توسعه (BluePill) (STM32F103C8T6)
  2. دکمه
  3. ال ای دی
  4. مقاومت 10 کیلو اهم
  5. ال سی دی کاراکتری 16*2
قطعات مورد نیاز را از فروشگاه قطعات آیرنکس تهیه کنید.

برنامه نویسی STM32 برای وقفه

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

همانطور که گفتیم در اینجا در این آموزش قصد داریم یک عدد از 0 را افزایش دهیم و آن را در LCD 16×2 نمایش دهیم و هر زمان که دکمه فشار داده شود منجر شود ال ای دی روشن شود و صفحه نمایش INTERRUPT را نشان می دهد.

ابتدا اتصالات پین های LCD را با STM32 تعریف میکنیم. شما می توانید آن را مطابق نیاز خود اصلاح کنید.

const int rs= PB10,en= PB11,d4= PB0,d5= PB1,d6= PC13,d7= PC14;    

در مرحله بعد ، فایل هدر برای نمایشگر LCD را درج می کنیم. این کتابخانه حاوی کد نحوه ارتباط STM32 با LCD است.

include<LiquidCrystal.h>                                         
LiquidCrystal lcd (rs,en,d4,d5,d6,d7);     

از متغیرها برای انتقال داده ها بین ISR و برنامه اصلی استفاده می شود. ما متغیر ledOn را به عنوان متغیر و همچنین Boolean را وارد می کنیم تا True یا False را مشخص کند.

volatile boolean ledOn = false;

در داخل تابع void setup () ، یک پیام مقدمه را نمایش خواهیم داد و بعد از 2 ثانیه آن را پاک می کنیم.

lcd.begin(16,2);                                                
lcd.print("IRENX.IR");                                   
delay(2000);                                                   
lcd.clear(); 

مجدداً در همان عملکرد (void setup) ، باید پین های ورودی و خروجی را مشخص کنیم. پین PA1 را برای خروجی به LED و PA0 برای ورودی از دکمه تنظیم می کنیم.

pinMode(PA1,OUTPUT)
pinMode(PA0,INPUT)

ما همچنین می خواهیم یک عدد را اضافه کنیم ، بنابراین یک متغیر را با مقدار صفر تعریف میکنیم.

int i = 0;

اکنون بخش مهمی از کد تابع attachInterrupt () است.

attachInterrupt(digitalPinToInterrupt(PA0),buttonPressed,CHANGE)

ما پین PA0 را برای وقفه خارجی مشخص کردیم و هنگامی که یک تغییر (CHANGE) در این پین وجود داشته باشد مثل (Low به High یا High به Low) فعال میشود

در داخل loop void () یک عدد (i) را از صفر افزایش می دهیم و شماره آن را در LCD چاپ می کنیم.

lcd.clear();                                                    
lcd.print("NUMBER:");                                           
lcd.print(i);                  
++i;                                                           
delay(1000);   

مهمترین قسمت ایجاد یک عملکرد کنترل کننده وقفه با توجه به نامی است که ما در عملکرد attachInterrupt() استفاده می کنیم. ما از buttonPress استفاده کردیم ، بنابراین در اینجا ما یک تابع void buttonPressed() میسازیم.

void buttonPressed()                                              
{                   
  if(ledOn)                                                       
  {
     ledOn=false;                                                
     digitalWrite(PA1,LOW);                                       
  }
  else
  {
     ledOn = true;                                                
     digitalWrite(PA1,HIGH);                                     
     lcd.setCursor(0,1);                                          
     lcd.print("Interrupt");                                      
  }
}

کار کردن buttonPressed() تحت ISR :

با توجه به مقدار متغیر ledOn ، ال ای دی روشن و خاموش می شود.

وضعیت دکمه مقدار ledOn وضعیت ال ای دی پیام ال سی دی کاراکتری
رها False خاموش
فشرده True روشن نمایش INTERRUPT

اگر مقدار ledOn در حالت False باشد ، LED خاموش می ماند و اگر مقدار ledOn در حالت True باشد ، LED روشن می شود و صفحه نمایش LCD “INTERRUPT” را نشان می دهد.

کد کامل

کد کامل راه اندازی وقفه برای میکروکنترلر STM32 با کامپایلر آردوینو در باکس زیر آورده شده است.

const int rs= PB10,en= PB11,d4= PB0,d5= PB1,d6= PC13,d7= PC14;
#include<LiquidCrystal.h>                                
LiquidCrystal lcd (rs,en,d4,d5,d6,d7);            
volatile boolean ledOn = false;  
               
void setup()                                                      
{
  lcd.begin(16,2);                
  lcd.print("CIRCUIT DIGEST");            
  delay(2000);                      
  lcd.clear();                             
  pinMode(PA1,OUTPUT);                  
  pinMode(PA0,INPUT);                   
  int i = 0;                                 
  attachInterrupt(PA0,buttonPressed,CHANGE);  
}

void loop()                 
{  
  lcd.clear();                                  
  lcd.print("NUMBER:");               
  lcd.print(i);     
  ++i;                  
  delay(1000);        
 }

void buttonPressed()   
{                    
  if(ledOn)  
  {
     ledOn=false; 
     digitalWrite(PA1,LOW);
  }
  else
  {
     ledOn = true;  
     digitalWrite(PA1,HIGH);
     lcd.setCursor(0,1);  
     lcd.print("Interrupt"); 
  }
}
4.6 (9 نفر)

برای دریافت مطالب جدید کانال تلگرام یا پیج اینستاگرام ما را دنبال کنید.

محمد رحیمی

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

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

سوالات فنی را در انجمن سایت مطرح کنید تا در مسابقه شرکت کنید. ورود به انجمن

2 نظر

  1. با سلام
    دقیقا همین مطلب رو من تو یکی از سایت های خارجی دیدم. درواقع فقط ترجمه شده بود. و خب کار درستی بنظر نمیاد :)
    و مورد بعدی هم اینکه چرا کد توی IDE اردوینو نوشته شده؟

    1. سلام عزیز. ترجمه مطالب کار بسیار معمولی هست و در اکثر سایت ها انجام میشه. برد های STM32 رو میشه با استفاده از Arduino IDE هم برنامه ریزی کرد.

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

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