STM32 การทำความเข้าใจการตั้งค่า GPIO


41

ในไลบรารีอุปกรณ์ต่อพ่วง STM32 มาตรฐานเราจำเป็นต้องกำหนดค่า GPIO

แต่มีฟังก์ชั่น 3 ตัวที่ฉันไม่แน่ใจว่าจะกำหนดค่าได้อย่างไร

  • GPIO_InitStructure.GPIO_Speed
  • GPIO_InitStructure.GPIO_OType
  • GPIO_InitStructure.GPIO_PuPd

ในGPIO_Speedมีการตั้งค่า 4 แบบให้เลือก

GPIO_Speed_2MHz  /*!< Low speed */
GPIO_Speed_25MHz /*!< Medium speed */
GPIO_Speed_50MHz /*!< Fast speed */
GPIO_Speed_100MHz

ฉันจะรู้ได้อย่างไรว่าฉันจะเลือกความเร็วไหน มีข้อดีหรือข้อเสียในการใช้ความเร็วสูงหรือความเร็วต่ำหรือไม่? (เช่น: การใช้พลังงาน?)

ในGPIO_OTypeมีการตั้งค่า 2 แบบให้เลือก

GPIO_OType_PP // Push pull
GPIO_OType_OD // Open drain

จะรู้ได้อย่างไรว่าควรเลือกแบบไหน? และท่อระบายน้ำแบบเปิดและดันแบบดึงคืออะไร?

ในGPIO_PuPdมีการตั้งค่า 3 แบบให้เลือก

GPIO_PuPd_NOPULL // No pull
GPIO_PuPd_UP     // Pull up
GPIO_PuPd_DOWN   // Pull down

ฉันคิดว่าการตั้งค่านี้เกี่ยวข้องกับการตั้งค่าเริ่มต้นของ push pull


ที่เกี่ยวข้อง: วิธีบังคับโหมด "open drain" อย่างชัดเจนบนไมโครคอนโทรลเลอร์ที่ไม่รองรับเช่น AVR / Arduino, PIC, ฯลฯ : electronics.stackexchange.com/a/354993/26234
Gabriel Staples

คำตอบ:


45
  • GPIO_PuPd (ดึงขึ้น / ดึงลง)

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

    วิธีการแก้ไขสิ่งนี้คือการเพิ่มตัวต้านทานจากสายสัญญาณไปยัง Vcc หรือ Gnd ด้วยวิธีนี้หากเส้นไม่ได้ถูกผลักดันอย่างสูงหรือต่ำตัวต้านทานจะทำให้มีแนวโน้มที่จะลอยไปสู่ระดับที่รู้จัก

    ARM (และไมโครคอนโทรลเลอร์อื่น ๆ ) มีวงจรในตัวเพื่อทำสิ่งนี้ ด้วยวิธีนี้คุณไม่จำเป็นต้องเพิ่มส่วนอื่นในวงจรของคุณ หากคุณเลือก "GPIO_PuPd_UP" ตัวอย่างเช่นจะเป็นการเพิ่มความต้านทานระหว่างสายสัญญาณและ Vcc

  • GPIO_OType (ประเภทขาออก):

    พุช - พุช: นี่เป็นประเภทเอาต์พุตที่คนส่วนใหญ่คิดว่าเป็น "มาตรฐาน" เมื่อเอาท์พุทต่ำลงมันจะถูก "ดึง" ไปที่กราวด์ ในทางกลับกันเมื่อเอาต์พุตถูกตั้งค่าเป็นสูงจะมีการ "ผลัก" ไปยัง Vcc อย่างแข็งขัน ง่ายขึ้นดูเหมือนว่านี้:

    ผลักดึง

    ในทางกลับกันเอาต์พุตของ Open-Drain จะทำงานในทิศทางเดียวเท่านั้น มันสามารถดึงพินไปที่พื้น แต่ไม่สามารถขับได้สูง ลองนึกภาพก่อนหน้านี้ แต่ไม่มี MOSFET ด้านบน เมื่อมันไม่ได้ถูกดึงลงกราวด์ MOSFET นั้นไม่สามารถนำไฟฟ้าได้ซึ่งทำให้เอาท์พุทลอย:

    opendrain

    สำหรับเอาต์พุตประเภทนี้จะต้องมีตัวต้านทานแบบดึงขึ้นที่เพิ่มเข้ากับวงจรซึ่งจะทำให้เส้นสูงขึ้นเมื่อไม่ขับเคลื่อนต่ำ คุณสามารถทำได้ด้วยชิ้นส่วนภายนอกหรือโดยการตั้งค่า GPIO_PuPd เป็น GPIO_PuPd_UP

    ชื่อนี้มาจากข้อเท็จจริงที่ว่าการระบายของ MOSFET ไม่ได้เชื่อมต่อกับสิ่งใดภายใน เอาต์พุตประเภทนี้เรียกอีกอย่างว่า "open-collector" เมื่อใช้ BJT แทน MOSFET

  • GPIO_Speed

    โดยพื้นฐานแล้วสิ่งนี้จะควบคุมอัตราการฆ่า (เวลาเพิ่มขึ้นและเวลาตก) ของสัญญาณเอาต์พุต ยิ่งอัตราการฆ่าเร็วขึ้นเท่าไหร่เสียงก็ยิ่งเปล่งออกจากวงจรมากขึ้นเท่านั้น เป็นวิธีปฏิบัติที่ดีที่จะรักษาอัตราการฆ่าช้าและเพิ่มเฉพาะในกรณีที่คุณมีเหตุผลเฉพาะ


