Seeeduino XIAO (ATSAMD21G18) のEVSYSライブラリ

SAMD21のイベント・ライブラリを作ってみた。

このライブラリはイベント・チャネルの割当管理が主であり、一個のイベント・ジェネレータからのイベント出力を複数のイベント・ユーザーへ送信することができる。(1:n接続)

イベント連携は直書きしてもチャネル固定なら数行で書けるのでライブラリが必要かどうかは微妙な気もしたが、必要な情報がeventsys.hに定義されているためヘッダーを探し回る必要がないという点はメリットかもしれない。

サンプル・スケッチは、XIAOのD9ポートの立下りエッジによりタイマーカウンタTC3にイベントを送信する。TC3のイベントアクション設定がスタートやリトリガーならTC3はカウントを開始する。こういう組み合わせができるというのは意外に便利そうだ。CPUを介さない連携なのでCPUが停止していても機能する点にもメリットを感じる。

だだ、残念なのは、DMAをイベント駆動できるのにDMA経由でIOPORTアクセスができないこと。これができればBit-Bangモードが可能なのに...と思うのは私だけ?

【メソッドの概要】

ライブラリを初期化する。

ライブラリを終了する。

イベント・チャネルを割り当てる。

割り当てたイベント・チャネル(ch)を解放する。

割り当てたイベント・チャネル(ch)にイベント・ユーザー(user)を接続する。

割り当てたイベント・チャネル(ch)にイベント・ジェネレータ(gen)を接続する。
EVENTSYS_PATHの指定はペリフェラルにより異なるがイベントユーザーにDMAを指定する場合だけEVENTSYS_PATH_RESYNCHRONIZEDを指定し、それ以外は、省略値であるEVENTSYS_PATH_ASYNCHRONOUSのままで良いと思う。たぶん...

割り当てたイベント・チャネル(ch)にソフトウェアでイベントを発生させる。デバック用くらいにしか使い道がないかも。

割り当てたイベント・チャネル(ch)の割り込みハンドラ(cb)設定と割り込みを制御する。

割り当てたイベント・チャネル(ch)のビジー・ステータスを取得する。

割り当てたイベント・チャネル(ch)に接続された全てのイベント・ユーザーがイベント受信可能か確認する。

【サンプル・スケッチ】

【修正】
2020-05-26
割り込みコールバック関数にEVENT_CHANNEL型引数を追加。

2020-05-24
EVENTSYS_USER型にEVENTSYS_USER_NONEを追加。それにともないaddEventUser()を修正。

【ライブラリ】

【参照ライブラリ】
Seeeduino XIAO (ATSAMD21G18) のGCLKライブラリ (gclock.h/gclock.cpp)