複数の似た処理の統合
かなり手間取ったが統合できた. 入力命令の解釈が不適切で DMA 2ch で動かせる内容を DMA 4ch で動いていて結果としてはあっているという問題が直せた.
data を increment-pattern でいれると MCU が止まってしまうバグがあったが、統合時に increment-pattern と無限ループに対する定義が仕様書になかったので明示して、それに準拠した.
DMAC が RAM に結果を書くタイプの設定不具合
ソースがきれいになったのでいままでやれなかった電源投入後のDMA開始の調整と DMA descriptor と EVSYS を再設定無しに再実行を実装.
ADC が動かない. これまで3度の改訂で処理を少しずつ変えているのだが毎回理由不明で苦しめられる. 今回に関しては再実行で read した data (DR) の先頭にゴミデータが入るという不具合も発生.
今回の傾向から判断するに...
- DR と ADC は EVSYS 経由ではなく CHCTRLB.TRIGSRC から取って来るものである.
- CHCTRLA.ENABLE = 0, CHCTRL.SWRST = 1 にしても改善しない.
- DMA 完了割り込みのときのみに CHCTRL.SWRST = 1 するとなぜか改善する.
以上から CHCTRLA.ENABLE = 0 であっても TRIGSRC を書き換えていないと、DMA ch は TRIGGER を認識しているが ENABLE = 0 なので pending になってしまって DMA がつまるのだろうという仮説ができた. 今回の実装では DMA 完了割り込みのあとに SPI を動かしたりすること、 TIMER が止まってないと ADC が再度動いてしまうことが予想できたからだ.
ということで CHCTRLB = 0 (全ビット)としたら改善した. DR と ADC の channel の TRIGSRC のみ = 0 としたがこれは改善せず、全ての channel の CHCTRLB = 0 としたら期待通りになった. 他の要因は EVSYS につなぐことなんだろうけどここらへんは直接レジスタを見づらく対処に困る.
TRIG がつまってしまった場合にそれを明確に止める方法がないのが対策に時間がかかった.