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をコンパイルして入れてみたら、とりあえず、動いた。\(^^)/