Arduinoで遊ぶページ

Arduinoで遊んだ結果を残すページです。
garretlab
PIO_SetOutput()

PIO_SetOutput()

概要

PIO(Parallel Input/Output Controller)コントローラを出力モードに設定します。

以下のレジスタを設定します。

レジスタ シンボル 意味(1を書き込んだときの動作)
Multi-driver Enable レジスタ PIO_MDER 対応するピンをオープンドレインを有効にする。
Multi-driver Disable レジスタ PIO_MDDR 対応するピンをオープンドレインを無効にする。
Set Output Data レジスタ PIO_SODR 対応するピンをHIGHにする。
Clear Output Data PIO_CODR 対応するピンをLOWにする。
Output Enable レジスタ PIO_OER I/Oラインの出力を有効にする。
PIO Enable レジスタ PIO_PER PIOを有効にする。

ソースコード

PIO_SetOutput()は、hardware/arduino/sam/system/libsam/source/pio.c に定義されています。以下に全ソースコードを示します。ソースコードのライセンスはこちら

extern void PIO_SetOutput( Pio* pPio, uint32_t dwMask, uint32_t dwDefaultValue,
                                      uint32_t dwMultiDriveEnable, uint32_t dwPullUpEnable )
{
    PIO_DisableInterrupt( pPio, dwMask ) ;
    PIO_PullUp( pPio, dwMask, dwPullUpEnable ) ;

    /* Enable multi-drive if necessary */
    if ( dwMultiDriveEnable )
    {
        pPio->PIO_MDER = dwMask ;
    }
    else
    {
        pPio->PIO_MDDR = dwMask ;
    }

    /* Set default value */
    if ( dwDefaultValue )
    {
        pPio->PIO_SODR = dwMask ;
    }
    else
    {
        pPio->PIO_CODR = dwMask ;
    }

    /* Configure pin(s) as output(s) */
    pPio->PIO_OER = dwMask ;
    pPio->PIO_PER = dwMask ;
}
extern void PIO_SetOutput( Pio* pPio, uint32_t dwMask, uint32_t dwDefaultValue,
                                      uint32_t dwMultiDriveEnable, uint32_t dwPullUpEnable )
{

引数は、ピンに対応したPIO(Parallel IO Controller)を示すPioへのポインタ型のpPio、ピンに対応するマスク(コントローラのどのビットでそのピンが制御されるかを示します)を示すconst uint32_t型のdwMask、ピンに出力する値を示すuint32_t型のdwDefaultValue、ピンをオープンドレインに設定するかどうかを示すuint32_t型のdwMultiDriveEnable、プルアップ抵抗を有効にするかを示すdwPullUpEnableの5つです。

    PIO_DisableInterrupt( pPio, dwMask ) ;
    PIO_PullUp( pPio, dwMask, dwPullUpEnable ) ;

PIO_DisableInterrupt()を呼び出して割り込みを禁止にします。その後、PIO_PullUp()を呼び出して、内蔵プルアップ抵抗の設定を行います。

    /* Enable multi-drive if necessary */
    if ( dwMultiDriveEnable )
    {
        pPio->PIO_MDER = dwMask ;
    }
    else
    {
        pPio->PIO_MDDR = dwMask ;
    }

dwMultiDriveEnableが0でない場合は、pPio->PIO_MDERにdwMaskを設定して、当該するピンをオープンドレインに設定します。そうでない場合は、pPio->PIO_MDDRにdwMaskを設定して、当該するピンのオープンドレインを無効にします。pPio->PIO_MDER、pPio->PIO_MDDRは32ビットのレジスタで、pPio->PIO_MDERのビットを1に設定すると設定したビットに対応するピンがオープンドレインになり、pPio->PIO_MDDRのビットを1に設定すると設定したビットに対応するピンのオープンドレインが無効になります。

pinMode()の延長で呼ばれるときのdwMultiDriveEnableの値は0です。

    /* Set default value */
    if ( dwDefaultValue )
    {
        pPio->PIO_SODR = dwMask ;
    }
    else
    {
        pPio->PIO_CODR = dwMask ;
    }

dwDefaultValueの値に応じて、pPio->PIO_SODRもしくはpPio->PIO_CODRにdwMaskを設定します。pPio->PIO_SODR、pPio->PIO_CODRは32ビットのレジスタで、pPio->PIO_SODRのビットを1に設定すると設定したビットがHIGHになり、pPio->PIO_CODRのビットを1に設定すると設定したビットに対応するピンがLOWになります。

pinMode()の延長で呼ばれるときのdwDefaultValueの値は1です。

    /* Configure pin(s) as output(s) */
    pPio->PIO_OER = dwMask ;
    pPio->PIO_PER = dwMask ;
}

最後に、pPio->PIO_OERとpPio->PIO_PERにdwMaskを設定して、指定したピンをI/Oラインの出力の有効化と指定したピンのGPIO(General Purpose I/O)を有効にします。

バージョン

Arduino 1.5



メニューを表示するためにJavaScriptを有効にしてください。

Arduinoで遊ぶページ
Copyright © 2013 garretlab all rights reserved.
inserted by FC2 system