[チュートリアル] DSP第7章ARM DSPソースコードおよびライブラリ移植のSTM32F407(IAR8)

完全バージョンをダウンロードチュートリアル:http://www.armbbs.cn/forum.php?mod=viewthread&tid=94547

第7章ARM DSPソースコードおよびライブラリ移植(IAR8)

公式ARMとDSPのソースコードと移植ライブラリのいくつかの知識を教え、​​この問題のチュートリアル。

ディレクトリ

第7章ARM DSPソースコードおよびライブラリ移植(IAR8)

7.1重要な初心者

ダウンロード用の7.2 DSPライブラリと

7.2.1 DSPライブラリのダウンロード

説明7.2.2 DSPライブラリ

7.3 DSPライブラリのバージョンとの違い

7.4定義済みマクロいくつかの重要な意味DSPライブラリ

7.5 IAR移植(移植ソースモード)のDSPライブラリ

7.5.1ステップ1:IARプロジェクトを作成し、DSPライブラリを追加

7.5.2ステップ2:インクルードパスを追加します。

7.5.3ステップ3:マクロ定義を追加します。

7.5.4ステップ4:FPUを有効にします

7.5.5ステップ5:ヘッダファイルはarm_math.h追加

7.6 IAR移植(移植ライブラリモード)でのDSPライブラリ

DSPライブラリ方法の最新バージョン7.7のアップグレード

7.8 DSPライブラリ関数の簡単な検証

7.9概要


 

7.1重要な初心者

  1.   IAR 8.30以上、CMSISの使用バージョン5.6.0以上使用してください。
  2.   IARは、ダウンロードとデバッグ方法、V6のユーザマニュアルを詳しく説明している説明書を作成するために動作します:http://www.armbbs.cn/forum.php?mod=viewthread&tid=93255

ダウンロード用の7.2 DSPライブラリと

我々は公式の移植DSPライブラリに詳細に説明し、以下の。

7.2.1 DSPライブラリのダウンロード

ダウンロードは、ダウンロードCMSIS DSPライブラリパッケージですので、CMSIS DSPライブラリは、パッケージ(Cortexマイクロコントローラ・ソフトウェア・インタフェース規格)の内部に含まれています。ここでは、ダウンロードすることができる3つの場所は以下のとおりです。

  •   方法1:STM32CubeH7は、内部をパッケージ化します。

パッケージの各バージョンには、キューブCMSISフォルダを運びますが、古いバージョンでは推奨されません。でも、最新のCubeH7

パッケージは、パッケージには、ビット低いバージョンCMSISが含まれています。

  •   第二の方法:MDKのインストールディレクトリ(以下は、バージョン5.6.0へのパスです)。

あなたはMDKの新しいバージョンをインストールした後、CMSISパッケージがパスに存在しています:ARM \ PACK \ ARM \ CMSIS \ 5.6.0 \ CMSIS。

新しいバージョンの場合、我々は、最新バージョンを使用することをお勧め、ソフトパッケージのダウンロードMDK:http://www.keil.com/dd2/Pack/を

  •   三つの方法:GitHubの。

GitHubのを介して利用可能な、またアドレスより便利である:https://github.com/ARM-software/CMSIS_5あなたはCMSISパッケージをダウンロードすることができます右上隅をクリックします。

もちろん、あなたはまた、検索機能を介して情報を見つけることは頻繁にアップグレードしてわずか2年ARM、ARMの公式ウェブサイトの公式ウェブサイトをダウンロードすることができ非常に面倒です。だから私は、データをダウンロードするには、公式ウェブサイトをARMにあなたをお勧めしません。

説明7.2.2 DSPライブラリ

ここでは、CMSIS V5.6.0への標準的な移植を持っています。CMSISライブラリファイル内のファームウェアを開き、次のファイルを見ることができます:

私たちが必要な場所DSPフォルダは次のとおりです。

以下の例のファイルフォルダは、主にいくつかの例を提供します:

 

DSPライブラリのヘッダファイル内のフォルダを含めます:

 

MDK(ARM)、IARとCGGライブラリファイル内部のlibフォルダ:

ファイル内のフォルダのプロジェクトは次のようである、申し出プロジェクトテンプレートの三つのバージョン、各テンプレート追加されたすべてのソースファイルで来るがあります:

次のようにソースファイルフォルダが、これはDSPのソースコードファイルで、次のとおりです。

