ARM Cortex-M0+な5VマイコンはMicrochip製なら開発環境構築が格安(Windows)


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での通信は心配なさそうです。

日本語資料

ハードウェアの準備

  • マイコン本体
  • 電源、パスコン
  • (必要な場合)ピッチ変換基板
  • デバッガ(PICkit4かSnap)
  • デバッガ接続用ピンヘッダ(8ピン)

インストール

上記2つをダウンロード&セットアップします。

以前はプラグインをインストールしないとMCCやHarmonyによるドライバコードの生成が行えませんでしたが、IDEインストール時にマイコン種別(8bit/16bit/32bit)を指定することでインストールされるようになったようです。

プロジェクトの作成

  • File → New Project

  • コードを生成してもらうため、"32bit MPLAB Harmony 3 Project" を選択します。

フレームワークのダウンロード

  • 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をクリックしすると右側に設定画面が出ます。
    • この例では、Pad[1]をRXに設定しています。Baud Rateはデフォルト115.2kでした。

ピンの設定

  • 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を超えると動かなくなります。。

コードの生成

  • メニューから「Generate」→「Generate Code」
    • コンフィグファイルを保存するか聞かれます。Saveしましょう。
    • Generateをクリックすると、コードを生成して閉じてくれます。

アプリケーションのコーディング

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!"が表示されると思います。