- הכנת החומרה
- הבנת PinIO Pinouts ב- STM8S103F
- תיאור Pinout וטיפים לבחירת GPIO STM8S103F
- תכנות STM8S עבור קלט ופלט GPIO באמצעות SPL
- העלאה ובדיקה של התוכנית
עבור בקרי מיקרו, תוכנית מהבהבת לד שווה ערך לתוכנית "שלום עולם". במדריך הקודם למדנו כיצד להתחיל לעבוד עם לוח הפיתוח STM8S103F3 וכיצד להגדיר את ה- IDE והמהדר לתכנות את בקרי ה- STM8S שלנו. למדנו גם כיצד להשתמש בספריות ההיקפיות הרגילות, וכיצד לקמפל ולהעלות את הקוד למיקרו-בקר שלנו. עם כל היסודות מכוסים, מאפשר להתחיל לכתוב קוד. במדריך זה נלמד כיצד לבצע פונקציות GPIO כלליות בבקרי STM8S. בלוח יש כבר נורית LED מחוברת לסיכה 5 של יציאה B, נלמד כיצד להבהב את ה- LED הזה וגם להוסיף נורית חיצונית ולשלוט בה באמצעות לחצן כפתור. אם אתה חדש לגמרי, מומלץ לקרוא את ההדרכה הקודמת לפני שתמשיך הלאה.
הכנת החומרה
לפני שנצלול לתוכנית, בואו להכין את חיבורי החומרה. כפי שהוזכר מוקדם, נשתמש כאן בשני נוריות, האחת היא נורית LED שתמצמץ באופן רציף והשנייה היא נורית חיצונית שתופעל באמצעות כפתור לחיצה. הרעיון הוא ללמוד את כל הפונקציונליות של GPIO במערך פשוט. ה- Led על הלוח כבר מחובר ל- PB5 (pin5 של PORTB), אז בדיוק חיברתי נורית ל- PA3 ולחצן כפתור ל- PA2, כפי שניתן לראות בתרשים למטה.
אבל, מכל סיכות הפלט הזמינות בשליטתנו מדוע בחרתי PA3 לפלט ו- PA2 לקלט? השאלות תקפות ואני אסביר זאת בהמשך מאמר זה. הגדרת החומרה שלי להדרכה זו מוצגת להלן. כפי שאתה יכול לראות, חיברתי גם את מתכנת ה- ST-link שלי לסיכות תכנות אשר לא רק יתכנתו את הלוח שלנו אלא גם ישמש כמקור חשמל.
הבנת PinIO Pinouts ב- STM8S103F
עכשיו נחזור לשאלה, מדוע PA2 לקלט ומדוע PA3 לפלט? כדי להבין זאת, בואו נסתכל מקרוב על פינאוט של המיקרו-בקר שמוצג להלן.
לפי דיאגרמת ה- pinout, יש לנו ארבע יציאות במיקרו-בקר שלנו, כלומר PORT A, B, C ו- D המסומנות על ידי PA, PB, PC ו- PD בהתאמה. כל סיכה של GPIO משובצת גם עם פונקציונליות מיוחדת אחרת. לדוגמא, ה- PB5 (סיכה 5 של פורט B) לא יכול לעבוד רק כסיכת GPIO אלא גם כסיכת SDA לתקשורת I2C וכסיכת פלט של טיימר 1. לכן, אם אנו משתמשים בסיכה זו למטרות GPIO פשוטות כמו חיבור נורית, אז לא נוכל להשתמש ב- I2C ובנורית LED בו זמנית. למרבה הצער, ה- LED על הלוח מחובר לסיכה זו, כך שאין לנו הרבה ברירה כאן, ובתכנית זו, אנחנו לא הולכים להשתמש ב- I2C, אז זו לא בעיה גדולה.
תיאור Pinout וטיפים לבחירת GPIO STM8S103F
באמת, זה לא יזיק להשתמש ב- PA1 סיכת קלט וזה פשוט יעבוד. אבל בכוונה הבאתי זאת כדי לספק לי הזדמנות להראות לך כמה מלכודות נפוצות שאתה עלול להיכנס אליהן בעת בחירת סיכות GPIO במיקרו-בקר חדש. הטוב ביותר להימנע ממלכודות הוא לקרוא את פרטי הסיכה ותיאור הסיכה המופיעים בגיליון הנתונים STM8S103F3P6. לקבלת תיאור הסיכה של מיקרו בקר STM8S103F3P6 המוזכרים בגליון הנתונים מוצגים להלן תמונות.
סיכות הקלט במיקרו-בקר שלנו יכולות להיות צפות או משיכות חלשות וסיכות הפלט יכולות להיות Open Drain או Push-pull. ההבדל בין סיכות פתיחת ניקוז לפתיחת Push-Pull כבר נדון, ומכאן שלא ניכנס לפרטים על כך. במילים פשוטות, סיכת פלט Open Drain יכולה להפוך את הפלט לנמוך לא גבוה, ואילו פין פלט לדחוף למשוך יכול להפוך את הפלט לגבוהים כמו גם לגבוהים.
מלבד זאת מהטבלה לעיל, אתה יכול גם להבחין שסיכת פלט יכולה להיות פלט מהיר (10 Mhz) או פלט איטי (2 MHz). זה קובע את מהירות GPIO, אם ברצונך להחליף את סיכות ה- GPIO שלך בין גבוה לנמוך מהר מאוד, נוכל לבחור בפלט מהיר.
כמה סיכות GPIO בבקר שלנו תומכות ב- True Open Drain (T) ו- Current Sink Current (HS) כפי שצוין בתמונה לעיל. הבדל ניכר בין Open Drain ל- True Open Drain הוא שלא ניתן למשוך את היציאה המחוברת לניקוז פתוח יותר ממתח ההפעלה של המיקרו-בקר (Vdd) ואילו ניתן למשוך סיכת פלט אמיתית עם ניקוז פתוח יותר מ- Vdd. פירושים עם יכולת כיור גבוהה פירושו שהוא יכול לשקוע יותר זרם. מקור הזרם והכיור של כל סיכת GPIO HS הוא 20mA, ואילו קו החשמל יכול לצרוך עד 100 מיליאמפר.
אם נסתכל מקרוב על התמונה שלעיל, תבחין שכמעט כל הפינים של GPIO הם סוג זרם גבוה (HS), למעט PB4 ו- PB5 שהם סוג פתוח ניקוז אמיתי (T). המשמעות היא שלא ניתן לייצר את הפינים האלה גבוהים, הם לא יוכלו לספק 3.3 וולט גם כשהסיכה עשויה גבוהה. זו הסיבה שהמוביל המשולב מחובר ל -3.3 וולט ומקורקע באמצעות PB5 במקום להפעיל אותו ישירות מהסיכה של GPIO.
עיין בעמוד 28 בגליון הנתונים לתיאור הסיכה המפורט. כאמור בתמונה לעיל, PA1 מוגדר אוטומטית כמשיכה חלשה ולא מומלץ להשתמש בו כסיכת פלט. בכל מקרה זה יכול לשמש כסיכת קלט יחד עם כפתור לחיצה, אך החלטתי להשתמש ב- PA2 רק כדי לנסות לאפשר את ההעלאה מהתוכנית. אלה רק כמה דברים בסיסיים אשר יהיו שימושיים כשאנחנו כותבים תוכניות מסובכות הרבה יותר. לעת עתה, זה בסדר אם דברים רבים יקפצו מעל ראשך, ניכנס לרובד זה בהדרכות אחרות.
תכנות STM8S עבור קלט ופלט GPIO באמצעות SPL
צור סביבת עבודה ופרויקט חדש כפי שדנו בהדרכה הראשונה שלנו. באפשרותך להוסיף את כל קבצי הכותרת והמקור או להוסיף רק את קבצי gpio, config ו- stm8s. פתח את הקובץ main.c והתחל לכתוב את התוכנית שלך.
ודא שכללת את קבצי הכותרת כפי שמוצג בתמונה לעיל. פתח את הקובץ main.c והתחל את הקוד. את קוד main.c השלם ניתן למצוא בתחתית דף זה ותוכלו גם להוריד משם את קובץ הפרויקט. ההסבר לקוד הוא כדלקמן, ניתן גם להפנות למדריך למשתמש של SPL או לסרטון המקושר בתחתית עמוד זה אם אתה מבולבל לגבי החלק בקידוד.
ביטול אתחול מחדש של הנמל הנדרש
אנו מתחילים את התוכנית שלנו באמצעות דה-אתחול היציאות הנדרשות. כפי שדנו קודם, לכל סיכה של GPIO יהיו פונקציות רבות אחרות הקשורות אליה מלבד עבודה כמו קלט ופלט רגילים. אם סיכות אלה שימשו בעבר עבור יישומים אחרים, יש לאתחל אותה לפני שנשתמש בהן. זה לא חובה, עם זאת, זה נוהג טוב. שתי שורות הקוד הבאות משמשות לניתוח אתחול של יציאה A ונמל B. פשוט השתמש בתחביר GPIO_DeInit (GPIOx); וציין את שם הנמל במקום x.
GPIO_DeInit (GPIOA); // הכנת יציאה A לעבודה GPIO_DeInit (GPIOB); // להכין את נמל ב לעבודה
הצהרת GPIO של קלט ופלט
בשלב הבא עלינו להכריז אילו פינים ישמשו כקלט ואילו כפלט. במקרה שלנו, סיכה PA2 תשמש כקלט, אנו גם נכריז על סיכה זו עם Pull-up פנימי כך שלא נצטרך להשתמש בכזה חיצוני. התחביר הוא GPIO_Init (GPIOx, GPIO_PIN_y, GPIO_PIN_MODE_z); . כאשר x הוא שם היציאה, y הוא מספר הסיכה, ו- z הוא מצב ה- PIN PIN.
// הצהיר על PA2 כסיכה משוכה למעלה קלט GPIO_Init (GPIOA, GPIO_PIN_2, GPIO_MODE_IN_PU_IT);
בשלב הבא עלינו להכריז על הפינים PA3 ו- PB5 כפלט. שוב סוגים רבים של הצהרת פלט אפשריים אך אנו נשתמש ב- "GPIO_MODE_OUT_PP_LOW_SLOW" שמשמעותה שנכריז עליו כסיכת פלט מסוג דחיפה-משיכה במהירות איטית. וכברירת מחדל, הערך יהיה נמוך. התחביר יהיה זהה.
GPIO_Init (GPIOA, GPIO_PIN_3, GPIO_MODE_OUT_PP_LOW_SLOW); // הכריזו על PB5 כסיכה פלט למשוך דחיפה GPIO_Init (GPIOB, GPIO_PIN_5, GPIO_MODE_OUT_PP_LOW_SLOW);
תמונת המצב שלהלן ממדריך המשתמש של SPL מזכירה את כל מצבי ה- GPIO האפשריים (z).
אינסוף תוך לולאה
לאחר הצהרת הסיכה, עלינו ליצור לולאה אינסופית שבתוכה נמשיך למצמץ את ה- LED לנצח ולעקוב אחר מצב כפתור הלחיצה כדי להחליף את ה- LED. הלולאה האינסופית יכולה ליצור עם זמן (1) או עם for (;;) . הנה השתמשתי בעוד (1).
בעוד (1) {}
בדיקת הסטטוס של סיכת הקלט
עלינו לבדוק את מצב סיכת הקלט, התחביר לעשות זאת הוא GPIO_ReadInputPin (GPIOx, GPIO_PIN_y); כאשר x הוא שם היציאה ו- y הוא מספר הסיכה. אם הסיכה גבוהה נקבל '1' ואם הסיכה נמוכה נקבל '0'. פעם היינו בתוך לולאת if כדי לבדוק אם הסיכה גבוהה או נמוכה.
אם (GPIO_ReadInputPin (GPIOA, GPIO_PIN_2)) // אם לחצן נלחץ
ביצוע סיכת GPIO גבוהה או נמוכה
כדי להפוך סיכה GPIO גבוהה או נמוכה, אנו יכולים להשתמש ב- GPIO_WriteHigh (GPIOx, GPIO_PIN_y); ו- GPIO_WriteLow (GPIOx, GPIO_PIN_y); בהתאמה. כאן הפכנו את ה- LED להידלק אם לוחצים על הכפתור ולכבות אם לא לוחצים על הכפתור.
אם (GPIO_ReadInputPin (GPIOA, GPIO_PIN_2)) // אם לחצן לחצו על GPIO_WriteLow (GPIOA, GPIO_PIN_3); // נורית LED אחרת GPIO_WriteHigh (GPIOA, GPIO_PIN_3); //הוביל את
החלפת פין GPIO
כדי להחליף סיכה של GPIO, יש לנו GPIO_WriteReverse (GPIOx, GPIO_PIN_y); קריאה לפונקציה זו תשנה את מצב סיכת הפלט. אם הסיכה גבוהה, הוא ישתנה לנמוך, ואם הוא נמוך, הוא ישתנה לגבוה. אנו משתמשים בפונקציה זו כדי למצמץ את ה- LED המשולב ב- PB5.
GPIO_WriteReverse (GPIOB, GPIO_PIN_5);
פונקצית עיכוב
בניגוד לארדואינו, למהדר הקוסמי אין פונקציית השהיה מוגדרת מראש. אז עלינו ליצור אחד לבד. פונקציית העיכוב שלי מובאת להלן. הערך שעושה את העיכוב יתקבל במשתנה ms ונשתמש בשניים לולאה כדי להחזיק או לבצע תוכנית. כמו _asm ("nop") היא הוראות הרכבה אשר אינן מייצגות שום פעולה. משמעות הדבר היא שהבקר יעבור לולאה לולאת ה- for מבלי לבצע פעולה כלשהי, וכך נוצר עיכוב.
עיכוב חלל (int ms) // הגדרת פונקציה {int i = 0; int j = 0; עבור (i = 0; i <= ms; i ++) {עבור (j = 0; j <120; j ++) // Nop = Fosc / 4 _asm ("nop"); // בצע שום פעולה // קוד הרכבה}}
העלאה ובדיקה של התוכנית
כעת, כאשר התוכנית שלנו מוכנה, אנו יכולים להעלות אותה ולבדוק אותה. לאחר ההעלאה, החומרה שלי עבדה כצפוי. הנורית האדומה שעל הלוח מהבהבה במשך כל 500 אלפיות השנייה והנורית החיצונית הירוקה נדלקה בכל לחצתי על המתג.
את העבודה המלאה ניתן למצוא בסרטון המקושר למטה. לאחר שהגעת לנקודה זו, תוכל לנסות לחבר את המתג והנורית לסיכות שונות ולכתוב מחדש את הקוד כדי להבין את הרעיון. אתה יכול גם לשחק בתזמון העיכוב כדי לבדוק אם הבנת את המושגים בצורה ברורה.
אם יש לך שאלות, השאיר אותן בסעיף ההערות למטה ולשאלות טכניות אחרות, תוכל להשתמש בפורומים שלנו. תודה שעוקבת אחרי, נתראה בהדרכה הבאה.