ทำไมฉันต้องตั้งค่าและทิศทางของ GPIO ในโปรเซสเซอร์แบบฝังตัวก่อน


16

ฉันมีงานเต็มเวลาในฐานะวิศวกรเฟิร์มแวร์ ฉันเพิ่งได้รับมอบหมายให้ตรวจสอบการกำหนดค่า GPIO และเปลี่ยนการตั้งค่าตามต้องการ ฉันพบพินไม่กี่ตัวที่ได้รับการกำหนดค่าอย่างไม่ถูกต้องดังนั้นฉันจึงกำหนดค่าใหม่ตามธรรมชาติ แต่ฉันก็บอกว่าทำตามลำดับที่ผิด นี่คือสิ่งที่ฉันพูดถึง:

ก่อน:
GPIO1.direction = INPUT;

หลัง:
GPIO1.direction = OUTPUT;
GPIO1.value = 0;

อย่างไรก็ตามในระหว่างการตรวจสอบรหัสฉันได้รับแจ้งว่าฉันต้องเปลี่ยนลำดับของการเริ่มต้นเป็นต่อไปนี้:

GPIO1.value = 0;
GPIO1.direction = OUTPUT;

กล่าวอีกนัยหนึ่งตั้งค่าก่อนแล้วกำหนดทิศทางของหมุด ฉันได้รับแจ้งด้วยว่านี่เป็นวิธีที่ต้องใช้กับโปรเซสเซอร์ที่ทันสมัยเนื่องจากใช้สองรีจิสเตอร์สำหรับอินพุตและหนึ่งสำหรับเอาต์พุตอย่างไรก็ตามโปรเซสเซอร์เก่าใช้เพียงรีจิสเตอร์เดียวดังนั้นลำดับของการดำเนินการจึงไม่สำคัญ
(หมายเหตุ: ทันสมัย ​​= ARM Cortex M3 ขึ้นไป, เก่า = Intel 8051)

ฉันขอคำอธิบายที่ดีกว่าในที่ทำงาน แต่ฉันไม่สามารถรับคำตอบที่ดีได้ นั่นเป็นเหตุผลที่ฉันตัดสินใจที่จะถามที่นี่

ดังนั้นนี่คือคำถามของฉัน:

  1. เหตุใดลำดับของการกำหนดค่าเริ่มต้นจึงสำคัญกับโปรเซสเซอร์ใหม่
  2. ทำไมลำดับของการเริ่มต้นไม่สำคัญกับโปรเซสเซอร์รุ่นเก่า?
  3. พวกเขากำลังพูดถึงสองสิ่งในโปรเซสเซอร์ที่ทันสมัย?
  4. พวกเขากำลังพูดถึงอะไรกันบ้างเกี่ยวกับโปรเซสเซอร์รุ่นเก่า?

หากใครบางคนสามารถจัดเรียงของไดอะแกรมมันจะดีกว่านี้


1
โปรเซสเซอร์ "ทันสมัย" และ "เก่า" นั้นคลุมเครือเกินกว่าที่จะให้คำตอบที่เป็นประโยชน์ สถาปัตยกรรมที่แตกต่างกันมีการตั้งค่าการลงทะเบียนที่แตกต่างกัน โดยไม่ทราบว่าคนที่คุณกำลังพูดถึงนั้นไม่มีวิธีที่จะแสดงความคิดเห็นอย่างชาญฉลาด
Nick Johnson

@ IgnacioVazquez-Abrams No ไม่ได้จริงๆ มีวิศวกรที่มีประสบการณ์มากในห้องซึ่งบอกว่าคุณจะมีความผิดพลาดในสายถ้ามันเป็นแบบของฉัน
flashburn

@NickJohnson Modern = ARM Cortex M4 ขึ้นไป, Old = Intel 8051.
flashburn

@BrianDrummond LOL คำอธิบายที่ดีมาก แต่สิ่งที่เกี่ยวกับโปรเซสเซอร์เก่า 8051 เช่น ทำไมสิ่งนี้ไม่สำคัญสำหรับพวกเขา?
flashburn

2
Q4 จะตอบได้ง่ายกว่าด้วยลิงก์แผ่นข้อมูล
pjc50

คำตอบ:


22

8051 ดั้งเดิมใช้พอร์ตเอาต์พุตหลอกแบบสองทิศทาง (open-drain พร้อม pullups) ดังนั้นจึงไม่มีการตั้งค่าทิศทางของพอร์ต

แน่นอนว่าพอร์ตเอาต์พุตแบบสองทิศทางที่แท้จริงแบบใหม่จะดีกว่าถ้ามีชุดค่าที่รู้จักกันก่อนที่จะเปิดใช้งานพินพอร์ตสำหรับเอาต์พุต

ดูคำตอบของฉันที่นี่เช่น

แก้ไข: นี่คือโครงสร้างขา I / O สำหรับไมโครคอนโทรลเลอร์ CMOS ที่ทันสมัย ​​(ค่อนข้าง) :

ป้อนคำอธิบายรูปภาพที่นี่

TRIS (TRIState) เรียกว่า DDR (Data Direction Register) ในไมโครอื่น ๆ ในกรณีนี้ถ้าเอาต์พุตสลัก TRIS สูงทรานซิสเตอร์ทั้งสองจะ 'ปิด' แต่พอร์ตยังคงสามารถอ่านได้

