STM32 Memahami Pengaturan GPIO

41

Di perpustakaan Peripheral Standar STM32, kita perlu mengkonfigurasi GPIO.

Tetapi ada 3 fungsi yang saya tidak yakin cara mengkonfigurasinya;

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

Di GPIO_Speed , ada 4 pengaturan untuk dipilih

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

Bagaimana saya tahu kecepatan yang saya pilih? Apakah ada kelebihan atau kekurangan menggunakan kecepatan tinggi atau kecepatan rendah? (mis: konsumsi daya?)

Di GPIO_OType , ada 2 pengaturan untuk dipilih

GPIO_OType_PP // Push pull
GPIO_OType_OD // Open drain

Bagaimana cara mengetahui mana yang harus dipilih? dan apakah drain terbuka dan push pull?

Di GPIO_PuPd , ada 3 pengaturan untuk dipilih

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

Saya pikir pengaturan ini terkait dengan pengaturan awal push pull.

Tim
sumber
Terkait: cara memaksa paksa mode "buka saluran" pada mikrokontroler yang tidak mendukungnya secara native, seperti AVR / Arduino, PIC, dll: electronics.stackexchange.com/a/354993/26234
Gabriel Staples

Jawaban:

45
  • GPIO_PuPd (Pull-up / Pull-down)

    Dalam sirkuit digital, penting bahwa garis sinyal tidak pernah diizinkan untuk "mengambang". Artinya, mereka harus selalu dalam kondisi tinggi atau rendah. Saat mengambang, keadaan tidak dapat ditentukan, dan menyebabkan beberapa jenis masalah.

    Cara untuk memperbaikinya adalah dengan menambahkan resistor dari jalur sinyal ke Vcc atau Gnd. Dengan begitu, jika saluran tidak aktif didorong tinggi atau rendah, resistor akan menyebabkan potensi melayang ke tingkat yang diketahui.

    ARM (dan mikrokontroler lainnya) memiliki sirkuit bawaan untuk melakukan ini. Dengan begitu, Anda tidak perlu menambahkan bagian lain ke sirkuit Anda. Jika Anda memilih "GPIO_PuPd_UP", misalnya, sama saja dengan menambahkan resistor antara garis sinyal dan Vcc.

  • GPIO_OType (Jenis Output):

    Push-Pull: Ini adalah tipe output yang kebanyakan orang anggap sebagai "standar". Ketika output menjadi rendah, secara aktif "ditarik" ke ground. Sebaliknya, ketika output diatur ke tinggi, secara aktif "didorong" ke arah Vcc. Sederhana, tampilannya seperti ini:

    Dorong tarik

    Output Open-Drain, di sisi lain, hanya aktif dalam satu arah. Ini dapat menarik pin ke tanah, tetapi tidak dapat mendorongnya tinggi. Bayangkan gambar sebelumnya, tetapi tanpa MOSFET atas. Ketika tidak menarik ke tanah, MOSFET hanya non-konduktif, yang menyebabkan output melayang:

    opendrain

    Untuk jenis output ini, perlu ada resistor pull-up yang ditambahkan ke sirkuit, yang akan menyebabkan garis naik tinggi ketika tidak didorong rendah. Anda dapat melakukan ini dengan bagian eksternal, atau dengan mengatur nilai GPIO_PuPd ke GPIO_PuPd_UP.

    Namanya berasal dari fakta bahwa saluran MOSFET tidak terhubung secara internal dengan apa pun. Jenis output ini juga disebut "kolektor terbuka" saat menggunakan BJT, bukan MOSFET.

  • GPIO_Speed

    Pada dasarnya, ini mengontrol laju perubahan tegangan (waktu naik dan turun) sinyal keluaran. Semakin cepat laju perubahan tegangan, semakin banyak noise yang dipancarkan dari sirkuit. Ini adalah praktik yang baik untuk menjaga laju perubahan tegangan lambat, dan hanya meningkatkannya jika Anda memiliki alasan tertentu.

bitmack
sumber
Terima kasih! untuk jawaban yang bagus;), apakah Anda keberatan menjelaskan lebih banyak tentang masalah yang berbeda ketika itu dalam keadaan mengambang?
Tim
3
Idenya adalah bahwa tinggal untuk jangka waktu yang lama pada tegangan input antara sebagian dapat menyalakan FET atas dan bawah di blok input dan sebagian pendek catu daya melalui mereka, menghasilkan konsumsi daya yang berlebihan atau (dalam kasus yang sangat parah ) berpotensi merusak.
Chris Stratton
@Tim Ya, apa yang baru saja dikatakan Chris Stratton :)
bitsmack
3
@Tim Juga, ketika garis-garis mengambang, sangat mudah untuk mengganggu level tegangan. Hanya melambaikan tangan Anda di sekitar rangkaian dapat mengubah keadaan input, karena interaksi kapasitif ...
bitsmack
1
@Tim Itu benar-benar tergantung pada aplikasi. Jika Anda membaca sakelar (atau tombol), maka itu tidak terlalu penting. Jika Anda berinteraksi dengan komponen lain, itu tergantung pada antarmuka. Misalnya, untuk komunikasi SPI, jalur CS aktif-rendah. Dalam hal ini, Anda ingin resistor pull-up, jadi CS tidak pernah menjadi rendah secara tidak sengaja. Anda mungkin berpikir bahwa ini tidak perlu jika Anda akan selalu secara aktif menggerakkan saluran dengan mikrokontroler. Tapi bagaimana dengan sebelum mikrokontroler dimulai? Atau jika ulang?
Penarik
5

Kecepatan GPIO adalah frekuensi maksimum yang dapat dihasilkan oleh GPIO. Pengaturan yang lebih rendah dapat menghemat daya.

Jenis keluaran adalah apakah pin menyatakan tinggi dan rendah (push pull), atau apakah output menyala di gerbang FET yang terpasang ke pin di saluran pembuangan (Open drain). Ini bisa nyaman jika Anda membutuhkan pin yang terpasang untuk dapat menarik bus rendah tanpa pin pendek keluar lainnya.

Tarik ke atas resistor pasang output pin ke power rail, dan tarik ke bawah menempelkan itu melalui resistor ke tanah. Ini akan, antara lain, mengontrol tegangan pin bahkan jika bit dalam keadaan impedansi tinggi. Ini penting untuk melakukan hal-hal seperti menggunakan spot switch untuk mengubah nilai input digital. Bahkan dengan sakelar terbuka, inputnya dapat diprediksi.

Scott Seidman
sumber