תוכן עניינים:

אז אתה טוען את מטען האתחול STM32duino ב"גלולה הכחולה "שלך אז מה עכשיו ?: 7 שלבים
אז אתה טוען את מטען האתחול STM32duino ב"גלולה הכחולה "שלך אז מה עכשיו ?: 7 שלבים

וִידֵאוֹ: אז אתה טוען את מטען האתחול STM32duino ב"גלולה הכחולה "שלך אז מה עכשיו ?: 7 שלבים

וִידֵאוֹ: אז אתה טוען את מטען האתחול STM32duino ב
וִידֵאוֹ: אני רוצה שווארמה 🌯 2024, יולי
Anonim
אז אתה טוען את מטען האתחול STM32duino ב- שלך
אז אתה טוען את מטען האתחול STM32duino ב- שלך
אז אתה טוען את מטען האתחול STM32duino ב- שלך
אז אתה טוען את מטען האתחול STM32duino ב- שלך

אם כבר קראת את ההוראות שלי המסבירות כיצד טעינת האתחול STM32duino או כל תיעוד דומה אחר, אתה מנסה דוגמת קוד טעינה וייתכן ששום דבר לא קורה כלל.

הבעיה היא שרבים, אם לא כל הדוגמאות ל- STM32 "גנריות" לא יעבדו מהקופסה. יהיה צורך בשינויים קלים כדי לעבוד לאחר מכן בלוח ה- STM32 "הגלולה הכחולה" שלך.

אני אבחר 4 דוגמאות קוד כדי להסביר מה צריך לשנות ולמה. הקודים הם: "BlinkWithoutDelay", "דוהה", "דימר" ו- "AnalogInSerial".

שים לב שלא קידמתי כלום. אני רק מנפיק שינויים קלים בקודים שנוצרו על ידי:

David A. Mellis ומאוחר יותר השתנה על ידי טום איגו, מרטי בוליבר וכמה מקרים על ידי סקוט פיצג'רלד

טום איגו ומאוחר שונה על ידי בריאן ניובולד

לכן, אני מעדיף לשמור את שמות המחברים אפילו בקודים שאני משנה, תוך שמירה על הקרדיט ליצירה.

שלב 1: סיכות וסיכות …. מדוע הקוד אינו פועל?

סיכות וסיכות …. מדוע הקוד אינו פועל?
סיכות וסיכות …. מדוע הקוד אינו פועל?

הבה נבחן את סיכת ה- STM32 "הגלולה הכחולה" החוצה. סיכות הערה מזוהות כ- PA1 או PC2 …. משהו כזה.

אם תסתכל למשל בדוגמת הקוד של "BlinkWithoutDelay", סיכה מוכרזת כ- "33" … למה?

אני חושד שזה בגלל שמר מרטי בוליבר העביר את הקוד הזה ללוח MAPLE.

אני חושב שזו לא הייתה כוונתו לתת לקוד להתאים ללוחות "גלולה כחולה".

סיכות הלוח המיני של מייפל ומייפל מוכרזות מספריות, כמו ארדואינו, למרות שהן משתמשות במספרים כמו 33, 24 וכמה כאלה.

אמרתי שהקוד לא עובד? טעות שלי. עריכת קוד ללא כל שגיאה והעלאה נכונה ל"כדור כחול ", כך שלדעתי היא אכן עובדת, אך באמצעות פלט GPIO איננו מצפים. אולי אפילו לא יהיה זמין.

לכן יש צורך בשינויים קטנים בקוד כדי שזה יעבוד כצפוי.

שלב 2: בואו "להגדיר" כמה סיכות …

בואו
בואו

זהו נוהג קוד טוב להכריז על משאבים כמשתנים קלים לזהות או למשמעותם או של קבועים. זה יאפשר לך לקוד קל יותר להבין ולפתור בעיות.

השתמשתי בהצהרת סיכות ארדואינו כך:

const int ledPin = 13;

…"

אם אתה אוהב אותי, אולי אתה שואל את עצמך: "איך אני יכול להכריז על סיכות עם שמות כמו PC13 ???"

התשובה היא: השתמש במשפט "#define" C.

