PIC32MX370F512Hのサンプルプログラム(タイマー割り込みを使ったLチカ)  投稿者:ケンケン  投稿日:2017年 9月 9日(土)14時10分16秒 NE0356lan1.rev.em-net.ne.jp 返信・引用 編集済
  (2017.9.17 プリフェッチは有効でしたが、キャッシュが有効になっていなかったのでソースを更新しました。)

PIC32MX370F512Hがついに秋月電子で取り扱い開始になりました!

■チップ単体
http://akizukidenshi.com/catalog/g/gI-12284/

■基板に実装したもの
http://akizukidenshi.com/catalog/g/gM-12417/

PIC32の最新のコンパイラに対応した解説書がほとんど出ていない現状、興味はあるけれど
最初の一歩が踏み出せない人がとても多いと思います。
あるいは買ってみたけれど、基本的なところで引っ掛かって性能が十分に出せていない人も
いると思います。

そこで、ひな形となるサンプルプログラムを用意しました。

内蔵クロックによる最大の96MHz動作、プリフェッチキャッシュを有効化し、タイマー
割り込みを使ってRB0につながれたLEDを1秒間隔で点滅させるというものです。

コンパイラはXC32 v1.42で動作確認しています。
以前のバージョンでサポートされていた周辺ライブラリ(PLIB)は使用していません。

■回路製作上の注意点(最低限の必要事項)
・VDD、VSSの端子は省略せずに全て電源/GNDに接続する
・AVDD、AVSSの端子も必ず電源/GNDに接続する
・MCLRは10KΩで電源にプルアップ
・各電源端子間(9と10、19と20、25と26、38と41)にパスコンとして0.1μFのセラミック
コンデンサを接続。57番ピン(VDD)とGND間もパスコンを接続
・VCAP(56番ピン)には10μFのセラミックコンデンサを通してGNDに接続
・PICkit3等によるICSP書き込みはMCLRとPGECx、PGEDxを使用
(xは1~3のどれでもOK、13番~18番ピンあたりに集まってる)

以下、サンプルプログラムのソースです。
MPLAB Xで新規プロジェクトを作成し、このソース1つ追加するだけでビルド可能です。

--------------------------------------------------------------

// タイマー割り込みによるLチカ for PIC32MX370F512H
// 内蔵クロック 96MHzで動作、周辺クロック:システムクロック = 1:1

// DEVCFG3
#pragma config FSRSSEL = PRIORITY_7     // Shadow Register Set Priority Select (SRS Priority 7)
#pragma config PMDL1WAY = OFF           // Peripheral Module Disable Configuration (Allow multiple reconfigurations)
#pragma config IOL1WAY = OFF            // Peripheral Pin Select Configuration (Allow multiple reconfigurations)

// DEVCFG2
#pragma config FPLLIDIV = DIV_2         // PLL Input Divider (2x Divider)
#pragma config FPLLMUL = MUL_24         // PLL Multiplier (24x Multiplier)
#pragma config FPLLODIV = DIV_1         // System PLL Output Clock Divider (PLL Divide by 1)

// DEVCFG1
#pragma config FNOSC = FRCPLL           // Oscillator Selection Bits (Fast RC Osc with PLL)
#pragma config FSOSCEN = OFF            // Secondary Oscillator Enable (Disabled)
#pragma config IESO = OFF               // Internal/External Switch Over (Disabled)
#pragma config POSCMOD = OFF            // Primary Oscillator Configuration (Primary osc disabled)
#pragma config OSCIOFNC = OFF           // CLKO Output Signal Active on the OSCO Pin (Disabled)
#pragma config FPBDIV = DIV_1           // Peripheral Clock Divisor (Pb_Clk is Sys_Clk/1)
#pragma config FCKSM = CSDCMD           // Clock Switching and Monitor Selection (Clock Switch Disable, FSCM Disabled)
#pragma config WDTPS = PS1048576        // Watchdog Timer Postscaler (1:1048576)
#pragma config WINDIS = OFF             // Watchdog Timer Window Enable (Watchdog Timer is in Non-Window Mode)
#pragma config FWDTEN = OFF             // Watchdog Timer Enable (WDT Disabled (SWDTEN Bit Controls))
#pragma config FWDTWINSZ = WINSZ_25     // Watchdog Timer Window Size (Window Size is 25%)

// DEVCFG0
#pragma config DEBUG = OFF              // Background Debugger Enable (Debugger is Disabled)
#pragma config JTAGEN = OFF             // JTAG Enable (JTAG Disabled)
#pragma config ICESEL = ICS_PGx1        // ICE/ICD Comm Channel Select (Communicate on PGEC1/PGED1)
#pragma config PWP = OFF                // Program Flash Write Protect (Disable)
#pragma config BWP = OFF                // Boot Flash Write Protect bit (Protection Disabled)
#pragma config CP = OFF                 // Code Protect (Protection Disabled)

#include 
#include 

int counter=0;

// タイマー2割り込み処理ルーチン
void __ISR(_TIMER_2_VECTOR, IPL4AUTO) T2Interrupt(void) {
    counter++;
    if (counter == 10) {
        LATBINV = 1; // Toggle LED (RB0を反転)
        counter = 0;
    }
    IFS0bits.T2IF = 0; // Reset interrupt flag
}

int main(void) {
    // Data Memory SRAM wait states: Default Setting = 1; set it to 0
    BMXCONbits.BMXWSDRM = 0; // SRAMのウェイトステートを0にする

    // Flash PM Wait States: MX Flash runs at 3 wait states @ 100 MHz
    CHECONbits.PFMWS = 3; // フラッシュのウェイトステートを3にする(100MHz動作時)

    __builtin_mtc0(16, 0, (__builtin_mfc0(16, 0) & 0xfffffff8 | 3)); // キャッシュ有効化

    // Prefetch-cache: Enable prefetch for cacheable PFM instructions
    CHECONbits.PREFEN = 1; //プリフェッチ有効化

    // Set the interrupt controller for multi-vector mode
    INTCONSET = _INTCON_MVEC_MASK; //割り込みをマルチベクタモードに設定

    // Set the CP0 Status IE bit to turn on interrupts globally
    __builtin_enable_interrupts(); //割り込み有効化

    // ピンの入出力設定(全て出力)
    TRISB = 0;
    TRISC = 0;
    TRISD = 0;
    TRISE = 0;
    TRISF = 0;
    TRISG = 0;

    //タイマー2割り込み設定
    T2CON = 0x70; // prescale 1:256, 16bit mode
    PR2 = 37500; // 100ms (96MHz/256*0.1)
    TMR2 = 0; // clear Timer 2 counter

    IPC2bits.T2IP = 4; // T2割り込み優先度4に設定
    IFS0bits.T2IF = 0; // T2割り込みフラグをクリア
    IEC0bits.T2IE = 1; // T2割り込み有効化

    T2CONbits.TON = 1; // タイマー2開始

    while (1) {
        // 割り込み待ち
    }
}