- أنواع المقاطعات و ISR
- بناء الجملة للمقاطعة في STM32
- المكونات مطلوبة
- مخطط الدائرة والتوصيلات
- برمجة STM32F103C8 للمقاطعات
المقاطعات هي آلية يمكن بواسطتها إدخال / إخراج أو تعليمات تعليق التنفيذ العادي للمعالج والحصول على الخدمة نفسها كما لو كانت لها أولوية قصوى. على سبيل المثال ، يمكن للمعالج الذي يقوم بالتنفيذ العادي أن يراقب بشكل مستمر نوعًا من الأحداث أو حدوث مقاطعة. هذا عندما تحدث مقاطعة خارجية (مثل من بعض المستشعرات) ، يقوم المعالج بإيقاف التنفيذ الطبيعي مؤقتًا ويخدم المقاطعة أولاً ثم يواصل تنفيذه الطبيعي.
هنا في هذا المشروع ، لفهم المقاطعات في STM32F103C8 ، سنستخدم زر الضغط كمقاطعة خارجية. هنا سنزيد رقمًا من 0 ونعرضه على شاشة LCD مقاس 16 × 2 ، وكلما تم الضغط على زر الضغط ، يتم تشغيل الصمام وتعرض شاشة LCD المقاطعة. ينطفئ مؤشر LED بمجرد تحرير الزر.
أنواع المقاطعات و ISR
يمكن تصنيف المقاطعات على نطاق واسع إلى نوعين:
مقاطعة الأجهزة: إذا كانت الإشارة إلى المعالج من جهاز خارجي مثل الزر أو المستشعر أو من بعض الأجهزة الأخرى التي تولد إشارة وتطلب من المعالج القيام بمهمة معينة موجودة في ISR ، يُعرف باسم مقاطعة الأجهزة.
المقاطعات البرمجية: المقاطعات التي تم إنشاؤها بواسطة تعليمات البرنامج.
يقطع خدمة روتينية
روتين خدمة المقاطعة أو معالج المقاطعة هو حدث يحتوي على مجموعة صغيرة من الإرشادات فيه وعندما تحدث مقاطعة ، يقوم المعالج أولاً بتنفيذ هذه التعليمات البرمجية الموجودة في ISR ثم متابعة المهمة التي كان يقوم بها قبل المقاطعة.
بناء الجملة للمقاطعة في STM32
يحتوي ISR على بناء الجملة المرفق المتقطع (digitalPinToInterrupt (pin) ، ISR ، mode) في Arduino ويمكن أيضًا استخدام نفس الشيء في STM32 حيث نستخدم arduino IDE لتحميل الكود.
- digitalPinToInterrupt (pin): كما هو الحال في Arduino board Uno ، لدينا دبابيس 2،3 وفي ميجا لدينا 2،3،18،19،20،21 للمقاطعات. في STM32F103C8 ، لدينا أيضًا دبابيس للمقاطعة ، أي دبابيس GPIO يمكن استخدامها للمقاطعات. نحن فقط لتحديد دبوس الإدخال الذي نستخدمه للمقاطعة. ولكن أثناء استخدام أكثر من مقاطعة في نفس الوقت ، قد نحتاج إلى اتباع بعض القيود.
- ISR: هي وظيفة معالج مقاطعة يتم استدعاؤها عند حدوث مقاطعة خارجية. لا يحتوي على وسيطات ونوع إرجاع باطل.
- الوضع: نوع الانتقال لتشغيل المقاطعة
- الارتفاع: لتشغيل المقاطعة عندما ينتقل الدبوس من LOW إلى HIGH.
- السقوط: لتحريك المقاطعة عندما ينتقل الدبوس من HIGH إلى LOW.
- CHANGE: لتشغيل المقاطعة عندما ينتقل الدبوس إما من LOW إلى HIGH أو HIGH إلى LOW (أي عندما يتغير الدبوس).
بعض الشروط أثناء استخدام المقاطعة
- يجب أن تكون وظيفة روتين خدمة المقاطعة (ISR) قصيرة قدر الإمكان.
- لا تعمل وظيفة Delay () داخل ISR ويجب تجنبها.
المكونات مطلوبة
- STM32F103C8
- اضغط الزر
- يؤدى
- المقاوم (10 كيلو)
- LCD (16 × 2)
مخطط الدائرة والتوصيلات
يتم توصيل جانب واحد من دبوس زر الدفع بـ 3.3 فولت من STM32 والجانب الآخر متصل بدبوس الإدخال (PA0) الخاص بـ STM32 عبر المقاوم المنسدل.
يتم استخدام المقاوم المنسدل بحيث يصبح المتحكم الدقيق إما مرتفعًا أو منخفضًا عند إدخاله عند الضغط على الزر أو تحريره. خلاف ذلك ، بدون المقاوم المنسدل ، قد تتشوش MCU وتغذي بعض القيم العائمة العشوائية للمدخلات.
الاتصال بين STM32F103C8 وشاشات الكريستال السائل
يوضح الجدول التالي اتصال الدبوس بين LCD (16X2) ووحدة التحكم الدقيقة STM32F103C8.
STM32F103C8 |
شاشة LCD |
GND |
VSS |
+ 5 فولت |
VDD |
إلى مركز الجهد PIN |
V0 |
PB0 |
RS |
GND |
RW |
PB1 |
ه |
PB10 |
د 4 |
PB11 |
د 5 |
PC13 |
د 6 |
PC14 |
د 7 |
+ 5 فولت |
أ |
GND |
ك |
برمجة STM32F103C8 للمقاطعات
برنامج هذا البرنامج التعليمي بسيط ويتم تقديمه في نهاية هذا البرنامج التعليمي. لا نحتاج إلى مبرمج FTDI لبرمجة STM32 ، ما عليك سوى توصيل جهاز الكمبيوتر الخاص بك بمنفذ USB من STM32 والبدء في البرمجة باستخدام Arduino IDE. تعرف على المزيد حول برمجة STM32 من خلال منفذ USB.
كما قلنا هنا في هذا البرنامج التعليمي ، سنزيد عددًا من 0 ونعرضه على شاشة LCD مقاس 16 × 2 وكلما تم الضغط على زر ضغط ، يتم تشغيل الصمام وتعرض شاشة LCD "مقاطعة".
حدد أولاً اتصالات دبابيس LCD مع STM32. يمكنك تعديله حسب متطلباتك.
const int rs = PB10 ، en = PB11 ، d4 = PB0 ، d5 = PB1 ، d6 = PC13 ، d7 = PC14 ؛
بعد ذلك ، نقوم بتضمين ملف الرأس لشاشة LCD. هذا يستدعي المكتبة التي تحتوي على رمز لكيفية اتصال STM32 بشاشات الكريستال السائل. تأكد أيضًا من استدعاء الوظيفة LiquidCrystal بأسماء الدبوس التي حددناها للتو أعلاه.
تضمن
تُستخدم المتغيرات العامة لتمرير البيانات بين ISR والبرنامج الرئيسي. نعلن أن المتغير ledOn متقلب وأيضًا كمتغير منطقي لتحديد True أو False.
ledOn منطقي متطاير = خطأ ؛
داخل وظيفة الإعداد الفارغ () ، سنعرض رسالة مقدمة ونمسحها بعد ثانيتين.
lcd.begin (16.2) ؛ lcd.print ("CIRCUIT DIGEST") ؛ تأخير (2000) ؛ lcd.clear () ؛
مرة أخرى في نفس وظيفة الإعداد الفارغ () ، نحتاج إلى تحديد دبابيس الإدخال والإخراج. قمنا بتعيين دبوس PA1 للإخراج إلى LED و PA0 للإدخال من زر الضغط.
pinMode (PA1 ، الإخراج) pinMode (PA0 ، الإدخال)
سنقوم أيضًا بزيادة رقم ، لذلك نعلن عن متغير بقيمة صفر.
كثافة العمليات أنا = 0 ؛
الآن الجزء المهم من الكود هو وظيفة attachInterrupt () ، وهي مدرجة أيضًا داخل إعداد الفراغ ()
attachInterrupt (digitalPinToInterrupt (PA0) ، زر الضغط عليه ، تغيير)
لقد حددنا دبوس PA0 للمقاطعة الخارجية ، وضغط الزر هو الوظيفة التي يجب استدعاؤها عندما يكون هناك تغيير (منخفض إلى مرتفع أو مرتفع إلى منخفض) في دبوس PA0. يمكنك أيضًا استخدام أي اسم وظيفي آخر ورقم التعريف الشخصي والوضع وفقًا للمتطلبات.
داخل الحلقة الفارغة () نزيد الرقم (i) من الصفر ونطبع الرقم على شاشة LCD (16 × 2).
lcd.clear () ؛ lcd.print ("NUMBER:") ؛ lcd.print (ط) ؛ ++ أنا ؛ تأخير (1000) ؛
الجزء الأكثر أهمية هو إنشاء وظيفة معالج المقاطعة وفقًا للاسم الذي استخدمناه في وظيفة attachInterrupt () . استخدمنا buttonPressed لذلك أنشأنا هنا وظيفة باطلة buttonPressed ()
buttonPressed باطل () { if (ledOn) { ledOn = false؛ الكتابة الرقمية (PA1 ، منخفضة) ؛ } else { ledOn = true؛ الكتابة الرقمية (PA1 ، عالية) ؛ lcd.setCursor (0،1) ؛ lcd.print ("مقاطعة") ؛ } }
العمل على هذا الزر الضغط على () ISR:
وفقًا لقيمة متغير ledOn ، يتم تشغيل وإيقاف تشغيل LED.
زر الدولة |
ledOn (القيمة) |
LED (أحمر) |
LCD (16 × 2) |
غير مضغوط |
خاطئة |
إيقاف |
- |
تم الضغط عليه |
صحيح |
على |
عروض "المقاطعة" |
إذا كان ledOn القيمة تحولت كاذبة بقايا ثم قبالة الصمام وإذا كان ledOn القيمة True ثم LED يتحول على ويظهر على الشاشة LCD "المقاطعة" على ذلك.
ملحوظة: قد يكون هناك تأثير ارتداد التبديل في بعض الأحيان وقد يحسب الزناد المتعدد عند الضغط على زر الضغط ، وذلك بسبب عدة ارتفاعات في الجهد بسبب سبب ميكانيكي لتبديل زر الضغط. يمكن تقليل ذلك عن طريق إدخال مرشح RC.
يظهر العمل الكامل للمقاطعات في STM32F103C8 في الفيديو أدناه.