אז, לפי ציור pinout, PC13 הוא הסיכה שיש לנו על הלוח ב- "BluePill". כדי להשתמש בו, הייתי מצהיר כך, רק לאחר הגדרת הספריות (#כולל …) ולפני כל דבר אחר:

#define LedPin PC13

…"

שים לב שאין ";" סיום קו, הקצאת NOR "=".

השווה את שני הקודים. אחת מהן היא הדוגמה המקורית שהועלתה מ- IDE. השני הוא זה שעשיתי קצת התאמה לעבודה עם "BluePill".

אני ממליץ בחום להכריז על כל הסיכות שבהן אתה מתכוון להשתמש בקוד. אפילו אלה מתכוונים להשתמש כקלט ADC (עוד על כך בהמשך).

זה יקל על חייך.

שלב 3: PinMode () … כיצד תשתמש בסיכות שלך …

לפני שתמשיך, בואו להבין את הפונקציה PinMode ().

כמו Arduino, גם לסיכות STM32 יש מספר פונקציות. הדרך הפשוטה ביותר לבחור אחת כזו היא באמצעות משפט pinMode ().

ל- Arduino יש רק 3 מצבים זמינים, INPUT, OUTPUT או INPUT_PULLUP.

STM32, לעומת זאת, יש טעמים רבים של pinMode (). הם:

OUTPUT -פלט דיגיטלי בסיסי: כאשר הסיכה גבוהה, המתח מוחזק על 3.3v (Vcc) וכשהוא נמוך, הוא נמשך כלפי מטה לקרקע

OUTPUT_OPEN_DRAIN -במצב ניקוז פתוח, הסיכה מציינת "נמוך" על ידי קבלת זרימת זרם לקרקע ו"גבוהה "על ידי מתן עכבה מוגברת

INPUT_ANALOG -זהו מצב מיוחד למתי ישמש את הסיכה לקריאות אנלוגיות (לא דיגיטליות). מאפשר לבצע המרת ADC על המתח בסיכה

INPUT_PULLUP -מצב הסיכה במצב זה מדווח באותו אופן כמו ב- INPUT, אך מתח הסיכה "מושך בעדינות" לכיוון +3.3 וולט

INPUT_PULLDOWN -מצב הסיכה במצב זה מדווח באותו אופן כמו ב- INPUT, אך מתח הסיכה "נמשך בעדינות" כלפי מטה ל 0v

INPUT_FLOATING -שם נרדף ל- INPUT

PWM -זהו מצב מיוחד למתי ישמש את הסיכה לפלט PWM (מקרה מיוחד של פלט דיגיטלי)

PWM_OPEN_DRAIN -כמו PWM, אלא שבמקום מחזורים מתחלפים של LOW ו- HIGH, המתח על הסיכה מורכב ממחזורים מתחלפים של LOW וצף (מנותק)

(הערה: מופק מתוך

אני רק פותח סוגר זה כי כאשר אתה מתחיל ליצור קוד משלך, היזהר להשתמש ב- pinMode הנכון () לצורך שלך.

שלב 4: AnalogWrite () לעומת PwmWrite () … פלט אנלוגי בשני טעמים

AnalogWrite () לעומת PwmWrite () … פלט אנלוגי ב -2 טעמים
AnalogWrite () לעומת PwmWrite () … פלט אנלוגי ב -2 טעמים
AnalogWrite () לעומת PwmWrite () … פלט אנלוגי ב -2 טעמים
AnalogWrite () לעומת PwmWrite () … פלט אנלוגי ב -2 טעמים

לפני השימוש בסיכות GPIO "Blue Pill" יש צורך להצהיר על התנהגותו, כלומר כיצד הוא יעבוד. זה בדיוק מה שהפונקציה pinMode () עושה.

אז בואו נתמקד עכשיו באיך הנכון להגדיר פלט אנלוגי. ניתן להכריז עליו כמצב OUTPUT או כמצב PWM.

באותו אופן, ניתן לייחס ערכים אנלוגיים ל- GPIO בשתי דרכים: analogWrite () או pwmWrite (), BUT, analogWrite () יעבוד רק אם pinMode () = OUTPUT. מצד שני, pwmWrite () יעבוד רק אם pinMode () = PWM.

בוא ניקח את PA0, למשל: הוא מועמד פלט אנלוגי/pwm.

analogWrite (): זה מכריז על כך:

….

#define ledPin PA0

pinMode (ledPin, OUTPUT);

analogWrite (ledPin, <number>);

……"

כאשר המספר חייב להיות בין 0 ל -255, כמו Arduino. למעשה, הוא תואם לאחור לארדואינו.

pwmWrite (): הכריז על כך:

#define ledPin PA0

pinMode (ledPin, PWM);

pwmWrite (ledPin, <number.>);

…."

כאשר המספר חייב להיות בין 0 ~ 65535, רזולוציה הרבה יותר גבוהה מארדואינו.

בתמונות אפשר להשוות בין 2 קודים. אתה יכול גם לראות את הקוד המקורי.

שלב 5: תקשורת טורית STM32

תקשורת טורית STM32
תקשורת טורית STM32

בואו נראה כיצד מסודרים ממשקי USART ב- STM32. כן, ממשקים ברבים ….

ל- "Blue Pill" יש 3 של USART (RX/ TX 1 ~ 3), ואם אתה משתמש במעצב אתחול מאפשר לך להשתמש ב- USB, הוא אינו מחובר לאף אחת מהן.

תלוי אם אתה משתמש ב- USB או לא, עליך להצהיר על יציאה טורית בדרך זו או אחרת בקוד שלך.

מקרה 1: שימוש ב- USB:

בדרך זו, סקיצות יורדות ישירות באמצעות USB. אין צורך להזיז את מגשר BOOT0 למיקום אחד וחזרה ל -0.

במקרה זה, בכל פעם שאתה מצהיר "סידורי" ללא אינדקס, פירושו תקשורת באמצעות USB.

אז, Serial1, פירושו TX/ RX 1 (סיכות PA9 ו- PA10); Serial2, פירושו TX/ RX 2 (סיכות PA2 ו- PA3) ו- Serial 3 פירושו TX/ RX 3 (סיכות PA10 ו- PA11).

זו הדרך בה אנו עובדים. אציג שינויים בדוגמאות לדרך קידוד זו.

דבר נוסף: "USB סידורי" אינו צריך לאתחל. במילים אחרות, "… Serial.begin (15200);" לא נחוץ.

אפשר לקרוא לכל פונקציה סדרתית (Serial.read (), Serial.write () וכו ') ללא כל אתחול.

אם מסיבה כלשהי הוא קיים בקוד, המהדר יתעלם ממנו.

מקרה 2: שימוש במתאם TTL seria למתאם USB:

באופן זה, מטעין האתחול אינו תומך בתקשורת USB מקורית מסוג STM32, כך שאתה צריך מתאם USB לטורי המחובר ל- TX/ RX 1 (סיכה PA9 ו- PA10) כדי להעלות סקיצות.

במקרה זה, כל זמן "סידורי" ללא אינדקס הוא קוד, פירושו TX/ RX1 (יציאה המשמשת להעלאת הקוד). אז הלאה, Serial1 מתייחס ל- TX/ RX 2 (סיכות PA2 ו- PA3) ו- Serial2 מתייחס ל- TX/ RX 3 (סיכות PA10 ו- PA11). אין Serial3 זמין.

שלב 6: העברת ערך למיקרו -בקר

העברת ערך למיקרו -בקר
העברת ערך למיקרו -בקר

דוגמת דימר היא דרך פשוטה להראות כיצד להעביר ערך לבקר.

הוא אמור להעביר ערך מ 0 עד 255 כדי לשלוט על בהירות LED.

זה לא יעבוד כצפוי בכדור הכחול בשל:

  1. כדי להשתמש בפונקציה pwmWrite (), pinMode () חייב להיות מוכרז כמצב PWM.
  2. לעולם לא תקבל מספר שלם של 3 ספרות. הפונקציה Serial.read () לוכדת תוכן מאגר בלבד, שהוא "BYTE". אם תקליד "100" ולחץ על "enter", רק ה- "0" האחרון יתפוס מהמאגר. וערכו יהיה "48" (ערך ASCII עשרוני עבור "0"). אם בכוונתך להנפיק ערך "100", עליך להקליד "d". אז, נכון לומר שהוא ימיר ערך עשרוני של סמל ASCII בבהירות LED, נכון ??…. טוב, מעין …
  3. בעיה, מפות ערכים ישירות מהפונקציה Serial.read () היא פעולת טריק. כמעט בטוח לקבל ערכים בלתי צפויים. גישה טובה יותר היא תוכן מאגר אחסון במשתנה זמני ואז למפות אותו.

כפי שהסברתי בפריט 2, קוד שאני מציג שינויים יאפשר הזנת סמל ASCII וזה ישלט על בהירות LED המבוססת על הערך העשרוני של ASCII … לדוגמה, "רווח" הוא ערך 32 (למעשה הוא התו הנמוך ביותר להדפסה שתוכל להזין) ו- "}" הוא הגבוה ביותר (ערך 126). דמויות אחרות אינן ניתנות להדפסה, כך שהטרמינל לא יבין או שאולי תרכובת תווים (כמו "~" היא מקש מת במקלדת שלי והיא לא תעבוד כראוי). המשמעות היא שתו מורכב זה, כאשר תיכנס למסוף, ישלח את הדמות עצמה ועוד משהו. בדרך כלל לא ניתן להדפסה. והאם הקוד האחרון הזה יתפוס. כמו כן, זכור שהטרמינל שלך, במקרה זה, לא צריך לשלוח לא "החזרת עגלה" ולא "הזנת קו". עליך לשים לב לכך כדי שהקוד יפעל כהלכה.

אם נפלת זה קצת מבלבל, זה נהיה הגרוע ביותר…..

שלב 7: ואם הייתי רוצה להקליד שלוש ספרות … או אפילו יותר ??

ואם ארצה להקליד שלוש ספרות … או אפילו יותר ??
ואם ארצה להקליד שלוש ספרות … או אפילו יותר ??

קבלת תווים מרובים מתקשורת סדרתית אינה משימה פשוטה.

מאגר סידורי הוא ערימת בייט של FIFO של תווים. בכל פעם שהפונקציה Serial.read () מתקשרת, החתימה הראשונה שנשלחת מוסרת מהערימה ומאוחסנת במקומות אחרים. בדרך כלל משתנה char בקוד. שים לב, תלוי בחומרה, בדרך כלל יש פסק זמן לאופן שבו מאגר יומן יכול לשמור מידע.

אם בכוונתך להכניס יותר מספרה אחת באמצעות סידורי, יהיה עליך "לחבר" תו מחרוזת לפי תו, כאשר הם נכנסים למאגר UART.

המשמעות היא רכיבה על אופניים לקרוא כל חוצץ, לאחסן במשתנה זמני, לטעון אותו במיקום הראשון של מערך מחרוזות, לעבור למיקום הבא ולהתחיל מחדש, עד ש … ובכן, תלוי ביישום. ישנן 2 דרכים לסיים את המחזור:

  1. שימוש באיזה תו "סימן סיום", כמו "החזרת עגלה" או "הזנת קו". ברגע שנמצא סימן "סוף סימן", הלולאה מסתיימת.
  2. לחלופין, מספר התווים בשרשרת המיתרים יכול להיות מוגבל, כך גם מספר המחזורים האינטראקטיביים. כשהוא מגיע לגבול, נניח, 4, לרכוש גימורים שגרתיים מעצמו.

בואו נסתכל בדוגמה פשוטה כיצד עושים זאת:

  • הגדר סימן "סוף", כמו '\ n' (פירושו תו ASCII הזנת שורה).
  • לולאה בינתיים Serial.available () הוא נכון
  • אחסון Serial.read () גורם למשתנה char זמני. זכור: ברגע ש- Serial.read () למעשה "קורא" מאגר, הוא נקי והדמות הבאה נטענת בו.
  • להגדיל משתנה מחרוזת עם תו זה
  • אם הצ'אר האחרון הוא "סוף" צא מהלולאה.

בדרך כלל, שגרה לקבלת מערך תווים סדרתי נראית כמו תמונה.

הוא התבסס על עיבוד נרחב של הקוד המקורי של מר דיוויד א.

השתחרר להשתמש בו ולבדוק אותו. זכור: ערכים חייבים להזין בפורמט 3 ספרות.

זהו זה לעת עתה. לא ארחיב את עצמי בפרטי תקשורת טוריים נוספים. זה מורכב מכדי לכסות אותו ומגיע לו אינטרקטבלס משלו.

אני מקווה שזה יעזור לך להשתמש בדוגמאות בכדור כחול ולתת לך הארה עד כמה קוד נכון ללוח הקטן הזה.

נתראה בסביבה בהנחיות אחרות.

מוּמלָץ: