- סוגי הפרעות ו- ISR
- תחביר להפרעה ב- STM32
- רכיבים נדרשים
- תרשים מעגלים וחיבורים
- תכנות STM32F103C8 להפרעות
Interrupts הוא מנגנון שבאמצעותו קלט / פלט או הוראה יכולים להשעות את הביצוע הרגיל של המעבד ולקבל את עצמו כאילו יש לו עדיפות גבוהה ביותר. כמו למשל, מעבד שעושה ביצוע רגיל יכול גם לעקוב ברציפות אחר אירוע כלשהו או הפרעה. זה כאשר קורה הפרעה חיצונית (כמו מחיישן כלשהו) ואז המעבד מושהה את הביצוע הרגיל שלו ומגיש תחילה את ההפרעה ואז ממשיך את הביצוע הרגיל שלו.
כאן בפרויקט זה, להבנת ההפרעות ב- STM32F103C8, נשתמש בכפתור הלחיצה כהפרעה חיצונית. כאן אנו מגדילים מספר מ- 0 ונציג אותו על גבי LCD בגודל 16x2, ובכל פעם שלוחצים על כפתור הלחצן הדלק נדלק ותצוגת LCD מציגה את INTERRUPT. נורית LED נכבת ברגע שחרור הכפתור.
סוגי הפרעות ו- ISR
ניתן לסווג את ההפרעות לשני סוגים:
הפרעות חומרה: אם האות למעבד הוא ממכשיר חיצוני כלשהו, כמו לחצן או חיישן או ממכשיר חומרה אחר שמייצר אות ואומר למעבד לבצע משימה מסוימת הקיימת ב- ISR, המכונה הפרעות חומרה.
הפרעות תוכנה: ההפרעות שנוצרות על ידי הוראות התוכנה.
שגרת שירות להפריע
שגרת שירות להפסיק או מטפל בהפסקה הוא אירוע שיש בו קבוצה קטנה של הוראות וכאשר מתרחשת הפרעה המעבד מבצע לראשונה את הקוד הזה שקיים ב- ISR ואז ממשיך במשימה שהוא ביצע לפני ההפרעה.
תחביר להפרעה ב- STM32
ל- ISR יש תחביר הבא attachInterrupt (digitalPinToInterrupt (pin), ISR, mode) בארדואינו ואותו ניתן להשתמש גם ב- STM32 כאשר אנו משתמשים ב- arduino IDE להעלאת קוד.
- digitalPinToInterrupt (pin): כמו בלוח Arduino Uno יש לנו סיכות 2,3 ובמגה יש לנו 2,3,18,19,20,21 להפרעות. ב- STM32F103C8 יש לנו גם סיכות הפסקה כל סיכות GPIO יכולות לשמש להפסקות. עלינו רק לציין את סיכת הקלט בה אנו משתמשים להפסקה. אך בעת שימוש ביותר מפריעה אחת בו זמנית, ייתכן שנצטרך לעקוב אחר כמה מגבלות.
- ISR: זו פונקציית מטפלת הנקראת שנקראת כאשר מתרחשת הפרעה חיצונית. אין לו ויכוחים וסוג החזרה בטל.
- מצב: סוג המעבר להפעלת ההפרעה
- עולה: כדי להפריע כאשר הסיכה עוברת מ- LOW ל- HIGH.
- נפילה: כדי להפריע כאשר הסיכה עוברת מ- HIGH ל- LOW.
- שינוי: כדי להפריע כאשר הסיכה עוברת מ- LOW ל- HIGH או HIGH ל- LOW (כלומר כאשר הסיכה מתחלפת).
חלק מהתנאים תוך כדי שימוש בהפסקה
- הפסקת פונקציית שגרת השירות (ISR) חייבת להיות קצרה ככל האפשר.
- פונקציית Delay () אינה פועלת בתוך ISR ויש להימנע ממנה.
רכיבים נדרשים
- STM32F103C8
- לחץ על הכפתור
- לד
- נגד (10K)
- LCD (16x2)
תרשים מעגלים וחיבורים
צד אחד של סיכת כפתור הלחיצה מחובר ל -3.3 וולט של STM32 והצד השני מחובר לסיכת כניסה (PA0) של STM32 באמצעות נגד נפתח.
נעשה שימוש בנגד Pull Down, כך שמיקרו-בקר יקבל HIGH או LOW רק בקלט שלו כשלוחצים על הכפתור או משחררים אותו. אחרת, ללא הנגד הנפתח, MCU עלול לבלבל ולהזין כמה ערכים צפים אקראיים לקלט.
חיבור בין STM32F103C8 ו- LCD
הטבלה הבאה מציגה את חיבור הסיכה בין LCD (16X2) למיקרו-בקר STM32F103C8.
STM32F103C8 |
LCD |
GND |
VSS |
+ 5 וולט |
VDD |
ל- PIN של מרכז הפוטנציומטר |
V0 |
PB0 |
RS |
GND |
RW |
PB1 |
ה |
PB10 |
D4 |
PB11 |
D5 |
PC13 |
D6 |
PC14 |
D7 |
+ 5 וולט |
א |
GND |
ק |
תכנות STM32F103C8 להפרעות
התוכנית להדרכה זו פשוטה וניתנת בסוף הדרכה זו. אנחנו לא צריכים מתכנת FTDI כדי לתכנת STM32, פשוט חבר את המחשב שלך ליציאת USB של STM32 והתחל לתכנת עם Arduino IDE. למידע נוסף על תכנות STM32 דרך יציאת USB.
כפי שאמרנו שכאן במדריך זה אנו הולכים להגדיל מספר מ- 0 ולהציג אותו על גבי LCD בגודל 16x2 ובכל פעם שלוחצים על כפתור הדלקה נורית מופעלת ותצוגת LCD מציגה 'INTERRUPT'.
ראשית הגדירו חיבורי סיכות LCD עם STM32. אתה יכול לשנות את זה בהתאם לדרישות שלך.
const int rs = PB10, en = PB11, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14;
לאחר מכן אנו כוללים את קובץ הכותרת לתצוגת LCD. זה קורא לספרייה המכילה את הקוד לאופן שבו ה- STM32 צריך לתקשר עם ה- LCD. ודא גם שהפונקציה LiquidCrystal נקראת עם שמות הסיכות שהגדרנו לעיל.
לִכלוֹל
משתמשים במשתנים גלובליים להעברת נתונים בין ISR לתוכנית הראשית. אנו מכריזים על המשתנה ledOn כהפכפך וגם כבוליאני לציון נכון או לא נכון.
ledOn בוליאני נדיף = שקר;
בתוך פונקציית התקנת הריק () , נציג הודעת מבוא ונקה אותה לאחר 2 שניות.
lcd.begin (16,2); lcd.print ("מעגל מעגל"); עיכוב (2000); lcd.clear ();
שוב באותה פונקציית ריק () ריק , עלינו לציין את סיכות הקלט והפלט. הגדרנו סיכה PA1 לפלט ל- LED ו- PA0 לקלט מהלחצן.
pinMode (PA1, OUTPUT) pinMode (PA0, INPUT)
אנו הולכים להגדיל מספר, אז הכריז על משתנה עם ערך אפס.
int i = 0;
כעת החלק החשוב בקוד הוא פונקציית attachInterrupt () , הוא כלול גם בתוך הגדרת הריק ()
attachInterrupt (digitalPinToInterrupt (PA0), לחצן לחוץ, CHANGE)
ציינו את הסיכה PA0 להפסקה חיצונית, ולחצן לחוץ הוא הפונקציה שיש לקרוא לה כאשר יש סיכה (LOW to HIGH או HIGH to LOW) בסיכה PA0. אתה יכול גם להשתמש בכל שם פונקציה, סיכה ומצב אחר בהתאם לדרישה.
בתוך לולאת הריק () אנו מגדילים מספר (i) מאפס ומדפיסים את המספר ב- LCD (16x2).
lcd.clear (); lcd.print ("NUMBER:"); lcd.print (i); ++ i; עיכוב (1000);
החלק החשוב ביותר הוא יצירת פונקציית מטפלים לפי השם בו השתמשנו בפונקציה attachInterrupt () . השתמשנו בכפתור לחץ אז הנה יצרנו לחצן ריק לחצן פונקציה לחצה ()
לחצן בטל לחץ () { if (ledOn) { ledOn = false; digitalWrite (PA1, LOW); } אחר { ledOn = נכון; digitalWrite (PA1, HIGH); lcd.setCursor (0,1); lcd.print ("להפריע"); } }
עבודה של לחצן זה לחצה () ISR:
על פי הערך של המשתנה ledOn , ה- LED נדלק ונכבה .
מצב כפתור |
ledOn (ערך) |
LED (אדום) |
LCD (16x2) |
לא מודחק |
שֶׁקֶר |
כבוי |
- |
לחוץ |
נָכוֹן |
עַל |
מופעים '' הפסקה '' |
אם ערך ledOn אינו נכון, נורית LED נשארת כבויה ואם ערך ledOn הוא נכון אז נורית LED נדלקת ותצוגת LCD מציגה 'הפרעה' עליה.
הערה: יכול להיות שיש אפקט של הפסקת מתג לפעמים וזה יכול לספור טריגר מרובה כאשר לוחצים על כפתור, זאת מכיוון שמספר קוצים במתח עקב סיבה מכנית של החלפת כפתור. ניתן להפחית את זה על ידי הצגת מסנן RC.
העבודה המלאה של הפרעות STM32F103C8 מוצגת בסרטון הבא.