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

「[8bit PICマイコン開発環境構築(Windows)](https://qiita.com/t-nakamura-koden/items/31ee27d0f1f721ef1303)」で使っていた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](http://akizukidenshi.com/catalog/g/gM-13337/)が使えるほか、2000円切る（！）[MPLAB Snap](http://akizukidenshi.com/catalog/g/gM-13854/)が使えるようになり、費用面のハードルは下がっています。

(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](https://www.microchip.com/wwwproducts/en/ATSAMC20N18A)、Mouserでは347円)があります。C20とC21の違いはCANの有無です。製品ページの「Similar Devices」も参照。
なおPICマイコンとは違って、内蔵発振子が0～40℃では1%精度のようですので、外部発振子なしでもUARTでの通信は心配なさそうです。

## 日本語資料

* [Microchip 日本語資料|ツール/ユーザガイド](https://www.microchip.co.jp/download/index.php?Mode=4&CategoryID=b49f6518016d4066a6a638013bf965a0f3607fe8)
 * [MPLAB PICkit 4 インサーキットデバッガ クイックスタートガイド](http://ww1.microchip.com/downloads/jp/DeviceDoc/50002721B_JP.pdf)
 * 「Cortex SWD」の記載を参照、MCLRは47kでVCC(5V)にプルアップ（10kでは動作しませんでした）
 * [MPLAB PICkit 4 インサーキットデバッガ ユーザガイド](http://ww1.microchip.com/downloads/jp/DeviceDoc/50002751C_JP.pdf)

# ハードウェアの準備

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

# インストール
* MPLAB X-IDE https://www.microchip.com/mplab/mplab-x-ide
* XC32 コンパイラ https://www.microchip.com/mplab/compilers

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

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

# プロジェクトの作成
* File → New Project 
![New Project.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243968/1f771c37-f2ea-6b81-ed55-8fcf62722fbc.png)

* コードを生成してもらうため、"32bit MPLAB Harmony 3 Project" を選択します。
![32bit MPLAB Harmony 3 Project.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243968/a04c9601-6e7d-22d1-798d-5823944b3207.png)

## フレームワークのダウンロード
* Launch Framework Downloader
フレームワークをダウンロードしておく必要があります。
![Launch Framework Downloader.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243968/26890e9a-74c4-2e9e-1890-5ad27a12e6cc.png)
* Create Folder
フレームワークをダウンロードするためのパスを入力します。プロジェクトとは別な場所でOK。
![Create Folder.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243968/fc802d48-d295-782e-1a47-88c70e60f2d7.png)
「Create Folder」をクリックして「Next」
* リポジトリパスの設定
・・どうもGithubからライブラリをダウンロードするようです。
![Connection Setting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243968/ff5ec1c2-7de3-7659-ee6a-9b82dd591c71.png)
* Download Catalog
「Next」をクリックするとカタログをダウンロードします。
![Download Catalog.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243968/176982ce-fd18-0c84-bd4d-37f38b08336a.png)
* Download Packages
「Next」をクリックしたら、「Download」
![Download Packages.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243968/885a3c8a-3fcb-d600-6861-e5720127c529.png)
* SLAを３本Acceptしてください（あるいはAccept All Licenses）。
![SLA.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243968/a0450417-4e7a-e868-7504-def3ff041895.png)
* Clean Package：
ダウンロードが始まります。10GB以上あるので、相当な時間がかかります。
![Clean Package.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243968/934c1337-d4ac-32d0-5b50-2fa466b75090.png)
* ダウンロード完了：
Closeをクリックして閉じます。
![Package Download Done.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243968/3e29332c-5350-a74e-0349-adff5bdcc041.png)
* 再びNext。
なぜかちょっとここで固まるようですがじっと待ちます。
![Package Download Done - Next.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243968/79cecaa0-a2b9-dd08-1786-a715b97732cd.png)
* 完了
![Package Download Done - Complete.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243968/6a086342-6ac6-f937-c5d3-7b6427412566.png)

##新規プロジェクト作成の続き
* Nextをクリック
![New Project-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243968/da141885-7e8f-20c6-b5f4-2d0d9be0dbb7.png)
* Location / Folder (Name)を入力
Locationパスのfirmwareフォルダ内にフォルダが作成されるようです。ようやくFinish
![New Project-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243968/280752cf-76eb-cc53-a302-83fb4aa32777.png)
* Configuration Settings：Harmonyのconfig名を指定します。defaultのままでもOKです。
* ターゲットデバイスの指定：ここではATSAMC20N17Aを指定しましたが、用意した品種にしてください。
 * 後から品種を変えると、正しいConfigurationにならないようです。  
![Configuration Settings.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243968/bec77e3f-a824-1c38-0640-8af75adce548.png)
Finishをクリックすると終了します。

# MPLAB Harmony 3 Configuratorの起動
プロジェクトの新規作成時は自動で起動するようです。最初にFrameworkのpackageバージョンの確認が表示されますので、「Launch」をクリックします。
次回からはツールバーの「Tools」→「Embedded」→「MPLAB Harmony 3 Configurator」から起動します。
![Configuration Database Setup.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243968/6826360b-b538-87df-9a62-0a290ab5bfa1.png)
「Launch」をクリックすると起動するのですが、IDEが操作不能になるので、電池駆動時や動作の遅いPCでは要注意です。

## クロックの設定
・・というのが普通でしょうけど、内蔵発振子で48MHz動作してくれるようにデフォルト設定されていますので、大丈夫です。生成されるコードを確認すると、キャリブレーション設定もしてくれるようですので精度も出ると思います。
いじりたい場合は「Tools」→「Clock Configuration」からどうぞ。

## STDIOとUARTの設定
![2-2 MPLAB Harmony Configurator.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243968/10ecfccf-5cd0-367d-fa20-7b3596cdcd7e.png)

* 画面左側の「Available Components」から
 * 「Peripherals」→「SERCOM」→「SERCOM0」をダブルクリック
 * 「Tools」→ 「STDIO」をダブルクリック
![2-2 MPLAB Harmony Configurator-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243968/c1aee939-61c8-e837-ce2b-60f2c4dd69d7.png)
これで、Project GraphにSTDIOとSERCOM0が出てきました。

* UARTの設定
 * 箱をドラッグするとレイアウトが変更できます。
 * SERCOM0の黄色の菱形「UART」を、STDIOの赤い菱形までをドラッグしてつなぎます。 
 * SERCOM0をクリックしすると右側に設定画面が出ます。
 * この例では、Pad[1]をRXに設定しています。Baud Rateはデフォルト115.2kでした。
![2-2 MPLAB Harmony Configurator-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243968/edf11a30-aa2f-7271-0fd8-8db9aad8f8ec.png)

## ピンの設定
* UARTのピン設定は、Tools - Pin Configurationから。
![2-3 Tools - Pin Configuration.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243968/cee3d8f7-6da7-c4b9-4b3f-2220bcd0cfa5.png)
 * ここでは、角に配置されている26pinと27pinをSERCOM0に設定しました。割付可能なピンについてはデータシートを参照。なお、26番ピンはNMIに設定できるピンなので、ご注意ください（後から気づくと驚きますよそんなの）。
![2-3 Tools - Pin Configurator - 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243968/532265ae-a3a8-c6e8-83b2-ee84a3d34829.png)

## Systemの設定
* Systemをクリック
 * Device & Project Configuration / Project Configuration / Tool Chain Selections / XC32 Global Options / Linker / General と掘って、「Heap Size」を4096 bytesに設定。ここからタスクのヒープを取ります。
![7 System.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243968/6baf4e1b-30df-93c2-c461-868b2e721bb5.png)
近くにある設定：
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()とかする時は必要みたい）
![6 Free RTOS.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243968/36f49a89-cdab-7b4b-b018-2e07e75909e0.png)

## Harmony Coreの設定
* 画面左側から「Harmony」→「Core」をダブルクリックして追加
 * 「Generate Harmony Application Files」にチェック
 * 「Stack Size」を768に設定（768 * 32bit (4byte) = 3072バイトの意味。STDIOでこれぐらいは必要みたいです）。SystemのHeap sizeを超えると動かなくなります。。
![8 Core.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243968/0fb1682d-2253-d0d0-9a31-6c29829ec549.png)

## コードの生成
* メニューから「Generate」→「Generate Code」 
![5 Generate Code.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243968/97be07de-e762-d617-fc3a-d061a155612f.png)
 * コンフィグファイルを保存するか聞かれます。Saveしましょう。
![5 Code Generate-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243968/26d9d5d0-42ce-0389-0751-95acc6175317.png)
 * Generateをクリックすると、コードを生成して閉じてくれます。
![5-2 Generate Project.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243968/4ca0a3e9-cf86-61eb-dfbf-3dc8cb6434d1.png)

# アプリケーションのコーディング
IDEに戻ると、app.cが生成されています。
 \#include \<stdio.h> を入れたら、APP_Tasks()内にprintf()をコーディングしてみましょう。

<details><summary>サンプルコード</summary><div>

```rb
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;
        }
```

</div>

# プロジェクトのプロパティ設定
ここにも落とし穴。「Hardware Tool」がデフォルトでは「Simulator」が選択されていますので、「PICkit 4」（あるいはSnap）を選択しておかないとハードウェアに接続してくれないのです。
![4 Project Properties.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243968/07c91466-2133-e025-9005-b43ef8ca9bfb.png)

# デバッグ実行
PICkit4とテスト基板を接続したら、Debug
![9 Debug.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243968/0b3283c9-4ac7-aa58-5182-d7af5f2c2a40.png)
ビルド後にPICkit4経由でターゲット接続・書き込み＆デバッグ実行してくれます。
ターミナルソフトを接続しておけばシリアルに"Hello World!"が表示されると思います。