PIC32MX Port

XC32コンパイラのライブラリを見てみると各ペリフェラルに対し

便利?なマクロが準備されている。

Port関係にも当然手厚く準備されている。ports.h参照。
ただ,レジスタで制御した方が明示的で分かりやす。気がするので,
ここではレジスタ制御での設定方法を記載しておく。
PIC32MX2xx 28-pin SPDIPに存在するI/Oは以下。
RAとRB系のPortが存在するが,途中歯抜けもあるので注意。
8bit連続して取れるI/Oがないのか・・・
ちなみに,パッケージ違いや,PIC32MX1xxでもアサインが異なるので注意。
RA0 2
RA1 3
RA2 9
RA3 10
RA4 12
RA7
RA8
RA9
RA10
RB0 4
RB1 5
RB2 6
RB3 7
RB4 11
RB5 14
RB6
RB7 16
RB8 17
RB9 18
RB10 21
RB11 22
RB12
RB13 24
RB14 25
RB15 26


Port Diagramは以下の構成。

Port Diagram
関係するレジスタは以下の通り。
TRISx ピンの入出力モード設定 1:Input 0:Output
LATx
ピンの出力用 1:High 0:Low
PORTx
ピンの入出力用 1:High 0:Low
ODCx
オープンドレイン設定 1:OpenDrain 1:CMOS
ANSELx Analog,Digital設定 1:Analog, 0:Digital
CNPUx プルアップ設定 1:ON 1:OFF
CNPDx プルダウン設定 1:ON 1:OFF

ex)
レジスタ制御と言いながら,bitアクセスのマクロは使っていますが・・・
PB14のPort情報でPB13を1/0切り替えを行う例。
PB14とPB15をショートするとPB13のLEDが点灯します。
    ANSELBbits.ANSB13 = 0;  // digital
    ANSELBbits.ANSB14 = 0;  // digital
    ANSELBbits.ANSB15 = 0;  // digital
    TRISBbits.TRISB13 = 0;  // output
    TRISBbits.TRISB14 = 1;  // input
    TRISBbits.TRISB15 = 0;  // output
    LATBbits.LATB15 = 1;    // high output
    CNPDBbits.CNPDB14 = 1;  // pull-down
    for(;;)
    {
        if(PORTBbits.RB14)
            LATBbits.LATB13 = 1;    // high output
        else
            LATBbits.LATB13 = 0;    // low output
    }


PIC32MXではペリフェラルのピンアサインを下記表に従って選択することができる。

ある程度自由にピンアサインを弄ることが可能。

ex) UARTのPinをRx=PORTB13,Tx=PORTB15に割り当ててみる。
U1RXR = 3; // uart rx = RPB13に割り当て

RPB15R = 1; // uart tx = RPB15に割り当て

コメント

タイトルとURLをコピーしました