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

הרכבה של GPIO ARM - T.I. ערכת למידה של מערכת רובוטיקה - LAB 6: 3 שלבים
הרכבה של GPIO ARM - T.I. ערכת למידה של מערכת רובוטיקה - LAB 6: 3 שלבים

וִידֵאוֹ: הרכבה של GPIO ARM - T.I. ערכת למידה של מערכת רובוטיקה - LAB 6: 3 שלבים

וִידֵאוֹ: הרכבה של GPIO ARM - T.I. ערכת למידה של מערכת רובוטיקה - LAB 6: 3 שלבים
וִידֵאוֹ: פגישה 4 - התאמת הרזולוציה ביציאת HDMI במחשב Raspberry Pi 2024, נוֹבֶמבֶּר
Anonim
הרכבה של GPIO ARM - T. I. ערכת למידה של מערכת רובוטיקה - מעבדה 6
הרכבה של GPIO ARM - T. I. ערכת למידה של מערכת רובוטיקה - מעבדה 6

שלום, במדריך הקודם בנושא לימוד הרכבה של ARM באמצעות TI-RSLK של Texas Instruments (משתמש במיקרו בקר MSP432), aka Lab 3 אם אתה עושה את T. I. כמובן, עברנו על כמה הוראות בסיסיות מאוד כגון כתיבה לרשומה ולופ מותנה. עברנו את הביצוע באמצעות ה Eclipse IDE.

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

סוג של משעמם.

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

זה קורה שב- MSP432 זה מגיע על לוח פיתוח כבר יש שני מתגי לחצן, נורית RGB ונורית אדומה, כולם קשורים לכמה יציאות GPIO.

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

הרבה יותר מעניין מסתם לדפדף באגים.

(אנחנו עדיין הולכים לשלב - זו תהיה פונקציית ה'השהיה 'שלנו):-D

שלב 1: ננסה לכתוב אל / לקרוא מתוך זיכרון RAM

לפני שאנחנו קופצים לגישה ושליטה ב- GPIO, עלינו לעשות צעד קטן.

נתחיל רק בקריאה וכתיבה לכתובת זיכרון רגילה. אנו יודעים מההוראה הקודמת (ראו תמונות שם) ש- RAM מתחיל ב- 0x2000 0000, אז בואו נשתמש בכתובת הזו.

אנו הולכים להעביר נתונים בין רשם ליבה (R0) לבין 0x2000 0000.

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

.אֲגוּדָל

.text.align 2.global main.thumbfunc main main:.asmfunc; ---------------------------------- -----------------------------------------------; (הקוד שלנו יגיע לכאן); ------------------------------------------ ---------------------------------------.endasmfunc.end

אני רוצה להוסיף משהו חדש לחלק העליון, אילו היו כמה הצהרות (הנחיות). זה יתברר יותר מאוחר.

ACONST. Set 0x20000000; נשתמש בזה יותר למטה (זה קבוע)

; ברור ש- '0x' מציין את הדברים הבאים הוא ערך hex.

אז תוכן קובץ ההתחלה שלנו נראה כעת כך:

.אֲגוּדָל

.text.align 2 ACONST.set 0x20000000; נשתמש בזה יותר למטה (זה קבוע); ברור ש- '0x' מציין את הדברים הבאים הוא ערך hex..global main.thumbfunc main main:.asmfunc; --------------------------------------- ------------------------------------------; (הקוד שלנו יגיע לכאן); ------------------------------------------ ---------------------------------------.endasmfunc.end

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

אנו מתחילים בכתיבה למיקום RAM. ראשית נקבע את תבנית הנתונים, ערך, שנכתוב לתוך ה- RAM. אנו משתמשים ברישום ליבה כדי לקבוע ערך זה או נתונים אלה.

הערה: זכור שבקוד, כל שורה שיש לה נקודה-נקודה (';') פירושה שהכל הערה אחרי אותו נקודה-נקודה.

;-----------------------------------------------------------------------------------------------

; כותב; ------------------------------------------------ ----------------------------------------------- MOV R0, #0x55; מרשם הליבה R0 יכיל את הנתונים שברצוננו לכתוב למיקום ה- RAM.; ברור ש- '0x' מציין את הדברים הבאים הוא ערך hex.

לאחר מכן, בואו נסתכל על הצהרות שאינן פועלות.

