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) {
// 割り込み待ち
}
}

