2016年1月9日土曜日

STM32F1のDMA

STM32F1のDMA接続一覧。ソースはRM0008のRev11日本語版。書き間違えてたらごめんなさい。





1枚目がDMAに対するペリフェラルの関係、2枚目がペリフェラルに対するDMAの関係。

例えばデータロガーを作る場合、SDカードを接続するSPI1とセンサを接続するSPIはDMA使用で、コンソールに使用するUARTもDMAを使用したい、という場合、SPI1,SPI2を使用し、UARTは4を使用することになると思う。
まずSPIだが、とりあえずSDカードはSPI1に固定しておいたほうが良い。これはSPI1では36MHzまで、それ以外では18MHzまでという制限があるため、なるべく早く通信したいSDカードはSPI1に接続する。センサはSTMの場合10MHzまでの場合が多いので、SPI2の9MHzでも十分という判断。
次にUART4を使用する理由だが、USART2のDMAは1_6と1_7が割り当てられている。しかし1_6,1_7にはI2C1も割り当てられており、I2CをDMA化したい場合に困ることになる。一方UART4なら他にはADC3とタイマしか割り当てられていないため、競合する可能性は低いと判断した。またUART4のピンにはリマップでUSART3を割り当てることが可能であり、UART4で足りない場合はUSART3を使用することが可能となる(もちろんDMAはSPI1と競合するため割り込みでしか送受信できないが)。

その他のDMAソースはADCとDAC、それからTIMしかなく、ADCはDMA1_1を割り当てることが可能、ただしDAC2は競合がTIMのみだが、DAC1はUART4_RXと競合しているため、DACを2ch使う場合は選択する必要がある。もっとも、DACを使いたい場合も大半はDMAソースにTIMを使うと思うけど。

定期的にデータを送りたい場合(GPIOでパルスを出したりDACでアナログ波を出したり)はタイマに同期してDMAを蹴ることになると思うが、タイマに割り当てられたDMAは結構数があるとはいえ、他のペリフェラルを目一杯使っているとかなり厳しいことになりそう。
ただしADCの場合はADCのトリガをTIMに接続し、DMAのトリガはADCに接続するため、DMAとTIMの接続は不要。


プログラムは実際に動作するハードウェアに合わせて作ることになると思うが、とりあえず上記のようなSPI1/SPI2/I2C1/UART4あたりをDMA化するライブラリを作っておけば互いに競合せずに後々便利かもしれない。ただしSTBee Miniに使用されているSTM32F103xCにはUART4は搭載されていない。STBee Miniを使う場合はSPI2のDMAを使用せずにUSART1を使うか、I2C1のDMAを使用せずにUSART2を使用することになるはず。
結局大抵の組み合わせのドライバを作っておけば便利だよ!ってなっちゃうんだなぁ。。。

今回はUARTは1本のみの想定だが、缶サットの場合は 1)テレメ 2)GPS 3)JPEGカメラ のように複数のUARTを使用することになると思う。そういう場合はまたいろいろ考える必要がある。
例えばJPEGカメラやGPSはコンスタントにデータが流れ込んでくるために受信はDMA化しておくと都合がいい。しかしGPSに送信する必要はあまり無く、JPEGカメラでもせいぜい数十バイトを送れば十分なので、送信はDMA化する必要はない。対してテレメの場合、受信はあまり多くないだろうが、送信はある程度のデータ量になるのでDMA化しておくと良いかもしれない。

まぁ行き当たりばったりで作るとろくな事にならないので、最初にどんな機能がほしいかを考え、それを作るためにどういう配置をすればいいかというのをしっかりと検証しておくと言いと思う。

0 件のコメント:

コメントを投稿