「8bit PICマイコン開発環境構築(Windows)」で使っていたIDE、"Microchip MPLAB X-IDE"(とXC32コンパイラ)とPICKit4で、旧AtmelのCortex M0+マイコンであるATSAMC20/21シリーズがサポートされました。
こちら5V電源に対応していて、32ピン~100ピンの規模で32bitなのに価格アップが僅かだったりなので、なかなか心惹かれる方も多いのではないかと思います。
いまだ情報が少ない印象なのと、printf()が使えるようになるまでが大変でした・・。
100ピンのATSAMC20N17Aを例に、「UARTからprintf()出力とechoができたところまで」をまとめておこうと思います。
FreeRTOSも設定しています。
なお前回同様、USB非対応でMouserだと300円ぐらいのマイコンをバラで取り寄せてハンダ付けする・・という、組み込み開発のお話です。
デバッガは¥5000ぐらいのPICkitが使えるほか、2000円切る(!)MPLAB Snapが使えるようになり、費用面のハードルは下がっています。
(2020/6/15 update:MPLAB Snapを追記)
ATSAMC20N17Aについて
製品ページ:https://www.microchip.com/wwwproducts/en/ATSAMC20N17A
Cortex-M0+で電源が2.7~5.5V対応、発振子内蔵、RAM 16kB、ROM 128kB、EEPROM 4096バイトで使いやすいと思います。
ピンが多すぎるという場合は32/48/64ピン、RAMをもっと、という方はRAM 32kB/ROM 256kB品( ATSAMC20N18A、Mouserでは347円)があります。C20とC21の違いはCANの有無です。製品ページの「Similar Devices」も参照。
なおPICマイコンとは違って、内蔵発振子が0~40℃では1%精度のようですので、外部発振子なしでもUARTでの通信は心配なさそうです。
日本語資料
- Microchip 日本語資料|ツール/ユーザガイド
- MPLAB PICkit 4 インサーキットデバッガ クイックスタートガイド
- 「Cortex SWD」の記載を参照、MCLRは47kでVCC(5V)にプルアップ(10kでは動作しませんでした)
- MPLAB PICkit 4 インサーキットデバッガ ユーザガイド
ハードウェアの準備
- マイコン本体
- 電源、パスコン
- (必要な場合)ピッチ変換基板
- デバッガ(PICkit4かSnap)
- デバッガ接続用ピンヘッダ(8ピン)
インストール
- MPLAB X-IDE https://www.microchip.com/mplab/mplab-x-ide
- XC32 コンパイラ https://www.microchip.com/mplab/compilers
上記2つをダウンロード&セットアップします。
以前はプラグインをインストールしないとMCCやHarmonyによるドライバコードの生成が行えませんでしたが、IDEインストール時にマイコン種別(8bit/16bit/32bit)を指定することでインストールされるようになったようです。
プロジェクトの作成
フレームワークのダウンロード
- Launch Framework Downloader
フレームワークをダウンロードしておく必要があります。
- Create Folder
フレームワークをダウンロードするためのパスを入力します。プロジェクトとは別な場所でOK。
「Create Folder」をクリックして「Next」 - リポジトリパスの設定
・・どうもGithubからライブラリをダウンロードするようです。
- Download Catalog
「Next」をクリックするとカタログをダウンロードします。
- Download Packages
「Next」をクリックしたら、「Download」
- SLAを3本Acceptしてください(あるいはAccept All Licenses)。
- Clean Package:
ダウンロードが始まります。10GB以上あるので、相当な時間がかかります。
- ダウンロード完了:
Closeをクリックして閉じます。
- 再びNext。
なぜかちょっとここで固まるようですがじっと待ちます。
- 完了
##新規プロジェクト作成の続き
- Nextをクリック
- Location / Folder (Name)を入力
Locationパスのfirmwareフォルダ内にフォルダが作成されるようです。ようやくFinish
- Configuration Settings:Harmonyのconfig名を指定します。defaultのままでもOKです。
- ターゲットデバイスの指定:ここではATSAMC20N17Aを指定しましたが、用意した品種にしてください。
- 後から品種を変えると、正しいConfigurationにならないようです。
Finishをクリックすると終了します。
MPLAB Harmony 3 Configuratorの起動
プロジェクトの新規作成時は自動で起動するようです。最初にFrameworkのpackageバージョンの確認が表示されますので、「Launch」をクリックします。
次回からはツールバーの「Tools」→「Embedded」→「MPLAB Harmony 3 Configurator」から起動します。
「Launch」をクリックすると起動するのですが、IDEが操作不能になるので、電池駆動時や動作の遅いPCでは要注意です。
クロックの設定
・・というのが普通でしょうけど、内蔵発振子で48MHz動作してくれるようにデフォルト設定されていますので、大丈夫です。生成されるコードを確認すると、キャリブレーション設定もしてくれるようですので精度も出ると思います。
いじりたい場合は「Tools」→「Clock Configuration」からどうぞ。
STDIOとUARTの設定
-
画面左側の「Available Components」から
-
「Peripherals」→「SERCOM」→「SERCOM0」をダブルクリック
-
「Tools」→ 「STDIO」をダブルクリック
これで、Project GraphにSTDIOとSERCOM0が出てきました。 -
UARTの設定
-
箱をドラッグするとレイアウトが変更できます。
-
SERCOM0の黄色の菱形「UART」を、STDIOの赤い菱形までをドラッグしてつなぎます。
-
SERCOM0をクリックしすると右側に設定画面が出ます。
ピンの設定
- UARTのピン設定は、Tools - Pin Configurationから。
- ここでは、角に配置されている26pinと27pinをSERCOM0に設定しました。割付可能なピンについてはデータシートを参照。なお、26番ピンはNMIに設定できるピンなので、ご注意ください(後から気づくと驚きますよそんなの)。
Systemの設定
- Systemをクリック
- Device & Project Configuration / Project Configuration / Tool Chain Selections / XC32 Global Options / Linker / General と掘って、「Heap Size」を4096 bytesに設定。ここからタスクのヒープを取ります。
近くにある設定:
Device & Project Configuration / Project Configuration / Generate System Exceptionの更に下にある「Use Advanced Exception Handling」も有効にしておくと良いでしょう。
Free RTOSの設定
- 画面左側から「Third Party Libraries」→「Free RTOS」をダブルクリック
(OSを使わない場合はmain()を変更します。) - 「Memory Management Type」を「Heap_3」に設定します。(STDIOを使用するのに必要)
- 「Minimal Stack Size」を1536ぐらいに設定します。(printf()だけじゃなくgetchar()とかする時は必要みたい)
Harmony Coreの設定
- 画面左側から「Harmony」→「Core」をダブルクリックして追加
- 「Generate Harmony Application Files」にチェック
- 「Stack Size」を768に設定(768 * 32bit (4byte) = 3072バイトの意味。STDIOでこれぐらいは必要みたいです)。SystemのHeap sizeを超えると動かなくなります。。
コードの生成
アプリケーションのコーディング
IDEに戻ると、app.cが生成されています。
#include <stdio.h> を入れたら、APP_Tasks()内にprintf()をコーディングしてみましょう。
サンプルコード
void APP_Tasks ( void )
{
/* Check the application's current state. */
switch ( appData.state )
{
/* Application's initial state. */
case APP_STATE_INIT:
{
bool appInitialized = true;
if (appInitialized)
{
printf( "Hello World!\r\n" ); //←これだけ
appData.state = APP_STATE_SERVICE_TASKS;
}
break;
}
プロジェクトのプロパティ設定
ここにも落とし穴。「Hardware Tool」がデフォルトでは「Simulator」が選択されていますので、「PICkit 4」(あるいはSnap)を選択しておかないとハードウェアに接続してくれないのです。
デバッグ実行
PICkit4とテスト基板を接続したら、Debug
ビルド後にPICkit4経由でターゲット接続・書き込み&デバッグ実行してくれます。
ターミナルソフトを接続しておけばシリアルに"Hello World!"が表示されると思います。