1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Adafruit Trinket M0 にシリアルポートを追加する

Last updated at Posted at 2020-03-24

はじめに

 Arduino Pro mini 互換ボードで作っていたプログラムが CPU 処理能力、メモリ容量の両方が足りなくなったので Adafruit Trinket M0 に乗り換えた。

 Arduino では SoftwareSerial を使っていたのだが Adafruit Trinket M0 では H/W Serial が使えるということだったので、いろいろ探したのだがピッタリのものが見つからない。 Arduino Zero のは何とか見つかり、STM32 を使った Adafruit 向けの情報も見つかったのだがなかなかうまくいかず...。

 ということで苦労して動くようにしたのでメモ。

サンプルソース

github にあるので、お急ぎの方はこちらを。

パラメータの定義とオブジェクトの宣言

#define PIN_SERIAL2_RX       (2ul) // PA09
#define PAD_SERIAL2_RX       (SERCOM_RX_PAD_1)
#define PIN_SERIAL2_TX       (0ul) // PA08
#define PAD_SERIAL2_TX       (UART_TX_PAD_0)

Uart Serial2( &sercom2, PIN_SERIAL2_RX, PIN_SERIAL2_TX, PAD_SERIAL2_RX, PAD_SERIAL2_TX ) ;

割り当てたのは Pin 0, 2。なぜか RX が入力なので要注意。他のピンへの割り当ても可能だが、かなり難解。どうしてもという場合はこちらを参考に。

ポートをシリアルポートに割り当て

    Serial2.begin(115200);
    pinPeripheral(0, PIO_SERCOM_ALT);
    pinPeripheral(2, PIO_SERCOM_ALT);

 pinPeripheral() で、物理的なピンをSERCOM(CPU 内部のシリアル関連を制御するモジュール)に割り当てる。

割り込みハンドラの追加

void SERCOM2_Handler() {
  Serial2.IrqHandler();
}

 割り込み側ハンドラはユーザー側のコードで定義が必須。SerialEvent() は、使わない場合は定義しなくてもよいが、Adafruit M0 系にシリアルを追加する場合は割り込みハンドラの定義が必須。これがなくともコンパイラはエラーを吐かないが、プログラムが動かない。

終わりに

 コードにすると10行ほどだが、ここまでたどり着くのに半日かかってしまった...。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?