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

محتویات
- پروژه راه اندازی وقفه در میکروکنترلر STM32
- انواع وقفه ها و ISR
- وقفه های سخت افزاری
- وقفه های نرم افزاری
- سرویس وقفه روتین
- سینتکس های وقفه در STM32
- برخی از شرط ها در استفاده از وقفه
- مدار پروژه وقفه در STM32
- اتصالات بین STM32 و LCD
- قطعات مورد نیاز
- برنامه نویسی STM32 برای وقفه
- کار کردن buttonPressed() تحت ISR :
- کد کامل
سلام. آموزش استفاده از وقفه ها در 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: نوع انتقال برای ایجاد وقفه
- RISING: هنگام حرکت پین از LOW به HIGH ، وقفه را ایجاد میکند.
- FALLING: هنگام حرکت پین از HIGH به LOW ، وقفه را ایجاد میکند.
- CHANGE: برای ایجاد وقفه هنگامی که پین از LOW به HIGH یا HIGH به LOW (به عنوان مثال ، هنگامی که پین تغییر می کند) باعث ایجاد وقفه میشود.
برخی از شرط ها در استفاده از وقفه
عملکرد روتین سرویس (ISR) باید تا حد امکان کوتاه باشد. عملکرد Delay () در ISR کار نمی کند و باید از آن اجتناب کرد.
مدار پروژه وقفه در STM32
تصویر زیر شماتیک مدار این پروژه را نشان میدهد. یک طرف پین دکمه به 3.3 ولت برد STM32 متصل میشود و طرف دیگر آن از طریق مقاومت به پین ورودی PA0 از 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 |
قطعات مورد نیاز
- STM32 – برد توسعه (BluePill) (STM32F103C8T6)
- دکمه
- ال ای دی
- مقاومت 10 کیلو اهم
- ال سی دی کاراکتری 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"); } }
با توجه به مقدار متغیر 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"); } }
با سلام
دقیقا همین مطلب رو من تو یکی از سایت های خارجی دیدم. درواقع فقط ترجمه شده بود. و خب کار درستی بنظر نمیاد :)
و مورد بعدی هم اینکه چرا کد توی IDE اردوینو نوشته شده؟
سلام عزیز. ترجمه مطالب کار بسیار معمولی هست و در اکثر سایت ها انجام میشه. برد های STM32 رو میشه با استفاده از Arduino IDE هم برنامه ریزی کرد.