スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

FM3のDMACの使い方

USB-STICK(MB9AF312K)でDMACを使おうとして調べていると、非常に読み辛いマニュアル構成になっているので、自分なりにまとめてみました。当面の使用目的はUART0の送信データエンプティ割込み発生時にDMACを使って送信データをセットする事です。

ARMコアを扱うようになって、Spansion(旧富士通)のマニュアルは共通化されるようになり、その副作用で必要な部分が複数のマニュアルにまたがる構成になってしまっています。慣れるまではとにかく全てをDLしてきて検索しまくるのが手っ取り早いでしょう。今回もそうやって検索していてようやく見えてきました。

DMACを大々的に扱っているのが ペリフェラルマニュアル です。これのCHAPTER 9にDMACの事が書かれています。で、小難しい話はすっ飛ばし、使用するレジスタはなんだ? と 5.1 レジスタ一覧 を見てみると、DMACR, DMACAx, DMACBx, DMACSAx, DMACDAx を使うんだな~というのが分かります。「これらを設定すれば使えるんだ…」なんて思っているとしっぺ返しを食らいます。実際食らいました…。


mb9af312k_DMAC_02.png


5.1 レジスタ一覧 の内容はあくまでもDMACへの設定内容だけ。ペリフェラルの割り込みをトリガにする場合は、この割り込み側にも細工をする必要があり、それらはレジスタ一覧に載っている内容以外の所にあります。

CHAPTER 9 を熟読すると「あれっ、このレジスタの説明は何処にあるの?」となる部分があります。流し読みしてしまった私はこれにはまりました。2.1 DMACとシステム構成 の項目です。ブロック図と各の説明が書かれています。


mb9af312k_DMAC_01.png


要は、DMACのトリガとして対応しているペリフェラルの割り込み信号をDMACが受け取るには、割り込み信号をDMACかNVICのどちらに伝えるかを DRQSEL/DRQSEL1 で切り替え、DQESEL を設定する必要があるということです。DRQSEL/DRQSEL1, DQESEL のレジスタは上記レジスタ一覧に出てきません。これが何処にあるのかと言うと…、CHAPTER 7の割込みの章にあるんですよね。MB9AF312Kの製品TYPEはTYPE5に該当します(データシートの概要部分に記載されています)。割り込みベクタのリロケート機能は使わないので 割込み(A)を参照する事になる(表1-1より)。


mb9af312k_DMAC_03.png


DQESELはTYPE2だけに存在するレジスタらしく、TYPE5には関係ないらしいので無視しておきましょう。残るは DRQSEL/DRQSEL1 の2レジスタ。これは各割込み信号を伝える先を選択するレジスタで、今回はUART0の送信割込みをDMACで使うので、MFS ch0 の送信割込み信号をDMACへ伝える様にします。

これで、MFS ch0 送信割込みが来るとDMACが起動して、DMACでの転送が全て完了するとDMAC ch0 の割込み(NVIC経由)が入る。というストーリーができあがります。ここで忘れてはいけないのが、転送完了した時の処理方法です。そのまま放っておくと送信完了割込みはDMACに繋がったまま。で実際に送信完了になるとDMACを呼び出すが、DMACは転送完了しているので何もしない。何もしないので、このままにしておくって手もありますが、次の送信をDMA転送を使うとは限らないので、DMAC割込みが上がったタイミングで送信完了割込みをNVIC側へ繋いでおくのが良いでしょう。設計思想次第ですが…。それと、NVICの手前で割込み信号を振り分けているので割込み禁止にしてもDMACへの転送トリガは入ってしまう事に注意です。

あっ、ここまできて何ですが、各ペリフェラルでDMAC転送可能かをCHAPTER 1: システム概要 の 表 1-1 ペリフェラル・アドレスマップ にDMAC転送可能/不可能の表があるので、確認しておく必要があります。MFSは "可" になってます。


mb9af312k_DMAC_04.png


上記の事を踏まえて、プログラムを作成してみました。
SWを押下するとUART出力に文字列を出力する例です。


mb9af312k_DMAC_05.png


UARTの送信設定をしておいて、実際に出力する時はDMACにその内容を設定→割込み要因通知先をDMACに切り替えてDMAC開始→UARTの送信バッファは既に空なので即時にDMA転送開始→UART送信→DMA転送→ … → UART送信完了→DMAC割込み発生→ここで割込み要因通知先をNVIC側に設定→UART送信割込み発生→UART送信割込みを無効化する。といった流れにしています。

連打は考慮していないので、SWを1回押したら文字が全て出力されるのを待ってから押すようにしないとよろしくない動きをしてくれたりします。今の文字サイズだとチャタリング除去処理でおそらくそんなことにはならないと思いますが。DMACの汎用ライブラリとしてはまだまだ作り込みが必要ですね。

mb9af312k_uart_tx_dma_sw.zip

ここで1つ疑問があります。
UARTの送信データレジスタ(TDR)は16bitレジスタです。bit0~bit8の計9bit分を転送するときは16bitアクセスする必要があると書かれているが、bit0~bit7の計8bit分を転送する場合の設定方法は記載されていません。TDR直書きの時は気にせず8bit感覚で設定していましたが、DMACの場合は明確に書き込みのbit幅を設定しなくてはいけなく、また8bitでないとデータの渡し方が面倒なので、8bit幅で書き込んでます。これで動いているから良しとしましょう。この辺、マニュアルに書いてくれないと分からないですよ~、Spansionさん。
スポンサーサイト

tag : FM3ペリフェラル

黒ねこ時計 くろック D02
プロフィール

jujurou

Author:jujurou
運営HP:チャコの部屋
Twitter:jujurou

カレンダー
11 | 2013/12 | 01
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 - - - -
最新記事
最新コメント
カテゴリ
ユーザタグ

RaspberryPi ぺるけ Linux TRminiWatterPart4 トランジスタ式ミニワッター MPD イーサネットコンバータ OpenOCD DAC FON2405E buildroot FM3ペリフェラル BeagleBoneBlack library FM3評価ボード ODROID-U2 mingw OpenGL TL-WR700N Edison bitbake KiCad VMware シングル FM4 ミニワッター 6N6P 計測 

月別アーカイブ
ランキング

FC2 Blog Ranking

カウンター
検索フォーム
リンク
RSSリンクの表示
QRコード
QRコード
ライセンス
クリエイティブ・コモンズ・ライセンス
Twitter
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。