; MOV MOV אינו ניתן לכתיבת נתונים למיקום RAM.

; MOV מיועד רק לנתונים מיידיים לרישום,; או מרשם אחד למשנהו; כלומר MOV R1, R0.; STR חייב להשתמש ב- STR.; STR R0, = ACONST; מונח רע בביטוי (ה'= '); STR R0, 0x20000000; מצב פנייה לא חוקי להדרכת חנות; STR R0, ACONST; מצב כתובת לא חוקי להדרכה בחנות

מבלי להסביר יותר מדי, ניסינו להשתמש ב- 'ACONST' למעלה. בעיקרו של דבר, זה עומד או קבוע במקום להשתמש בערך מילולי כמו 0x20000000.

לא הצלחנו לכתוב לכתוב למיקום ה- RAM באמצעות האמור לעיל. בואו ננסה משהו אחר.

; נראה שעלינו להשתמש ברישום אחר המכיל את מיקום ה- RAM

; כדי לאחסן למיקום ה- RAM הזה MOV R1, #0x20000000; הגדר את מיקום ה- RAM (לא התוכן שלו, אלא המיקום שלו) ל- R1.; ברור ש- '0x' מציין את הדברים הבאים הוא ערך hex. STR R0, [R1]; כתוב מה יש ב- R0 (0x55) לתוך זיכרון RAM (0x20000000) באמצעות R1.; אנו משתמשים ברגיסטר אחר (R1) בעל כתובת מיקום RAM; על מנת לכתוב למיקום ה- RAM הזה.

דרך נוספת לעשות את האמור לעיל, אך באמצעות 'ACONST' במקום ערך הכתובת המילולי:

; בואו נעשה את האמור לעיל שוב, אך בואו נשתמש בסמל במקום בערך מיקום RAM ממש.

; אנו רוצים להשתמש ב- 'ACONST' כסטנד אין עבור 0x20000000.; אנחנו עדיין צריכים לעשות את ה '#' כדי לסמן ערך מיידי,; אז (ראה למעלה), היינו צריכים להשתמש בהנחיית '.set'.; על מנת להוכיח זאת, בואו נשנה את תבנית הנתונים ב- R0. MOV R0, #0xAA; בסדר אנחנו מוכנים לכתוב ל- RAM באמצעות הסמל במקום ערך הכתובת המילולי MOV R1, #ACONST STR R0, [R1]

הסרטון נכנס לפרטים נוספים, כמו גם מעבר לקריאה ממיקום הזיכרון.

תוכל גם לצפות בקובץ.asm המקור המצורף.

שלב 2: קצת מידע על יציאה בסיסית

Image
Image
קצת מידע על יציאה בסיסית
קצת מידע על יציאה בסיסית
קצת מידע על יציאה בסיסית
קצת מידע על יציאה בסיסית

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

אז כיצד אנו מתקשרים עם סיכות ה- GPIO? מההסתכלות הקודמת שלנו על המיקרו -בקר הזה והוראות ה- ARM שלו, אנו יודעים כיצד להתמודד עם הרישומים הפנימיים שלו, ואנו יודעים כיצד לתקשר עם כתובות זיכרון (RAM). אבל סיכות GPIO?

זה קורה שהסיכות האלה ממופות בזיכרון, כך שנוכל להתייחס אליהן כמו כתובות זיכרון.

המשמעות היא שעלינו לדעת מהן הכתובות האלה.

להלן כתובות ההתחלה של היציאה. אגב, עבור MSP432, "יציאה" היא אוסף של סיכות, ולא רק סיכה אחת. אם אתה מכיר את ה- Raspberry Pi, אני מאמין שזה שונה מהמצב כאן.

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

עשיתי את היציאות שבהן אנו מודאגים מודגשות להלן.

  • GPIO P1: 0x4000 4C00 + 0 (כתובות שוות)
  • GPIO P2: 0x4000 4C00 + 1 (כתובות אי זוגיות)
  • GPIO P3: 0x4000 4C00 + 20 (כתובות שוות)
  • GPIO P4: 0x4000 4C00 + 21 (כתובות אי זוגיות)
  • GPIO P5: 0x4000 4C00 + 40 (כתובות שוות)
  • GPIO P6: 0x4000 4C00 + 41 (כתובות אי זוגיות)
  • GPIO P7: 0x4000 4C00 + 60 (כתובות שוות)
  • GPIO P8: 0x4000 4C00 + 61 (כתובות אי זוגיות)
  • GPIO P9: 0x4000 4C00 + 80 (כתובות שוות)
  • GPIO P10: 0x4000 4C00 + 81 (כתובות אי זוגיות)