7.3 DSPライブラリのバージョンとの違い

DSPライブラリのIARバージョン次のように:

 

  •   arm_cortexM4lf_math.lib

皮質-M4コアは、L FはFPUベルトユニット、M4単精度サポートのみ単精度浮動小数点を表す、リトルエンディアンフォーマットを示します。

  •   arm_cortexM4l_math.lib

皮質-M4コアは、Lは、リトルエンディアン形式を示しています。

  •   arm_cortexM4bf_math.lib

皮質-M4コア、Bは、ビッグエンディアン形式を表し、fはFPUベルトユニットを示し、M4単精度浮動小数点のみ単精度をサポートします。

  •   arm_cortexM4b_math.lib

Cortex-M4コア、Bはビッグエンディアン形式を表します。

 

STM32F4はM4コア、単精度浮動小数点で、我々はライブラリを選んだので、一般的に、リトルエンディアンフォーマットを使用します

arm_cortexM4lf_math.lib

7.4定義済みマクロいくつかの重要な意味DSPライブラリ

ユーザーの要件によると、これらの事前定義マクロはIAR事前に定義されたオプションに追加することができます。

ここではこれらのいくつかの定義済みのマクロが導入されます。

  •  ARM_MATH_BIG_ENDIAN:

ビッグエンディアン形式。

  •  ARM_MATH_MATRIX_CHECK:

検出は、入力、出力サイズをマトリックス。

  • ARM_MATH_NEON:
  • ARM_MATH_NEON_EXPERIMENTAL:

どちらM0、M3、M4及びM7カーネルはNEON命令をサポートしていないため、必要がARMv8.1-Mアーキテクチャへのアップグレードを待つために、以下のこと。

  •   ARM_MATH_ROUNDING:

主フロートスイッチQ32、Q15及びQ7に使用される、丸めと同様のプロセスは、他の機能に無駄です。

 

  •   ARM_MATH_LOOPUNROLL:

4群、高速実行の少量の治療のために。

絶対値関数に従うことで、あなたは簡単に違いを見ることができます:

ボイドarm_abs_f32(
  CONST float32_t * pSrcを、
        float32_t * pDstに、
        のuint32_tのblockSize)
{ 
        のuint32_t blkCnt。/ *ループカウンタ* / 

#ifの定義(ARM_MATH_NEON)
    float32x4_t VEC1。
    float32x4_t解像度; 

    / *を計算する時に4つの出力* / 
    blkCnt =のblockSize >> 2U。

    一方、(blkCnt> 0U)
    { 
        / * C = | A | * / 

            / *を計算する絶対値と、宛先バッファに結果を格納します。* / 
        VEC1 = vld1q_f32(pSrcを)。
        RES = vabsq_f32(VEC1)。
        vst1q_f32(pDstに、RES)。

        / *インクリメントポインタ* /
        pSrcを+ = 4。
        pDstに+ = 4。
        
        / *デクリメントループカウンタ* / 
        blkCnt--。
    } 

    / *テール* / 
    blkCnt =のblockSize&0x3の。

#ELSE 
定義(ARM_MATH_LOOPUNROLL)#IF 

  / *ループアンローリング:時間* / 4で出力計算
  blkCnt =のblockSize >> 2U。

  一方、(blkCnt> 0U)
  { 
    / * C = | A | * / 

    宛先バッファ内の/ *を計算し、絶対及び店舗結果。* / 
    * pDstに++ = fabsf(* pSrcを++)。

    * pDstに++ = fabsf(* pSrcを++); 

    * pDstに++ = fabsf(* pSrcを++); 

    * pDstに++ = fabsf(* pSrcを++); 

    / *デクリメントループカウンタ* / 
    blkCnt--。
  } 

  アンロール/ *ループ:計算残りの出力* / 
  blkCnt =のblockSize%0x4U。

#else 

  / *サンプルの数に初期化blkCnt * / 
  blkCnt =のblockSize。

#endifの/ *の#if定義(ARM_MATH_LOOPUNROLL)* / 
#endifの/ *の#if定義(ARM_MATH_NEON)* / 

  ながら(blkCnt> 0U)
  { 
    / * C = | A | * / 

    宛先バッファ内の/ *を計算し、絶対及び店舗結果。* / 
    * pDstに++ = fabsf(* pSrcを++)。

    / *デクリメントループカウンタ* / 
    blkCnt--。
  } 

}

