PIC32MX220 (200円のMIPS CPU)を使う | たけおか ぼちぼち日記

たけおか ぼちぼち日記

思いついたらメモ

秋月で210円で売られている 1チップ・マイコン PIC32MX220 は、MIPSコアだ。
MIPSアーキテクチャは、筋がいい。
(Carry Flagが無い、とか、いう不満はあるが)

210円の1チップ・マイコンには、MMUは無い。
したがって、BSDは動かない。
(2012/JUN/22 追記: RetroBSD というのが、メモリ多めのPIC32で動くです~)
(2012/JUL/28 追記: 5900円のPIC32ボードでRetroBSDを動かしました RetroBSD on PIC32マイコン )
uCLinuxのことを私に言うのは、もう止めてください。(Linuxは、MMUのあるCPUで使え)

(2012/AUG/08追記: PIC32MX220のUSBもちゃんと動きました )

でも、MIPSはいいよね~
私は、1チップ・マイコンで遊ぶ用事がほとんどないが、
MIPSは、やらなければ。

PIC32MX220は、ROM:32K Bytes, RAM:8K Bytes を内蔵。
クロック周波数は40MHzで、1.56 DhrystoneMIPS。
VAX11/780(1985年頃のBSD標準機,大型ミニコン)の1.5倍も速いじゃないか。

たけおか ぼちぼち日記-基板



ハードウェア作りました。
しかし、reset(MCLR)をプルアップする抵抗は、10kΩ以下でなければならないらしい。(47kΩを付けてしまった)
resetは、一応、掛かっているから、まぁ、いいか…
クロックは、PIC32MX220に内蔵の内部の発振回路を使用。
(内蔵USB I/Fを使うときは、外部にXTALをつなぐべきであろう)
回路図は、下図。
たけおか ぼちぼち日記-回路図

今回の回路は、USB-シリアル変換チップFT232RLを搭載した、
秋月の「AE-UM232R」を使用している。

FT232RL(AE-UM232R)は、USBから電源を貰って3.3Vを作って外部に供給できる。
今回の回路は、AE-UM232Rから3.3V電源をもらう。

LEDを光らせるだけなら、AE-UM232Rは不要である。
その場合は、PICkit3から電源を供給すると便利である。
(FT232RLから電源を貰う時は、PICkit3からの電源供給は止める)




PICプログラマは、PICkit3 を購入。
(これまで、PICライタは、秋月のキットを使っていたが)

開発環境は、MPLABX を、Ubuntu 64bitで使用。

MPLabXをインストールする日記


このMPLABXは、普通に PICkit3 を使用できた。




PICkit3 からの電源供給の設定

Linux版 Mplabxで、電源供給の設定の方法。

メニューで 「File」 -> 「Project Properties」 を選択。
図のようなダイアログが開く。
Categories で 「PICkit3」 を選択。
赤で囲んだ部分をクリックして、「Power」を選択する。
「Power target circuit from PICkit3」をチェックすると、電源供給。
「Voltage Level」で、電圧を設定。

たけおか ぼちぼち日記-電源設定


今回は、LEDのみの点灯実験では、PICkit3から3.25V を供給した。
FT232RLをつないだ時は、PICkit3からの電源供給はしない。
電源がぶつかると、ダメージが出る可能性が高いので、よく注意する。



テスト・プログラム。
初めてのハードウェアを相手にするとき、ハードウェアの初期化がうまくできているか、ドキドキする。
わたしは、ハンダ付けがヘタなので、ハードウェアが悪いか、ソフトウェアが悪いか、特定できず、精神衛生に悪い。

今回、ググったところ、ほとんどの人は、クロックは、外部にXTALを付けている。
こちらは、内蔵発信器である。初期化の設定が違うので、困る。
でも、うまくいった。

テスト・プログラムは、極めて適当かつ、コピペである。

テスト・プログラム

/*
* File: main.c
* Author: take
*
* Created on 2012/06/13, 0:57
*/

// DEVCFG3:
#pragma config IOL1WAY = OFF // Peripheral Pin Select Configuration
// DEVCFG2:

//#pragma config FPLLODIV = DIV_1 // PLL Output Divider, FULL Speed 2014/FEB10 変更
#pragma config FPLLODIV = DIV_2 // PLL Output Divider 1/2 speed 2014/FEB10 変更

#pragma config UPLLEN = OFF // USB PLL Enabled
#pragma config UPLLIDIV = DIV_2 // USB PLL Input Divider
#pragma config FPLLMUL = MUL_20 // PLL Multiplier
#pragma config FPLLIDIV = DIV_2 // PLL Input Divider
// DEVCFG1:
#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 FPBDIV = DIV_1 // Peripheral Clock divisor
#pragma config OSCIOFNC = OFF // CLKO Enable
#pragma config POSCMOD = OFF // Primary Oscillator
#pragma config IESO = OFF // Internal/External Switch-over
#pragma config FSOSCEN = OFF // Secondary Oscillator Enable (KLO was off)
#pragma config FNOSC = FRCPLL // Oscillator Selection
// DEVCFG0:
#pragma config CP = OFF // Code Protect
#pragma config BWP = ON // Boot Flash Write Protect
#pragma config PWP = OFF // Program Flash Write Protect
#pragma config ICESEL = ICS_PGx3 // ICE/ICD Comm Channel Select
#pragma config JTAGEN = OFF // JTAG Enable
#pragma config DEBUG = OFF // Background Debugger Enable

#define SYSCLK 80000000L


#include <stdio.h>
#include <stdlib.h>

#include <p32xxxx.h>
#include <plib.h>


int main(int argc, char** argv)
{
SYSTEMConfigPerformance( SYSCLK );

mPORTBDirection(0); /* LED */

uart1Init();

led();

return (EXIT_SUCCESS);
}

void
uart1Init()
{
// Create a UART TX/RX Pin
SYSKEY = 0xAA996655; // Write Key1 to SYSKEY
SYSKEY = 0x556699AA; // Write Key2 to SYSKEY

//All Pin configurations should start here

RPB4Rbits.RPB4R=1; //Sets RPB4 as U1TX. (pin 11)
U1RXRbits.U1RXR=2; //Sets RPA4 as U1RX. (pin 12)

//All Pin configuration should end here

SYSKEY = 0; // Locks the pin Configurations

//End UART TX/RX Pin

//Initilize UART1
// int PB_CLOCK=20000000;
int PB_CLOCK=80000000L;
int BAUD=9600;

OpenUART1(UART_EN|UART_BRGH_FOUR,
UART_RX_ENABLE | UART_TX_ENABLE,
PB_CLOCK / (4 * BAUD) - 1);
//END UART1 Initialization
}

led()
{int i,n,c;
char sss[50];
for(;;){
for(i=0;i<3000000;i++)
;
mPORTBToggleBits(BIT_7);
mPORTBToggleBits(BIT_8);

putcUART1('*');
while(U1STAbits.URXDA){
c= getcUART1();
putcUART1(c);
}
}
}


(2014/FEB10: これまで公開していたものは、クロックが、80MHzになっていたようだ。それでも、PIC32の6個に1つの個体は動作していた。上記、ソース中のクロックの分周を 1/2 にして、40MHzに。)

上記のプログラムは、LEDをチカチカさせる。
そのwaitが外れたとき、UARTへ「*」を出力しつつ、
UART入力を見て、文字があれば、それをUARTへエコーバックする。
waitループから出たときしか、UARTのチェックをしないので、
極めてほのぼのした動作である。

UARTの通信速度は、9600bps。


手持ちのTiny BASICをコンパイルして入れてみたら、とりあえず、動いた。\(^^)/