ขอบคุณ! สำหรับคำตอบที่ดี;) คุณคิดจะอธิบายอีกเล็กน้อยเกี่ยวกับปัญหาต่าง ๆ เมื่ออยู่ในสถานะลอยตัวหรือไม่?
ทิม

3
แนวคิดก็คือว่าการอยู่อาศัยเป็นระยะเวลาใด ๆ ที่แรงดันไฟฟ้าขาเข้าระดับกลางสามารถเปิดได้ทั้ง FET ด้านบนและล่างในบล็อกอินพุตและบางส่วนทำให้แหล่งจ่ายไฟสั้นผ่านบางส่วนทำให้สิ้นเปลืองพลังงานมากเกินไปหรือ (ในกรณีที่รุนแรงเป็นพิเศษ ) อาจเกิดความเสียหาย
Chris Stratton

@ Tim ใช่สิ่งที่คริสแตรทตันเพียงแค่กล่าวว่า :)
bitsmack

3
@Tim นอกจากนี้เมื่อสายลอยมันง่ายมากที่จะรบกวนระดับแรงดันไฟฟ้า เพียงแค่โบกมือของคุณรอบ ๆ วงจรสามารถเปลี่ยนสถานะของอินพุตได้เนื่องจากการโต้ตอบแบบคาปาซิทีฟ ...
bitsmack

1
@Tim มันขึ้นอยู่กับแอปพลิเคชันจริงๆ หากคุณกำลังอ่านสวิตช์ (หรือปุ่ม) แสดงว่าไม่สำคัญ หากคุณเชื่อมต่อกับส่วนประกอบอื่น ๆ ขึ้นอยู่กับส่วนต่อประสาน ตัวอย่างเช่นสำหรับการสื่อสาร SPI สาย CS นั้นไม่แอ็คทีฟ ในกรณีนี้คุณต้องการตัวต้านทานแบบดึงขึ้นดังนั้น CS จะไม่ลดลงโดยไม่ได้ตั้งใจ คุณอาจคิดว่านี่เป็นสิ่งที่ไม่จำเป็นหากคุณจะขับรถด้วยไมโครคอนโทรลเลอร์ แต่ก่อนที่ไมโครคอนโทรลเลอร์จะเริ่มต้นทำงานล่ะ? หรือถ้ารีเซ็ต ตัวต้านทานแบบดึงขึ้นจะขจัดความกำกวมใด ๆ ...
bitsmack

5

GPIO Speed ​​เป็นความถี่สูงสุดที่ GPIO สามารถผลิตได้ การตั้งค่าที่ต่ำกว่าสามารถประหยัดพลังงานได้

ประเภทขาออกไม่ว่าขาจะยืนยันเสียงสูงและเสียงต่ำ (กดแบบดึง) หรือว่าสัญญาณจะเปิดที่ประตูของ FET ที่ติดกับขาที่ท่อระบายน้ำ (ท่อระบายน้ำแบบเปิด) วิธีนี้จะสะดวกถ้าคุณต้องการหมุดที่ยึดไว้เพื่อให้สามารถดึงบัสต่ำได้โดยไม่ต้องเสียบพินอื่น ๆ

ตัวต้านทานแบบดึงขึ้นติดเอาท์พุทพินเข้ากับรางไฟและดึงตัวต้านทานแบบแนบลงผ่านตัวต้านทานไปยังพื้น สิ่งนี้จะควบคุมแรงดันไฟฟ้าของพินแม้ว่าบิตจะอยู่ในสถานะอิมพีแดนซ์สูง นี่เป็นสิ่งสำคัญที่จะทำสิ่งต่าง ๆ เช่นการใช้สวิทช์จุดเพื่อเปลี่ยนค่าอินพุตดิจิตอล แม้จะเปิดสวิตช์ก็ตามอินพุตก็สามารถคาดเดาได้

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