עוד לא סיימנו. אנו זקוקים למידע נוסף.

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

חסימות כתובות I/O

נזדקק לכתובות אחרות, כגון:

  • כתובת רישום קלט של יציאה 1 = 0x40004C00
  • יציאת 1 כתובת רישום פלט = 0x40004C02
  • כתובת רישום כיוון יציאה 1 = 0x40004C04
  • יציאה 1 בחר 0 הרשמה כתובת = 0x40004C0A
  • יציאה 1 בחר 1 רישום כתובת = 0x40004C0C

ואולי נזדקק לאחרים.

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

הערה חשובה ביותר: כל יציאת קלט/פלט בלוח MSP432 LaunchPad היא אוסף של מספר (בדרך כלל 8) סיכות או קווים, וכל אחת מהן יכולה להיות מוגדרת בנפרד כקלט או פלט.

המשמעות היא, למשל, שאם אתה מגדיר ערכים עבור "כתובת רישום כיוון יציאה 1", עליך לדאוג לאיזה ביט (או סיביות) אתה מגדיר או משנה בכתובת זו. עוד על כך בהמשך.

רצף תכנות יציאות GPIO

החלק הסופי שאנו זקוקים לו הוא תהליך או אלגוריתם לשימוש, לשליטה על ה- LED.

אתחול חד פעמי:

  • הגדר את P1.0 (P1SEL1REG: P1SEL0REG Register) <--- 0x00, 0x00 עבור פונקציונליות GPIO רגילה.
  • הגדר את סימן רישום הכיוון 1 של P1DIRREG כפלט, או גבוה.

לוּלָאָה:

כתוב HIGH לביט 0 של רשם P1OUTREG כדי להדליק את הנורית האדומה

  • התקשר לפונקציית עיכוב
  • כתוב LOW לביט 0 של רשם P1OUTREG כדי לכבות את הנורית האדומה
  • התקשר לפונקציית עיכוב
  • חזור על לולאה

איזו פונקציית קלט / פלט (הגדר SEL0 ו- SEL1)

להרבה מהסיכות ב- LaunchPad יש שימושים מרובים. לדוגמה, אותה סיכה יכולה להיות GPIO דיגיטלית סטנדרטית, או שניתן להשתמש בה גם בתקשורת טורית UART או I2C.

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

יש תמונה למעלה לשלב זה המנסה להסביר מושג זה בצורה חזותית.

כתובות SEL0 ו- SEL1 יוצרות שילוב זוג המשמש כמעין בחירת פונקציה / תכונה.

למטרותינו, אנו רוצים GPIO דיגיטלי סטנדרטי לביט 0. זה אומר שאנחנו צריכים ביט 0 עבור SEL0 ו- SEL1 להיות נמוך.

רצף תכנות יציאות (שוב)

1. כתוב 0x00 ל- P1 SEL 0 Register (כתובת 0x40004C0A). זה מגדיר LOW עבור ביט 0

2. כתוב 0x00 ל- P1 SEL 1 רשום (כתובת 0x40004C0C). זה מגדיר LOW עבור ביט 0, הגדרה עבור GPIO.

3. כתוב 0x01 ל- P1 DIR Register (כתובת 0x40004C04). זה מגדיר HIGH לביט 0, כלומר OUTPUT.

4. הפעל את הנורית על ידי כתיבת רישום 0x01 ל- P1 OUTPUT (כתובת 0x40004C02)

5. בצע איזשהו עיכוב (או רק שלב אחד תוך כדי איתור באגים)

6. כבה את הנורית על ידי כתיבת 0x00 ל- P1 OUTPUT Register (כתובת 0x40004C02)

7. בצע איזשהו עיכוב (או רק שלב אחד תוך כדי איתור באגים)

8. חזור על שלבים 4 עד 7.

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

שלב 3: האם תפסת את הפגם היחיד בסרטון?

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

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

הבא מרחיב את מה שהתחלנו כאן.

מוּמלָץ: