PIC32MX210F016BでLチカ

Lチカに一晩かけた電子工作初心者が朝7時に記事を書き始めるよ.

ハードウェア編
最初に回路をブレッドボード上に組む.最小構成についてはデータシートのFigure2-1:RECOMMENDED MINIMUM CONNECTIONに記載してあるため,これを配線する.クロックは16[MHz]のセラミック発振子を使用し,LEDは2番ピンのRA0を使用する.USB,DCジャック,USB-シリアル変換器はLチカでは使わないが今後のために配置しておく.なお,今回の電源はUSBのバスパワーを3.3[V]に降圧したものを使用する.配線については赤は5[V],黄色は3.3[V],白は0[V]のつもり.
配線を行うと以下のようになる.

ソフトウェア編
準備としてMPLAB,XC32,Harmonyのインストールを終えておく.
プロジェクトの作成を行う.Harmonyのプロジェクトとして作成する.

プロジェクトの名前や使用するデバイスを指定する.

Harmony Configuratorが立ち上がる.立ち上がらなかったら[Tools]->[Embedded]->[MPLAB Harmony Configurator]で起動.起動時はこのような画面となっている.

この画面では使用するライブラリ(USBやらCryptやら)を指定するが,今回は特に設定を行わない.
タブから[Clock Diagram]を選択しクロックの設定を行う.初期状態では以下のようになっている.

今回は16[MHz]のセラミック発振子を使用しているためPOSCを16[MHz],POSCMODをHSに設定する.
System PLLの点線枠内にあるAuto-Calculateを押し,無意味に最高動作周波数である40[MHz]に設定してみる.

ついでにUSBに供給するクロックも設定しておく.UPLLDIVをDIV_4にするとうまい具合にUSB Clockに48[MHz]が供給される.
設定が終わると以下のようになる.

次にピンの設定を行う.[Pin Diagram]タブを開く.

2番ピン(RA0)をGPIO_OUT,9,10番ピンをOSC1,2として設定する.

これでConfiguratorで行える設定は終了.コードを生成するため,カーソルを合わせると「Generate Code」と出る歯車っぽいマークをクリックする.

そのままGene…をクリックするとコードが生成される.
ソースコードについてはmain.cから辿っていけばapp.c内のAPP_Tasksに処理を記述すれば良いことがわかる.(余談だが,ctrlキーを押しながら関数名をクリックすると定義まで飛べる.便利)
今回のLチカは1秒程度待った後に点滅を繰り返すというパターンで行う.
点滅のため適当なdelay_ms関数を作成する.ループ内にNopのみを仕込んだ場合,Nop・増分・比較で3クロックほど使うはず.1[ms]は動作周波数SYS_CLK_FREQを1000で割り,それを3で割った回数ループすれば良いはず.というわけで以下のようになった.

ピンの点滅はSYS_PORTS_PinToggle関数を使用する.なお,SYS_PORTS_Toggle関数とは別物である.私はこれでハマってとてもつらかった.
APP_Tasks関数は以下のようになった.

動作は以下のようになった.だいぶ誤差はあるが,とりあえず点滅している.点滅の精度を上げたい場合はタイマを使用するのが良いかも.

現在9時過ぎ.疲れたのでそろそろ寝たい.次はUSBのキーボードでも動かしたい.
結局12時.調べてみるとUSBキーボードのデモだけで20[kB]はプログラムメモリを消費するらしく,PIC32MX210F016Bでは動かせないことがわかった.とりあえず秋月でPIC32MX270F256Bをポチった.次はソフトだけでも書いておこう.それが終われば先に基板設計してもいいし.やることはたくさんある.でも,いまはつかれたねむい
 
追記:あとから気づいたけどセラロックが16[MHz]だと思ったら4[MHz]だった.でも点滅は1秒ちょいだったし,もうよくわからん.