7.5 IAR移植(移植ソースモード)のDSPライブラリ

ここでは、移植されたDSPライブラリが比較的容易であり、ソースの上にIARに移植DSPライブラリを下げる方法を説明します。

7.5.1ステップ1:IARプロジェクトを作成し、DSPライブラリを追加

V7-001_マーキー・ルーチンをテンプレートとして追加することができます(ノートたとえば、我々はバージョンHALを使用している):あなたの便宜のために、我々はここで開発ボードの例にMDK、V6の特別プロジェクトが直接確立することはなくなりました。オープンの例と左側にこのパケットCMSIS / DSPを追加します。

私たちは、単に要約ファイルは、Cのファイルが含まれて追加し、ここで各Cソースファイルを追加する必要はありません、CはBasicMathFunctions.cファイルが含まれているなどのファイル:

#include "arm_abs_f32.c" 
の#include "arm_abs_q15.c" 
の#include "arm_abs_q31.c" 
の#include "arm_abs_q7.c" 
の#include "arm_add_f32.c" 
の#include "arm_add_q15.c" 
の#include "arm_add_q31.c" 
#などが"arm_add_q7.c" 
の#include "arm_dot_prod_f32.c" 
の#include "arm_dot_prod_q15.c" 
の#include "arm_dot_prod_q31.c" 
の#include "arm_dot_prod_q7.c" 
の#include "arm_mult_f32.c" 
の#include "arm_mult_q15.c" 
の#include "arm_mult_q31.c" 
の#include "arm_mult_q7.c" 
の#include "arm_negate_f32.c" 
の#include "arm_negate_q15.c"
#include "arm_negate_q31.c" 
の#include "arm_negate_q7.c" 
の#include "arm_offset_f32.c"
#include "arm_offset_q15.c" 
の#include "arm_offset_q31.c" 
の#include "arm_offset_q7.c" 
の#include "arm_scale_f32.c" 
の#include "arm_scale_q15.c" 
の#include "arm_scale_q31.c" 
の#include "arm_scale_q7.c" 
# "arm_shift_q15.c"が含まれる
の#include "arm_shift_q31.c" 
の#include "arm_shift_q7.c" 
の#include "arm_sub_f32.c" 
の#include "arm_sub_q15.c" 
の#include "arm_sub_q31.c" 
の#include "arm_sub_q7.c"

その結果、IARコンパイラは自動的に関連付け、ビューのソースコードに非が便利:

7.5.2ステップ2:インクルードパスを追加します。

DSPのために必要なパスを含める追加、このヘッダファイルのパスは、すでに良いテンプレートプロジェクトに追加しましたが、ここにあなたとそれを強調しています。

ここでは、パスライブラリ\ CMSISは、既にヘッダファイルが含まれているDSPライブラリを含める\ので、これは、インクルード\ライブラリ\ CMSIS \ DSPを追加せずに、ヘッダ内になる含める\なぜ直接パスを追加ライブラリ\ CMSIS、それを注意する必要があります。

7.5.3ステップ3:マクロ定義を追加します。

ここでは、唯一のマクロ定義ARM_MATH_LOOPUNROLLを行うことができます。

7.5.4ステップ4:FPUを有効にします

STM32F4単精度浮動小数点サポートによりお客様が歌う精度を開くには、ここで、MDKにより、FPUを開く必要があります。

7.5.5ステップ5:ヘッダファイルはarm_math.h追加

ファイルには、DSPライブラリ関数を追加する必要が使用する#include「arm_math.h」あなたはAPI DSPライブラリを呼び出すことができます。これは、移行DSPライブラリを完了します。

7.6 IAR移植(移植ライブラリモード)でのDSPライブラリ

移行方法は、追加ライブラリを加えたソースコードを変更し、同じ、最初の段差部異なる章7.5です。

DSPライブラリ方法の最新バージョン7.7のアップグレード

リアルタイムの更新をしようとするCMSISパッケージは、最大で簡単な方法が提供されるので、この章のセクション7.1で説明したように、最新バージョンのCMSISパッケージをダウンロードし、CMSIS DSPプロジェクトフォルダ内の、その後の直接カバレッジ。

7.8 DSPライブラリ関数の簡単な検証

ここでは、私たちのポータブルDSPライブラリを検証するために、arm_abs_f32、arm_abs_q31、arm_abs_q15これらの3つの機能を実行し、正しいです。

例をサポートします:

