Saya membaca datasheet dari chip ARM Cortex, khususnya bab GPIO. Pada akhirnya, saya ingin mengonfigurasi berbagai pin GPIO untuk menggunakannya dalam mode "Fungsi Alternatif" untuk akses baca / tulis ke SRAM.
Dari semua register GPIO yang tersedia, saya tidak mengerti dua: GPIO_PUPDR
dan GPIO_OTYPE
yang masing-masing merupakan "pull-up / pull-down register" dan "register tipe keluaran".
Karena GPIO_PUPDR
aku punya tiga pilihan:
- Tidak ada pull-up atau pull-down
- Tarik
- Menurunkan
Karena GPIO_0TYPE
aku punya dua pilihan:
- Output push-pull
- Keluaran drainase terbuka
Apa perbedaan antara semua konfigurasi yang berbeda, dan mana yang paling sesuai untuk komunikasi SRAM?
Dokumentasi untuk papan yang saya kerjakan tersedia di sini (lihat halaman 24 untuk skema SRAM). Manual referensi untuk Chip ARM tersedia di sini (lihat halaman 145 dan 146 untuk register GPIO).
sumber
Jawaban:
Jawaban ini umum untuk prosesor dan periferal, dan memiliki komentar spesifik SRAM di bagian akhir, yang mungkin berkaitan dengan RAM dan CPU spesifik Anda.
Pin output dapat didorong dalam tiga mode berbeda:
Pin input dapat menjadi input gerbang dengan:
Ada juga a mode input yang dipicu Schmitt di mana pin input ditarik dengan pull-up yang lemah ke keadaan awal. Ketika dibiarkan sendirian itu tetap dalam keadaannya, tetapi dapat ditarik ke negara baru dengan sedikit usaha.
Saluran terbuka bermanfaat ketika banyak gerbang atau pin dihubungkan bersama dengan pull-up (eksternal atau internal). Jika semua pin tinggi, semuanya adalah sirkuit terbuka dan pull-up mendorong pin tinggi. Jika ada pin yang rendah, mereka semua menjadi rendah saat diikat. Konfigurasi ini secara efektif membentuk
AND
gerbang.Saat mengendarai SRAM Anda mungkin ingin menggerakkan jalur data atau jalur alamat tinggi atau rendah sekuat dan secepat mungkin sehingga diperlukan drive yang aktif naik dan turun, sehingga tarikan-tarikan ditunjukkan. Dalam beberapa kasus dengan banyak RAM Anda mungkin ingin melakukan sesuatu yang pintar dan menggabungkan garis, di mana mode lain mungkin lebih cocok.
Dengan SRAM dengan input data dari SRAM jika IC RAM selalu menyatakan data maka pin tanpa pull-up mungkin OK karena RAM selalu mengatur level dan ini meminimalkan beban. Jika jalur data RAM kadang-kadang sirkuit terbuka atau tristate Anda akan memerlukan pin input untuk dapat mengatur negara mereka sendiri yang valid. Dalam komunikasi berkecepatan sangat tinggi, Anda mungkin ingin menggunakan pull-up dan dan pull-down sehingga resistansi paralel paralel adalah resistansi terminasi, dan voltase idle bus diatur oleh dua resistor, tetapi ini agak spesialis.
sumber
Saya menemukan jawaban ini dari STM32 Memahami Pengaturan GPIO
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 sedang 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.
Push-Pull: Ini adalah tipe output yang kebanyakan orang anggap sebagai "standar". Ketika output rendah, secara aktif "ditarik" ke ground. Sebaliknya, ketika output diatur ke tinggi, secara aktif "didorong" ke arah Vcc. Sederhana, tampilannya seperti ini:
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 (sisi bawah) hanyalah non-konduktif, yang menyebabkan output mengambang.
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.
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.
sumber
Satu lagi sedikit tid-bit: untuk mikrokontroler yang tidak memiliki mode "saluran terbuka" yang eksplisit, seperti papan berbasis AVR dan Arduino ATmega328 seperti Uno, mode "saluran terbuka" ini dapat disimulasikan dengan menulis fungsi pembungkus yang hanya menetapkan pin ke "Output LOW" ketika Anda mengirimnya
0
dan yang mengkonfigurasi pin sebagai "Input LOW" (mode impedansi tinggi, resistor pullup internal TIDAK aktif) ketika Anda mengirimnya1
. Dengan cara ini Anda mendapatkan efek yang sama. Mikrokontroler ARM-core 32-bit modern ini hanya memiliki lebih banyak opsi.Juga, hal. 14 dari Manual Referensi STM32 yang ditautkan dengan menyatakan di atas berikut [tambahan saya adalah dalam tanda kurung] :
Dalam kode Arduino, "fungsi pembungkus" dapat diimplementasikan seperti ini:
Atau disederhanakan:
Perhatikan bahwa untuk mengaktifkan resistor pullup internal pada Arduino yang dapat Anda lakukan:
ATAU (hal yang sama):
Bacaan tambahan:
sumber