SAM3X8E(Arduino Due)ピンIOレジスタ


9

Arduino DueのIOレジスタはどのように機能しますか?ちょうどセットArduinoの宇野ではDDRx、その後、PINx読むために、PORTx書き込みに、私はArduinoのために同じことをしたいのですが、それは、次のような多くのより多くのレジスタを、持っているPIO_OWERPIO_OSERPIO_CODRPIO_SODR、など私はArduinoの宇野間の対応を見つけないとArduino Dueレジスタ。

以下のようないくつかの便利な機能もありpio_clearpio_setpio_get、と他の人が、すべてがここで説明します:

http://asf.atmel.com/docs/3.19.0/sam3x/html/group__sam__drivers__pio__group.html

ここで、上記の3つの関数の機能は理解できたと思いますが、他の機能は理解できていません。たとえば、次のとおりです。

pio_configure (Pio *p_pio, const pio_type_t ul_type, const uint32_t ul_mask, const uint32_t ul_attribute)

私は何を把握することはできませんul_attributeul_typeしています。


AVRとSAMに実装されているGPIOクラスを次に示します。:レジスタを使用する方法のヒントを与えるかもしれないgithub.com/mikaelpatel/Arduino-GPIO/blob/master/src/Hardware/...
ミカエル・パテル

回答:


7

ここから入手できるデータシートのセクション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


3

基本的な直接ピンアクセスにはかなり単純な同等性があります。以下は、デジタルピンをハイに設定してからローに設定する方法を示すサンプルコードです。1つ目はArduino Due、2つ目はArduino Uno / Megaなどです。

const unsigned int imThePin = 10; //e.g. digital Pin 10

#ifdef _LIB_SAM_

    //First lets get the pin and bit mask - this can be done once at the start and then used later in the code (as long as the variables are in scope
    Pio* imThePort = g_APinDescription[imThePin].pPort; 
    unsigned int imTheMask = g_APinDescription[imThePin].ulPin; 

    //Lets set the pin high
    imThePort->PIO_SODR = imTheMask;
    //And then low
    imThePort->PIO_CODR = imTheMask;

#else

    //First lets get the pin and bit mask - this can be done once at the start and then used later in the code (as long as the variables are in scope
    volatile unsigned char* imThePort = portOutputRegister(digitalPinToPort(imThePin)); 
    unsigned char imTheMask = digitalPinToBitMask(imThePin);

    //Lets set the pin high
    *imThePort |= imTheMask;
    //Now low
    *imThePort &= ~imTheMask;

#endif

これを行うために必要なすべてのものがデフォルトで含まれている必要があります-含まれていない場合でも#include <Arduino.h>、そこに到達するには十分です。

実際Pioには、設定/クリア/プルアップ抵抗などを行うためのポインタを取得すると呼び出せる関数が利用できます。少しすっきりした関数呼び出しを使用します。完全なリストは、 ヘッダーファイル。


0

これは、ピン33のLEDを点滅させるコード例です。コードは上から借用しました-非常に役立つ説明に感謝します:)これは、16ビットカラーピクセルデータのダンプが必要なTFTタッチスクリーンディスプレイと話すプロジェクトの始まりです。ポートへの高速アクセス。私はコードが正しいと思います-特にピンをローに設定するライン。LEDが楽しく点滅しています。

void setup() 
{
  pinMode(33, OUTPUT); 
  REG_PIOC_OWER = 0x00000002; 
  REG_PIOC_OWDR = 0xfffffffd; 
}

void loop() 
{
  REG_PIOC_ODSR = 0x00000002; 
  delay(1000);             
  REG_PIOC_ODSR = 0x00000000;    
  delay(1000);   
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.