次の2つの例をサポートするこの章:

  •   V6-200_DSPプログラムテンプレート(ソースモード)
  •   V6-201_DSPプログラムテンプレート(ライブラリモード)

目的:

1.移植の公式DSPライブラリ学びます

実験:

1.キーを押すK1、シリアルプリンタ出力機能arm_abs_f32

2.キーを押しK2、シリアルプリンタ出力機能arm_abs_q31

3.キーを押しK3、シリアルプリンタ出力機能arm_abs_q15

実験の現象:

       (それぞれ数回K1、K2、K3)を次のようにシリアルポートのPCソフトウェアに目を通すには、情報の現象を印刷するのSecureCRT。コンパイラは、この章のセクション7.7で述べた問題に特に注意を払って、MDK AC6エンジニアリングである場合。

プログラミング:

設計プロセスは、異なる印刷機能DSPライブラリの実行結果は、メインプログラムは、以下のように、異なるキーを押すことによって、比較的簡単です。

#include "bsp.h" / *基盤となるハードウェアドライバ* / 
の#include "arm_math.h" 



ルーチンルーチン名とリリース日* /の/ *定義
の#defineて、example_name "V7 ARMのDSP-移植テンプレート(ソースモード)" 
# EXAMPLE_DATEは、 "2019年7月31日" DEFINE 
の#define DEMO_VER "1.0" 

;静的な無効PrintfLogo(無効)
静的な無効PrintfHelp(ボイド); 

/ * 
******************* ************************************************** ************************************ 
*関数名:メイン
*機能:Cプログラムエントリ
*字パラメータ:なし
*戻り値:(処理なし)のエラーコード
************************************* ************************************************** ************************************************** 
* / 
メイン(ボイド)INT 
{ 
    ucKeyCode uint8_t。/ *キーコード* /
    pSrcをはfloat32_t; 
    float32_t pDstに、
    q31_t pSrc1と; 
    q31_t pDst1; 
    q15_tベクトルpSrc2; 
    q15_t pDst2; 

    
    / *ハードウェアの初期化* /; bsp_Init() 
    
    )(PrintfLogo; / *など、ルーチン名とバージョンを印刷* / 
    PrintfHelp(); / *先端印刷動作* / 

    bsp_StartAutoTimer(0、100); / * * / 100ミリ秒のオートリロードタイマを起動
    
    周期* /の/ *メインルーチン
    ながら(1)
    { 
        / *機能は、CPUが、アイドル状態のときに実行されます* bsp.c / 
        bsp_Idleは();         
        
        / *分析タイマのタイムアウト時間* / 
        IF(bsp_CheckTimer(0))     
        { 
            / * * 100ms毎に一度入ってくる/ 
            / * LED2倒立状態* / 
            bsp_LedToggle(2);     
        }

        / *イベントの処理* / 
        ucKeyCode bsp_GetKey =(); 
        IF(ucKeyCode> 0)
        { 
            / *キーが押される* / 
            スイッチ(ucKeyCode)
            { 
                ケースKEY_DOWN_K1:/ *キーのKI * /押され
                    pSrcを- = 1.23f。
                    arm_abs_f32(&pSrcを、&​​pDstに,. 1); 
                    のprintf( "pDstに=%F \ R&LT \ N-"、pDstに); 
                    BREAK; 
                    
                ケースKEY_DOWN_K2:/ * K2押鍵* / 
                    pSrc1と- = 1; 
                    arm_abs_q31(&pSrc1と、&​​pDst1 ,. 1 ); 
                    のprintf( "%D pDst1 = \ R&LT \ N-"、pDst1); 
                    BREAK。

                ケースKEY_DOWN_K3:/ * K3键按下* / 
                    ベクトルpSrc2 - = 1; 
                    arm_abs_q15(&ベクトルpSrc2、&pDst2、1)。
                    printf( "pDst2 =%D \ R \ n"は、pDst2)。
                    ブレーク; 
                
                デフォルト:
                    休憩; 
            } 
        } 
    } 
}

7.9概要

公式のDSPライブラリの移植を紹介するチュートリアルで主な問題、移植は比較的に言えば、比較的簡単ですが、初心者の学生は、再びこのステップの移行に従うことをお勧めします。

 

彼は189元の記事を発表 87ウォンの賞賛 ビュー60000 +

おすすめ

転載: blog.csdn.net/Simon223/article/details/105365823