PIC32の使い方①(Lチカ)
PIC32はPICマイコンの中でもハイエンドモデルに位置付けられている32bitマイコンです.今回はその中でも
PIC32MK0512MCF064
というマイコンを使えるようになっていきたいと思い,その開発記録として記事に残します.”MC”と名前にある通り,このマイコンはモーター制御を想定した仕様になっており,多くの相補PWM出力ペアと6つのQEIと呼ばれる直交エンコーダインターフェースが備わっています.最終的にこのマイコンで4つ以上のモータードライバ(BLDC,DC切り替え可能)を搭載したロボットのマザーボードとなる基板を製作することを目標とします.①の本記事ではLチカまでやっていきます.開発と同時に記事にしているため,間違いなどあれば指摘していただきたく思います.
開発環境を整える
PICマイコンはその種類によらずMPLAB Xというソフトで開発できます.そして対応するコンパイラというものをインストールすることで,各デバイスに対応したプログラムを書くことが出来るようになります.この時,MCCまたはMHCを使用し設定を,MPLAB Harmonyというライブラリを使用しプログラムを書きます.最後にPICKIT4を使用しPICに書き込みます.
ということで,まずは以下のものを準備していきます.
- MPLAB X(開発環境)
- XC32コンパイラ(プログラムを各デバイスに対応する機械語に翻訳)
- MCCとHMC(初期設定がグラフィカルに行える)
- MPLAB Harmony(様々な機能が使えるライブラリ)
- PICKIT4(書き込み機)
開発環境のインストール
Microchip公式ホームページより最新版をインストールします.
www.microchip.com一番下のDownloadsより自分のOSに合わせてダウンロードし実行します.Nextだけ選択していればOKです.インストールが完了したら,XC32,MPLAB Harmony,MCCのリンクが勝手に開かれます.
www.microchip.comMCC以外を順番にインストールしていきます.先ほどと同じように,一番下のDownloadsからダウンロード,実行するだけです.Harmonyは時間が結構かかります.
MPLAB X IDE v5.15,
XC32/32++ compiler v2.15,
MPLAB Harmony Integrated Software Framework v2.06,
以上のバージョンをインストールしました.以降これらの環境を想定し進めていきます.MCCは,MPLAB Xを起動し,Tools→Plugins→Available Pluginsを開き,一覧よりMPLAB Code Configurator(MCC)にチェックを入れInstallでインストールできます.
また,今回はMPLAB Harmonyを使用するので,同時にMPLAB Harmony Configurator(MHC)もインストールしてください.分かりにくい場合はこちらの動画を参考にして下さい.
www.youtube.comインストールした機能はMPLAB Xの再起動後に有効になります.再起動後,ツールバーにMCCのロゴがあればインストールは完了です.
いるものを揃える
購入するものは主にPICマイコンとPICKIT,および回路制作に必要なものと工具です.
PICKITは本記事では純正品PICKIT4を使用しますが,設定でPICKIT4と選択する場面でPICKIT3などに読み替えてもらえればPICKIT3などでもかまいません.おすすめはしませんが,安価な非正規品も存在し,その多くは問題なく使えます.
工具は半田付けセット,配線が出来るもの(基板やブレッドボード類など)が必要です.ピンヘッダなどで配線や実装する場合には以下のような変換基板が必要です.
MPLAB Harmonyを使ったプロジェクトの作成
作業スペースを作っていきます.
File → New Projectを選択し,以下のとおりに進めていきます.
- MPLAB Harmonyを使用した作業スペースを選択
-
Launch Framework Downloaderを選択(初回のみ)
-
Create Folderを選択.Kinariは僕の名前ですが,各自のユーザー名になっていると思います.このPathにインストールされますので,次回からは2.でのFramework Pathにこのパスを打ち込めば,Launch Framework Downloaderの必要はありません.
-
Test Connectionを選択し,二枚目のチェックマークが表示されたらNextで進みます.インターネット接続が必要になります.
- Dowmload Catalogは写真を撮り損ねましたが,特に操作はないはずです.Dowmload PackageはAccept All Licensesで次へ進み,Nextを選択します.
- Package Configrationも指示通り進めばFramework Selectinの設定はは終わりです.次に進みプロジェクトの名前を指定します.
-
そしてPICの種類を指定しFinishです.写真ばかりで長く感じますが,実際は指示通り入力するだけですぐ終わります.
-
このような警告が表示されますが,今回使用するのはMCCではなくMHCなので無視します.この警告はMCCがPIC32MKをサポートしていないため出現します.MPLAB HarmonyはPIC32用ですが,MCCはPIC32に限らず使用できるため今後のために入れました.
-
ひとまず作業スペース完成です.
MHCの開始
まずは開いてみます.
こんな感じです.3枚目の時に右を選択すればMPLAB内のWindowとしても開ける...のかな?お好きなほうをどうぞ.
MHCでconfig設定
configとはマイコンの初期設定みたいなもので,面倒なので慣れるまでは気にしないことをお勧めします.PICを触ったことがある方ならばおなじみのconfig自動生成機能をMHCで使ってみます.右側のConfiguration Optionsから選択して行くだけですが,メモとしてそれぞれのconfigの意味をまとめておきます.また,データシートではp.585のSPECIAL FEATURESに記載されてます.
DEVCFG3
- USERID:好きな名前(ID).書き込み時などに接続確認で表示されるだけ.
- PWMLOCK:PWM IOCONxへの書き込みに制限.
- FUSBIDIO2:USB OTG(On The Go)のIDピンの有効,無効設定.OTGはパソコン抜きでUSB通信できるよう追加された機能.
- FVBUSIO2:USBのVbus機能の有効,無効設定.VbusはPICの電源とは別にUSBから電源供給を受けることが出来るピン.
- PGL1WAY:PGレジスタへの設定回数の制限.4.3 Permission Access and System Bus Registers (p.75)参照.
- PMDL1WAY:PMDレジスタへの設定回数の制限.32.4 Peripheral Module Disable (p.578) 参照.
- IOL1WAY:PPSレジスタへの設定回数の制限.13.3 Peripheral Pin Select (PPS) (p.239)参照.
- FUSBIDIO1:FUSBIDIO2と同様.別チャンネル.
- FVBUSIO1:FVBUSIO2と同様.別チャンネル.
DEVCFG2
FIGURE 9-1:PIC32MK GP/MC FAMILY OSCILLATOR DIAGRAM (p.162) 参照.ちなみにこのややこしいクロック関係のConfigurationはGUIで設定できます(後述).
- FPLLDIV: クロック周波数をこの値で割る.
- FPLLRNG:PLLで割られた後のクロック入力の範囲.
- FPLLICLK:内部高速RCクロック(FRC)か外部クロック(Posc)か選択.
- FPLLMULT:クロック周波数をこの値でかける.PLLの逆.
- FPLLODIV:クロック周波数をこの値で割る.
- VBATBOREN:VBATモード時のZPブラウンアウト有効,無効設定.
- DSBOREN:Deep Sleepモード時のブラウンアウト有効,無効設定.
- DSWDTPS:Deep Sleepモード時のウォッチドッグタイマのポストスケーラ値.DSWDTのプリスケーラ値は32.
- DSWDTOSC:DSWDTのクロック入力選択.
- DSWDTEN:DSWDT有効,無効設定.
- FDSEN:Deep Sleepモード有効,無効設定.
- BORSEL:ブラウンアウトのリセット電圧.
- UPLLEN:USB PLLの有効,無効設定.
DEVCFG1
- FNOSC:クロック源を選択.
- DMTINV:デッドマンタイマーのカウント値.
- FSOSCEN:セカンダリオシレータ(RTC用のクロック源など)の有効,無効設定.
- IESO:外部クロックと内部クロックの切り替えの有効,無効設定.有効にすると外部クロックの発振が安定するまで内部クロックを用いて二段階で起動することが出来る.
- POSCMOD:プライマリオシレータのクロック源の種類を選択.
- OSCIOFNC:同期用クロック出力の有効,無効設定.
- FCKSM:クロックスイッチングの有効,無効設定.命令実行中にシステムクロック源を切り替えることが出来る。
- WDTPS:WDTプリスケール値設定.
- WDTSPGM:フラッシュプログラミング中のWDT停止,続行の選択.
- FWDTWIN:WDTのウィンドウサイズ設定.WDT参考:車載用リセット機能付きウォッチドッグタイマ「S-19400/19401シリーズ」を発売 ~ウィンドウモード/タイムアウトモード選択可能、業界トップクラスの超低消費電流3.8μA~ | セイコーインスツル株式会社.
- DMTCNT:デッドマンタイマのカウント値選択.
- FDMTEN:DMTの有効,無効設定.
DMTとWDTについてはこちらを参照.
DEVCFG0
- DEBUG:バックグラウンドデバッガの有効,無効設定.参考:
- JTAGEN:JTAGの有効,無効設定.参考:
- ICESEL:インサーキットエミュレータ・デバッガのチャンネル設定.ICSP書き込みはどちらからでも可能.
- TRCEN:CPUトレースの有効,無効設定.
- BOOTISA:Boot ISAのコード設定.
- FSLEEP:FlashのSleepモード時の動作設定.
- DBGPER:デバッグモード時のCPUへのアクセス許可設定.
- SMCLR:MCLRピンが生成するのがパワーオンリセットか通常のリセットかを選択.
- SOSCBOOST:セカンダリオシレータのブーストキックスタートの有効,無効設定.
- POSCGAIN:プライマリオシレータのゲイン選択.参考:6.5.1 プライマリオシレータのモード選択.
- POSCBOOST:プライマリオシレータのブーストキックスタートの有効,無効設定.
- EJTAGBEN:EJTAGの動作設定.
設定の一例
右側のConfiguration Optionsから選択して行きます.また,DEVCFG1,2のクロックに関する設定はMHCのGUIで設定してみます.Tools → Clock Configrationより,Clock DiagramというWindowが開かれ,各項目が分かりやすく設定できるようになります.各設定はConfiguration Optionsの項目と連動しています.まずはこんな感じ日てみましたが,動作確認はまだです.
MHCでDMA設定
Tools → DMA Configrationより,DMA SettingというWindowで有効か無効か,また各チャンネルをどの周辺モジュールに割り当てるかを設定します.
参考:こちら
使ったことないのでとりあえずパス.
MHCでEVIC設定
Tools → EVIC Configrationより,EVIC SettingというWindowで有効か無効か,また各設定が出来ます.この設定についてもわからないのでパスですが,多分割り込みの優先度的なあれだと思います.
MHCでIO設定
Tools → Pin Configrationより,Pin SettingというWindowで入力か出力か,また各設定が出来ます.左下のPin Diagram,Pin Tableからも機能の割り振り(PPS)が出来ます.まずは使い方を知りたいので,1ピンを出力に設定してみます.Pin Settingで以下のように設定しました.2ピンがデフォです.
設定を出力
以上の設定を出力します.左上のツールバーより
を選択し以下のように進めていきます.
Save asで保存しておきます.
完了するとこのようにいっぱいファイルが出来上がっています.確認のためClean&Buildしておきます.
正常ですね.ちなみに,プログラムを編集した後にもう一度MHCで設定を変更し出力しようとすると,差分が表示されコードの変更の許可,不許可が選択できます.自作関数など,MHCの変更の範囲外の場合(MHCで生成される関数外)は保持されることを確認しました.プログラム中に設定を変更するときでも安心ですね.
Lチカ
akizukidenshi.com初めにも紹介しましたが,この変換基板にPICをはんだ付けしてブレッドボード上で配線します.今回は先ほど出力ピンに指定したRA7(1番ピン)にLEDを接続し光らせるLチカを目標としますので,配線は主に電源,書き込みピン,RA7の出力ピンのみです.以降機能を付け加えるときも,変更がなければ電源と書き込み部分は共通で使えます.また,ICSP用のピンは3グループありますが,どこからでも書き込めます.
https://github.com/Bison0522/Blog/raw/master/Circuit1_32mk.png
先ほどのプログラムをLチカのために書き換えます.具体的には出力ピンの出力を1にする命令を書き加えます.1行です.
ピン操作はLAT,PORTを使用していましたが,関数になってまとめられています.変数を用いて操作できるので便利です.この関数は”plib_gpio.h”にまとめられています.
今回は次の1行を"main.c"のmain関数内のwhile(true)ループ内に追記します.
GPIO_PinWrite(GPIO_PIN_RA7, 1);
写真にスイッチが2つあるのはリセットスイッチと入力ピンです.今回は入力は使用しないので気にしないでください.
今回はこれで完成です.
お疲れ様でした.
次回はタイマーでLEDをちかちかしていく予定です.