Jika Anda membaca bagian 31 dari Lembar Data, tersedia dari sini , segala sesuatunya mungkin menjadi lebih jelas bagi Anda.
Berikut ringkasan dari apa yang saya ketahui:
PIO adalah singkatan dari Input / Output Paralel dan menawarkan fungsionalitas untuk membaca dan menulis beberapa port register sekaligus. Di mana lembar data menyebutkan register, misalnya PIO_OWER, perpustakaan Arduino memiliki makro untuk mengaksesnya dalam format ini REG_PIO? _OWER di mana? adalah A, B, C atau D untuk berbagai port yang tersedia.
Saya cenderung masih menggunakan pinMode () fungsi Arduino lambat untuk mengatur input / output pada pin karena membuat kode lebih mudah dibaca daripada panggilan register berbasis akronim seperti REG_PIOC_OWER = 0xdeadbeef, tapi kemudian gunakan register langsung untuk mengatur pin untuk kinerja / sinkronisasi. Sampai sekarang, saya belum melakukan apa pun dengan input, jadi contoh saya semuanya berbasis output.
Untuk penggunaan dasar, Anda akan menggunakan REG_PIO? _SODR untuk mengatur jalur output tinggi dan REG_PIO? _CODR untuk mengaturnya rendah. Misalnya REG_PIOC_SODR = 0x00000002 akan mengatur bit 1 (dinomori dari nol) pada PORTC (ini karena pin digital 33) tinggi. Semua pin lain di PORTC tetap tidak berubah. REG_POIC_CODR = 0x00000002 akan menetapkan bit 1 pada PORTC rendah. Sekali lagi semua pin lainnya tidak akan berubah.
Karena ini masih belum optimal, atau disinkronkan jika Anda bekerja dengan data paralel, ada register yang memungkinkan Anda untuk menulis semua 32 bit port dengan satu panggilan. Ini adalah REG_PIO? _ODSR, jadi REG_PIOC_ODSR = 0x00000002 sekarang akan menetapkan bit 1 pada PORTC tinggi dan semua bit lain pada PORTC akan ditetapkan rendah langsung dalam satu instruksi CPU.
Karena tidak mungkin Anda akan berada dalam situasi di mana Anda perlu mengatur semua 32 bit port pada saat yang sama, Anda perlu menyimpan nilai pin saat ini, melakukan operasi DAN untuk menutupi yang Anda ingin mengubah, melakukan operasi ATAU untuk mengatur yang ingin Anda atur tinggi kemudian melakukan penulisan Anda dan lagi, dan ini tidak optimal. Untuk mengatasinya, CPU itu sendiri akan melakukan masking untuk Anda. Ada register yang disebut OWSR (register status penulisan output) yang akan menutupi bit yang Anda tulis ke ODSR yang tidak cocok dengan bit yang ditetapkan dalam OWSR.
Jadi, sekarang jika kita memanggil REG_PIOC_OWER = 0x00000002 (ini menetapkan bit 1 dari OWSR tinggi) dan REG_PIOC_OWDR = 0xfffffffd (ini menghapus semua bit kecuali bit 1 dari OWSR) dan kemudian memanggil REG_PIOC_ODSR = 0x00000002 lagi, kali ini hanya akan mengubah bit 1 PORTC dan semua bit lainnya tetap tidak berubah. Perhatikan fakta bahwa OWER mengaktifkan bit apa pun yang ditetapkan ke 1 pada nilai yang Anda tulis dan OWDR menonaktifkan bit apa pun yang diatur ke 1 pada nilai yang Anda tulis. Meskipun saya mengerti ini ketika saya membacanya, saya masih berhasil membuat kesalahan kode ketika menulis kode pengujian pertama saya berpikir bahwa OWDR menonaktifkan bit yang tidak diatur ke 1 pada nilai yang saya tulis.
Saya harap ini setidaknya memberi Anda sedikit permulaan dalam memahami PIO CPU Karena. Baca dan mainkan dan jika Anda memiliki pertanyaan lebih lanjut, saya akan mencoba menjawabnya.
Edit: Satu hal lagi ...
Bagaimana Anda tahu bit PORT mana yang sesuai dengan garis digital Due? Lihat ini: Karena Pinout