นี่คือโครงสร้างขา I / O ที่ซับซ้อนมากขึ้นเล็กน้อยสำหรับใหม่ของไมโครชิปไมโคร

ป้อนคำอธิบายรูปภาพที่นี่

อีกครั้งสลัก TRIS ปิดการใช้งานเอาท์พุท หนึ่งในนี้มีสลัก LAT ที่จะช่วยให้หลีกเลี่ยงการอ่านเขียนแก้ไขปัญหา ในซีรี่ส์ PIC คุณควรเขียนลงทะเบียน LAT เท่านั้น (และอ่านจากการลงทะเบียน PORT)

นี่คือ 8051 ดั้งเดิมและ CMOS 8051 classic Pin I / O พอร์ตภายในวงจร (จากแหล่งนี้ ):

ป้อนคำอธิบายรูปภาพที่นี่

มีความซับซ้อนเพิ่มขึ้นเล็กน้อยในการที่มีทรานซิสเตอร์เพิ่มความเร็วขนานกับ pull-up ที่เปิดขึ้นชั่วครู่เพื่อเอาชนะความจุภายนอก อย่างที่คุณเห็นไม่มีการควบคุม TRIS / DDR เลย MOSFET แบบดึงขึ้นที่ใช้ในการทำงานปกติคือ 'อ่อน' - มีขนาดเล็กพอ (Idss ต่ำ) ที่เอาท์พุทภายนอกที่เชื่อมต่อกับพินสามารถดึงพอร์ตพอร์ตแบบสองทิศทางที่ต่ำได้


ขอบคุณสำหรับคำอธิบาย ฉันไม่ได้ทำงานกับฮาร์ดแวร์มาระยะหนึ่งแล้วฉันจึงยากที่จะเข้าใจคำอธิบายจากคำอธิบาย คุณจะให้ภาพ บอกได้ไหมว่าฮาร์ดแวร์การกำหนดค่าพินจะดูตัวประมวลผลที่ทันสมัยอย่างไร ฉันจะขอบคุณมันจริงๆ
flashburn

ฮาร์ดแวร์หมายถึงอะไร วงจร GPIO ภายในของชิป
Spehro Pefhany

ถูกต้อง. ไดอะแกรมบางชนิดจะมีประโยชน์จริงๆ
flashburn

16

หากคุณตั้งค่าทิศทางก่อนหมุดจะถูกกำหนดค่าสั้น ๆ เพื่อเอาท์พุทไม่ว่าจะเป็นค่าเอาต์พุตปัจจุบัน หากคุณตั้งค่าก่อนสิ่งนี้จะไม่เกิดขึ้น

ดังนั้นควรทำตามวิธีที่คุณแนะนำเพื่อหลีกเลี่ยงความผิดพลาดในผลลัพธ์ซึ่งอาจมีตั้งแต่อันตรายและความหายนะทั้งนี้ขึ้นอยู่กับว่าหมุดเชื่อมต่อกับอะไร


ขอบคุณ แล้วโปรเซสเซอร์เก่าทำไมมันไม่สำคัญสำหรับพวกเขา? เก่า = Intel 8051
flashburn

ฉันไม่คุ้นเคยกับ 8051 ขึ้นอยู่กับสิ่งที่เพื่อนร่วมงานของคุณพูดถ้าการลงทะเบียนเดียวกันกำหนดค่าทั้งทิศทางและค่ามันจะไม่สำคัญเพราะคอมไพเลอร์จะปรับการเขียนทั้งสองให้เป็นหนึ่งเดียว
Nick Johnson

2
มันอาจจะยังเป็นนิสัยที่ดีที่จะทำเช่นนี้ "ใหม่" วิธีสำหรับโปรเซสเซอร์เก่าด้วยเหตุผลข้างต้น orocessors ที่แตกต่างกันอาจมีความต้องการที่แตกต่างกันผู้ขายที่แตกต่างกันอาจให้คำแนะนำที่ดีกว่าคนอื่น ๆ และ บริษัท / นายจ้าง / ทีมที่แตกต่างกันอาจมีนโยบายที่แตกต่างกันเกี่ยวกับรายละเอียดดังกล่าว
billt

2
แน่นอน ... สันนิษฐานเสมอว่า DIO นั้นเชื่อมต่อกับวงโคจรของเลเซอร์แห่งการลงโทษ;)
Michael

4

สมมติว่าทิศทางเริ่มต้นคืออินพุต (เช่น High-Z ซึ่งเหมาะสมแล้วเนื่องจากเราไม่ต้องการให้ MCU บังคับค่าใด ๆ บนบรรทัดที่เชื่อมต่อ) ลำดับของการตั้งค่าพอร์ตนี้เป็นที่นิยม แต่ไม่จำเป็น ในความเป็นจริงมีความจำเป็นเมื่อแอ็พพลิเคชันของคุณต้องการเมื่อเริ่มต้นค่าพอร์ตจะไม่เป็นเช่น1นั้น จากนั้นคุณจะตั้งค่าเป็น0และเปลี่ยนทิศทาง ในกรณีนี้คุณหลีกเลี่ยง "ความผิดพลาด" ชั่วขณะที่เป็นไปได้ระหว่างการตั้งค่าทิศทางและค่าซึ่งอาจส่งผลให้เกิดการขัดขวางที่ขา และมันเป็นความจริงสำหรับโปรเซสเซอร์ทุกตัวที่มีตรรกะเช่นนี้ไม่ใช่เฉพาะโปรเซสเซอร์ใหม่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.