ここから入手できるデータシートのセクション31をお読みになっている場合は、少しわかりやすいかもしれません。
これが私が知っていることの要約です:
PIOはParallel Input / Outputの略で、一度に複数のレジスタポートを読み書きする機能を提供します。データシートにレジスタ、たとえばPIO_OWERが記載されている場合、Arduinoライブラリには、これらにアクセスするためのマクロがREG_PIO?_OWERという形式で含まれています。使用可能なさまざまなポートのA、B、C、またはDのいずれかです。
REG_PIOC_OWER = 0xdeadbeefなどの頭字語ベースのレジスター呼び出しよりもコードを読みやすくするため、遅いArduino pinMode()関数を使用してピンの入出力を設定する傾向がありますが、直接レジスターを使用してピンを設定しますパフォーマンス/同期。まだ、私は入力で何もしていませんので、私の例はすべて出力ベースです。
基本的な使用法では、REG_PIO?_SODRを使用して出力ラインを高く設定し、REG_PIO?_CODRを使用して出力ラインを低く設定します。たとえば、REG_PIOC_SODR = 0x00000002は、PORTC(これはDueデジタルピン33です)のビット1(ゼロから番号付け)をハイに設定します。PORTCの他のすべてのピンは変更されません。REG_POIC_CODR = 0x00000002は、PORTCのビット1をローに設定します。この場合も、他のすべてのピンは変更されません。
これはまだ最適ではないため、またはパラレルデータで作業している場合は同期されているため、1回の呼び出しでポートのすべての32ビットを書き込むことができるレジスタがあります。これらはREG_PIO?_ODSRであるため、REG_PIOC_ODSR = 0x00000002はPORTCのビット1をハイに設定し、PORTCの他のすべてのビットは単一のCPU命令で即座にローに設定されます。
ポートのすべての32ビットを同時に設定する必要がある状況になる可能性は低いため、ピンの現在の値を保存し、AND演算を実行して、必要なピンをマスクする必要があります。変更したい場合は、OR演算を実行して必要なものを高く設定してから書き込みを実行しますが、これは最適ではありません。これを克服するために、CPU自体がマスキングを実行します。OWSRに設定されたビットと一致しないODSRに書き込むビットをマスクする、OWSR(出力書き込みステータスレジスタ)と呼ばれるレジスタがあります。
したがって、今度はREG_PIOC_OWER = 0x00000002(これによりOWSRのビット1がHighに設定されます)とREG_PIOC_OWDR = 0xfffffffd(これによりOWSRのビット1を除くすべてのビットがクリアされます)を呼び出し、再びREG_PIOC_ODSR = 0x00000002を呼び出すと、ビットのみが変更されます。 PORTCの1と他のすべてのビットは変更されません。ことに注意してOWERができます任意のビットを1に設定されているあなたが書いた値で、そのOWDRが無効に任意のビットを1に設定されているあなたが書いた値にします。これを読んだときは理解できましたが、最初のテストコードを作成したときに、OWDR が、書き込んだ値で1に設定されていないビットを無効にすると思って、コードを間違えました。
これで、Due CPUのPIOを理解する上で少々の出発点になったと思います。読んだり、遊んだりしてください。他に質問がある場合は、回答させていただきます。
編集:もう1つ...
PORTのどのビットがDueのどのデジタルラインに対応するかをどのようにして知るのですか?これをチェックしてください:Due Pinout