STM32でCMSIS DSPを使ってみる その1

今回は高速に三角関数とかを計算できるARM社提供ライブラリであるCMSIS DSPライブラリを使ってみる話です。
こいつを使うとsin,cosとかよく使う三角関数やaddとかを高速に処理できます。
そのほかFIR,IIRと言ったデジタルフィルタ用のAPIだったり制御用のAPIもあるのでつかわない手はないです。

導入

今回の実習環境は以下の通りです

  • IDE:AtollicTrueStudio
  • Board:STM32F767 Nucleo144

CubeMXで適当にプロジェクトを作ってビルドが通るとこまで作っておきます。

スタティックライブラリの追加

次にコンパイル済みのライブラリを追加していきます。
オブジェクト自体はCubeF7のフォルダ内にあります。

場所を調べるには

CubeMX上記メニューからhelp->UpdaterSettingでパスをコピーします

f:id:gsmcustomeffects:20170405164420p:plain

ファイルエクスプローラーでそこに移動します。

するとこんな感じのファイル構成になっていると思います

f:id:gsmcustomeffects:20170405164606p:plain

オブジェクトは以下のPATHにあります。

STM32Cube\Repository\STM32Cube_FW_F7_V1.6.0\Drivers\CMSIS\Lib

f:id:gsmcustomeffects:20170405165503p:plain

三つありますがダブルポイント(倍精度)かシングル(単精度)かを選ぶ。
今回はF767なのでdpがついてるlibarm_cortexM7lfdp_math.aを選びます。

それをコピーしてプロジェクト直下にいれます。

f:id:gsmcustomeffects:20170405164940p:plain

プロジェクトの設定

プロジェクトのプロパティーを開く
C/C++Build」/GCC linker/Miscellaneous欄で
Linker、LibrariesでDSP処理のLinkerとかを設定していく

Librariesに下記を追加。

arm_cortexM7lfdp_math.a

ものによってはエラーになるので.aをなくした版で試して見てください

arm_cortexM7lfdp_math

Library search pathに下記を追加

"${workspace_loc:/${ProjName}}"

上記の例では.aファイルは直下にあるのでこのように書いている。
ちなみに$workspace_locとかはeclipseディレクトリ変数的なやつなのでeclipseのドキュメントを確認するといろいろのってる。

プリプロセッサの設定

__FPU_PRESENT
ARM_MATH_CM7

f:id:gsmcustomeffects:20171209153546p:plain

を追加する。

FPUの設定

倍精度の奴を選びます。
詳しい説明はここ読んでください
ARM Information Center

f:id:gsmcustomeffects:20170405165752p:plain

んでいったんビルドする

f:id:gsmcustomeffects:20170405165819p:plain

コードを書いていく

ヘッダーをインクルードします。

#include "arm_math.h"

今回は試しに平方根でもやってみます。
FastMathのとこに入ってます。

CMSIS DSP研究室さんで詳しく解説されています。

DIGITALFILTER.COM

APIとしては

arm_sqrt_f32 (float32_t in,float32_t * pOut )

を用います

f:id:gsmcustomeffects:20170405170921p:plain
Square Root

こんな感じに書いた
f:id:gsmcustomeffects:20170405171946p:plain

動作

f:id:gsmcustomeffects:20170405172020p:plain

入力した値の平方根が帰ってきているのでちゃんと動いているといえる。

ちなみに返り値でStatを見ているがそれの返り値はENUMで定義されてる。

f:id:gsmcustomeffects:20170405172126p:plain

まとめ

  • DSPライブラリを導入できた
  • FastMath使った割に速度については検討してないので今後やって行きたい