2014年12月16日

PIC32MX: 制限なしのMPIDE付属の無料GCCコンパイラのメモ 2014

PIC32MX: 制限なしのMPIDE付属の無料GCCコンパイラのメモ 2014
* はじまり
* MPIDE
* MPIDE ダウンロード
* ハック完了 (^^)/
* 結果内容
* MPLABXへの直接登録成功 (^^)/ うそでしょ?!
    登録方法:
    コンパイル・オプション設定方法
* と思ったが。。。(オイ
* なんとか出来た (^^)/
* 結果内容 (2)
* サンプル・プロジェクト
    ポイント:
    ダウンロード:
* Firewing: BASICコンパイラ

* はじまり
PIC32MX用の制限なし無料のコンパイラの話は以前書いて玉砕した。
で、
新たに見つけた全然別な以下の方法は予想を遙かに超える大成功状態で、(^^)/ (^^)/
となった。

* MPIDE
全く見落としていたけど、ChipKit用のIDE、
MPIDEに付属しているPIC32MX用のGCCが、サイズ制限なしで使えるらしい
ので調査してみる というメモ。
詳細はこれからだけど、
PinguinoのGCCに比べてのメリットは、
PLIB(注1)という今はObsolete(廃版)になってしまった、
Microchipが作ったペリフェラルライブラリが付属していること。
したがって、
PLIB使用のMPLABX用のプロジェクトが、
コマンドラインでコンパイルできて、mips16も有効で
サイズ制限もなく使えるかもしれないという話。

実際にやってみないとなんとも言えないけど。。。
つづく。。。

* MPIDE ダウンロード
ここから過去リリース分が全部取得できる
http://chipkit.s3.amazonaws.com/index.html
Official Release 20140821
http://chipkit.net/forum/viewtopic.php?f=20&t=3033 
上のバージョンはスタートアップのコード領域があふれてダメだった。orz

* ハック完了 (^^)/
mpide-0023-windows-20140316
http://chipkit.net/forum/viewtopic.php?t=2877
というバージョンを使った、
何だ、10分でできた (^^)/ (^^)/
もっと早くMPIDEのgccをチェックするべきだった。
orz

* 結果内容
(1) MPLABX上で作ったプロジェクトがそのまま使えます。(PLIBなら)
(2) サイズ最適化「-Os」オプション と 「-mips16」オプションが有効です。
(3) Microchipの周辺ライブラリPLIBや標準ライブラリ系(stdioとか)も「-mips16」版がリンクされます(4) コマンドラインでコンパイルします。
(5) ソース上で アトリビュート「__attribute__ ( (mips16) )」は不要です。
(6) コンパイル時のうっとうしいメッセージは出ません。(^^)/

* MPLABXへの直接登録成功 (^^)/ うそでしょ?!
上の使い方はコマンドラインで「make」していましたが、
試しに「mpide-0023-windows-20140316」版を MPLABX 2.20に登録してみました。
登録方法:
以下のBINフォルダを「C32」タイプで登録するだけです。
D:\mpide-0023-windows-2014316\hardware\pic32\compiler\pic32-tools\bin
MPLABXのメニューから 
Tools - Options - Embeddedで上記binフォルダをAddします。C32タイプです。
あとは普通にコンパイルオプションを設定します。
コンパイル・オプション設定方法
ここを参照。
PIC32: MPLAB(X)でmips16オプションを使うときのメモ 2013
http://mpu.seesaa.net/article/ 399685640.html
自分のプロジェクトはMPLABからコンバートしたので「-mips16」とかが
選択できました。新規にプロジェクト作るとアレかもしれない。
ではなくて、
「C32」タイプのコンパイラは「-mips16」系のオプション設定が有効な様です。

で、
大成功!!!!!!

こんなに簡単に最強版使えるなんて、もっと早く教えて欲しかった。 xD
(^^)/

* と思ったが。。。(オイ
実はコンパイルが成功しただけで、出来たHEXは動かない物でした。orz
ハハハ orz
原因は、リンカスクリプトとスタートアップコードがChipKit用のブートローダを使う様に
なっていることでした。
ひとまずブートローダなしで使いたいのだ。

* なんとか出来た (^^)/
できた。

* 結果内容 (2)
(1) MPLABX上で作ったプロジェクトがそのまま使えます。(PLIBなら)
    ただし、スタートアップコードとリンカスクリプトを専用の物に変更します。
(2) サイズ最適化「-Os」オプション と 「-mips16」オプションが有効です。
(3) Microchipの周辺ライブラリPLIBや標準ライブラリ系(stdioとか)も「-mips16」版がリンクされます。
(4) ソース上で アトリビュート「__attribute__ ( (mips16) )」は不要です。
(5) コンパイル時のうっとうしいメッセージは出ません。(^^)/

* サンプル・プロジェクト
ポイント:
コンパイラは制限なしの以下の版のみ使用可能です。
http://chipkit.s3.amazonaws.com/builds/mpide-0023-windows-20140316.zip
( http://chipkit.s3.amazonaws.com/index.html )
試してませんがLinuxやMacでも動くと思います。

制限ありのコンパイラ「C32 v2.02」にそのまま切り換えて使うことができます。
(警告がでますが)
XC32系はエラーが出て使えません。orz
ダウンロード:
led-mpide-mplabx-2014-12-21.7z
PIC32MX220F032B用です。48MHzで動作します。
マイコンを変えたらリンカスクリプトの修正も必要です。
PLIB関数を使って、Timer割込みや、UART, millis(), delay_ms()を作ってLEDチカチカするデモです。
ChaNさんのxprintf()を使ってUARTに「Hello !」表示出してます。
内容:
irukaさんの以下のホームページで
PIC32MX
hp.vector.co.jp/authors/VA000177/html/PIC32MX.html
「pled.zip」の中のリンカスクリプトとスタートアップコードを
少し改変して使用させていただきました。
書込みは付属のpic32prog.exeを使ってPickit2で書いてます。
Pickit3で書けるかどうか未確認です。
MPLAB X v2.20 上でPickit3での書込み、デバッグができました。(^^)/

* 実験配線図
内蔵発振器で動かします。

pic32mx220f032b-basic.png

サンプルコード:
以下の黄色い行はおまじないで必要です。取れれば取りたいけど。
PLIBを使ってLED1をチカチカしながら、UART1にメッセージを出し続けるデモです。
UART: 115200bps
Pin6 = RX
Pin7 = TX
/******************************************************************************/
/*  Files to Include                                                          */
/******************************************************************************/
#include "sys.h"         /* system definition                        */
#include "uart.h"
#include "xprintf.h"

//*    This sets the MPIDE version number in the image header as defined in the linker script
const uint32_t __attribute__((section(".mpide_version"))) _verMPIDE_Stub = 0x01000309;    // assigns the build number in the header section in the image

/* 
   Config settings
   Main clock = 8MHz /2 * 24 /2   = 48MHz
   Peripheral clock = 48MHz /1    = 48MHz

   Configuration Bit settings
   SYSCLK = 48 MHz (8MHz / FPLLIDIV * FPLLMUL / FPLLODIV)
   PBCLK  = 48 MHz
   WDT OFF
   Other options are don't care
   */
#pragma config UPLLEN    = ON            // USB PLL Enabled
#pragma config FPLLMUL   = MUL_24        // PLL Multiplier
#pragma config UPLLIDIV  = DIV_2         // USB PLL Input Divider
#pragma config FPLLIDIV  = DIV_2         // PLL Input Divider
#pragma config FPLLODIV  = DIV_2         // PLL Output Divider
#pragma config FPBDIV    = DIV_1         // Peripheral Clock divisor
#pragma config FWDTEN    = OFF           // Watchdog Timer
#pragma config WDTPS     = PS1           // Watchdog Timer Postscale
#pragma config FCKSM     = CSDCMD        // Clock Switching & Fail Safe Clock Monitor
#pragma config OSCIOFNC  = OFF           // CLKO Enable
#pragma config POSCMOD   = HS            // Primary Oscillator
#pragma config IESO      = OFF           // Internal/External Switch-over
#pragma config FSOSCEN   = OFF           // Secondary Oscillator Enable (KLO was off)
#pragma config FNOSC    = FRCPLL         // Internal RC with PLL
//#pragma config FNOSC = PRIPL           // Ext OSC
#pragma config CP        = OFF           // Code Protect
#pragma config BWP       = OFF           // Boot Flash Write Protect
#pragma config PWP       = OFF           // Program Flash Write Protect
#pragma config ICESEL    = ICS_PGx1      // ICE/ICD Comm Channel Select
#pragma config DEBUG     = OFF           // Background Debugger Enable
#pragma config JTAGEN    = OFF           // JTAG Disabled
#pragma config FUSBIDIO  = OFF
#pragma config FVBUSONIO = OFF
#pragma config PMDL1WAY  = OFF
#pragma config IOL1WAY   = OFF

/******************************************************************************/
/* Macro Declaration                                                */
/******************************************************************************/
#define SYS_FREQ            FOSC
#define PB_DIV              1
#define PRESCALE            256
#define TOGGLES_PER_SEC     1000   /* 1msec Tick count */
#define T1_TICK             (SYS_FREQ/PB_DIV/PRESCALE/TOGGLES_PER_SEC)

#define LED1                BIT_15

/******************************************************************************/
/* Global Variable Declaration                                                */
/******************************************************************************/
volatile uint32_t ticks ;

/******************************************************************************/
/* millis()                                                                   */
/******************************************************************************/
uint32_t millis(void){
    return ticks;
}

/******************************************************************************/
/* Timer1 Interrupt                                                           */
/******************************************************************************/
void __ISR(_TIMER_1_VECTOR, ipl2) Timer1Handler(void)
{
    // clear the interrupt flag
    mT1ClearIntFlag();
    ticks++;
}

/******************************************************************************/
/* delay_ms()                                                                 */
/******************************************************************************/
void delay_ms(uint32_t ms ){
    uint32_t prev = millis();
    while( ( millis() - prev) < ms ){
        /* just wait */
    }
}

void timer_init(void){
    /* Timer1 init */
    OpenTimer1(T1_ON | T1_SOURCE_INT | T1_PS_1_256, T1_TICK);
    /* set up the timer interrupt with a priority of 2 */
    ConfigIntTimer1(T1_INT_ON | T1_INT_PRIOR_2);
}

/******************************************************************************/
/* Main Program                                                               */
/******************************************************************************/
int32_t main(void)
{
    uint32_t count = 0;
    /*
       SYS_CFG_WAIT_STATES (configures flash wait states from system clock)
       SYS_CFG_PB_BUS (configures the PB bus from the system clock)
       SYS_CFG_PCACHE (configures the pCache if used)
       SYS_CFG_ALL (configures the flash wait states, PB bus, and pCache)
       SYSTEMConfig(SYS_FREQ, SYS_CFG_ALL);
       SYSTEMConfigPerformance(SYS_FREQ);
       */
    SYSTEMConfig(SYS_FREQ, SYS_CFG_WAIT_STATES |  SYS_CFG_PCACHE);
    ANSELA = 0x0000;
    ANSELB = 0x0000;
    INTConfigureSystem(INT_SYSTEM_CONFIG_MULT_VECTOR);
    /* enable multi-vector interrupts */
    INTEnableSystemMultiVectoredInt();
    
    uart_init( UART1, 115200 );
    timer_init();

    /* Init LED port */
    mPORTBSetPinsDigitalOut( LED1 );
    mPORTBClearBits( LED1 );

    /* LED blinker */
    delay_ms( 500 );
    while(1) {
        delay_ms( 500 );
        mPORTBToggleBits( LED1 );
        xprintf("\n Hello !  0x%04X", count++);
    }
}
   
UART出力: pic32-mpide-gcc-uart-terminal.png * Firewing: BASICコンパイラ 直接関係ないものの、:D 上と同じ事をPIC用のBASIC言語コンパイラ、Firewingでやると こんな感じになる。 http://mpu.seesaa.net/article/410490627.html#toc_pic32_led_blink 簡単! (^^)/ (注1)PLIBの替りに今は「Harmony」になっている。
posted by Copyright (C) avrin All Rights Reserved. at 00:00| Comment(7) | PIC32MX | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
いつも興味深く、見させて頂いています。

ダウンロード先
*.7z

がダウンロード出来ないのですが、確認をよろしくお願いします。
Posted by みのすけ at 2014年12月20日 14:03
PICKit3ついに買いましたよ。
MPLAB IPEからちゃんとHEX焼けました。
レポート上げときます。

http://hp.vector.co.jp/authors/VA000177/html/PicKit3.html

これまでに買ったライターは秋月AKI-PICライター ---> mod-chip焼き用
作った奴はChaNさんのAVR-SP(シリアルポート接続),hidspxぐらいだった

でも今回はついにMICROCHIP純正品を買ってしまった。
これでPIC16F84も正式に焼けるようになった。でも今さら16F84で作るものがない。

Posted by iruka at 2014年12月20日 22:01
irukaさん こんにちわ。
うちも昨日Pickit3が届きました。(^^)/
>> レポート上げときます。
参考になります。

PIC32MXのリンカスクリプトに慣れていないので、
書き方を勉強しないと難しい感じです。
特に物理アドレスと仮想アドレスの部分。
しばらくは、既存のもののコピペで切り抜けます。(^^;
Posted by audin at 2014年12月21日 11:15
みのすけさん こんにちわ。
今、ブログの見た目が期待通りにならないので
それを直してからアップする予定です。
今日中くらいでしょうか。(^^;
Posted by audin at 2014年12月21日 11:17
プロジェクトをアップしました。
Posted by audin at 2014年12月21日 14:15
audinさん、早速、DLして試してみました。

mips16 の指定、Optimizeの指定がきちんと出来ます。
実際に上記、回路を作り、正しく動作する事も確認しました。

PIC32MX250F128B でも試して見たら、こちらも動作しました。

ありがとうございました。
Posted by みのすけ at 2014年12月22日 17:44
みのすけさん
レポートありがとうございます、
うちもこれからPIC32MX250F128Bでやってみようと思います。
Posted by audin at 2014年12月23日 10:59
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。