STM32F4

新版FM音源プログラム (28)

gcc の「インライン・アセンブラ」で書いた ARMv7E-M (Cortex-M4) 版の acc_calc_slot() 関数のリストを下に示します。 「中身」は armcc 版と同等です。

新版FM音源プログラム (21)

STM32F4 シリーズには、「Adaptive real-time accelerator」(ART Accelerator) と称するフラッシュ・メモリ読み出しのためのキャッシュ機構が備えられています。 フラッシュの読み出し幅は 128 ビット (16 バイト) で、フラッシュ上の命令 (I-Code) に対して…

新版FM音源プログラム (20)

Cortex-M4 用の結果では、フラッシュのキャッシュ機構の構成が同じ STM32F446 と STM32F407 とがほぼ同じ結果で、別のキャッシュ機構を持つ STM32F303 がやや異なる結果となりました。 PSoC5LP にはフラッシュのキャッシュのヒット/ミスの回数を計測するレジ…

新版FM音源プログラム (18)

アセンブリ言語によるスロット (オペレータ) 計算プログラムでは、ARMv6-M (Cortex-M0) の 16 ビット Thumb 命令を主に使うこととし、ARMv7-M (Cortex-M3/M4) に対しては一部を 32 ビット Thumb2 命令で記述することにより効率化しています。 以下に、その「…

新版FM音源プログラム (17)

armcc の「エンベデッド・アセンブラ」では、関数まるごとアセンブリ言語で記述し、関数冒頭のレジスタ・セーブや、関数最後のレジスタ・リストアやリターン命令まですべてを記述する必要がありました。 gcc の「インライン・アセンブラ」では、C 言語での記…

新版FM音源プログラム (16)

オペレータ処理をアセンブリ言語で書く場合、C プログラム・ソースの構造体アクセスの o_p->ph_acc のような表現は、アセンブリ言語ソースとしては最終的には ldr r2, [r0, #4] のように「定数オフセット」にまで変換される必要があります。 C プログラム・…

新版FM音源プログラム (15)

今回は各種のチップ/コンパイラの組み合わせのオブジェクトに対する逆アセンブル・リストを掲載します。 もとの C ソース・ファイルでの記述を少し変えると、コンパイル後のオブジェクトはかなり大きく変化するので、あまり細部に渡る追及はしないでおきます…

新版FM音源プログラム (14)

プログラムを動作させるマイコン・ボードとしては、オペレータ出力波形をオシロで手軽にチェックするために、手持ちの中で DAC を内蔵するチップを搭載している次のボードを選びました。 Nucleo-F446RE (STM32F446RET6, Cortex-M4) STMF4-Discovery (STM32F4…

新版FM音源プログラム (13)

これまでのFM音源プログラムでは、オペレータ (スロット) ひとつ分を実現する関数を定義し、それをオペレータの個数だけ呼び出していました。 より効率化するために、ひとつの関数内ですべてのオペレータの計算を行なうように変更することを考えています。…

FPGA 版 FM 音源 (50) -- YMF297 (OPN3/OPL3) 測定 (15) -- EG クロック・プリスケーラ (2)

2016 月 11 月 18 日付けの記事 (→こちら) で述べた EG クロック・プリスケーラの動作は、よく考えればレート・マルチプライア (rate multiplier) そのものでした。 パイプライン方式で複数オペレータを実現する場合に各オペレータ固有の内部変数として 8 進…

FPGA 版 FM 音源 (49) -- YMF297 (OPN3/OPL3) 測定 (14) -- EG ミュート状態

リニア出力のアナログ EG では、ディケイ/リリース回路に 1 次 RC 回路の放電特性のエクスポネンシャル・カーブを利用していれば、時間の経過とともに出力電圧はサステインあるいはグラウンド・レベルへ限りなく接近していきます。 リリース状態で「放置」し…

FPGA 版 FM 音源 (48) -- YMF297 (OPN3/OPL3) 測定 (13) -- EG パラメタ・レジスタ

今回の小ネタは、OPL3 の EG パラメタ (AR/DR/RR) の値が有効になる (参照される) タイミングについてです。 結論から言えば、アタック/ディケイ/リリースで、その状態に対応するレート・レジスタ AR/DR/RR が選択されている限り、ラッチされることはなく常…

FPGA 版 FM 音源 (47) -- YMF297 (OPN3/OPL3) 測定 (12) -- サステイン・レベル

今回は、OPL3 の音色パラメタの「SL」(Sustain Level) と実際の EG 出力のサステイン・レベルの不一致についての話です。 音色パラメタの SL は 4 ビットの値で、dB 単位の出力レベルと各ビットとが下の表のように対応づけられています。 b3 : -24 dB b2 : -…

FPGA 版 FM 音源 (46) -- YMF297 (OPN3/OPL3) 測定 (11) -- EG クロック・プリスケーラ (1)

OPL3 の EG では、AR/DR/RR で指定するレートが 13 の場合に fs クロックごとに EG アキュムレータの値が変化するようになり、レートが 12 を含んでそれ以下になる場合には、EG アキュムレータを更新するクロックが fs を分周したもの (プリスケールされたも…

FPGA 版 FM 音源 (45) -- YMF297 (OPN3/OPL3) 測定 (10) -- モジュレーション入力

ほぼ 1 年前 (→2015 年 9 月 20 日の記事) に OPL3 モードに設定した YMF297 で、セルフ・フィードバックの経路に FIR LPF が存在することを確認しました。 そのときから気になっていたのですが、「普通」のモジュレーション入力のパスには LPF がなく、入力…

新版FM音源プログラム (12)

2016 年 1 月 1 日付けの記事 (→こちら) の 4 K エントリの場合と同様に、テーブル・インデクスを「マスク」する方法により、テーブル・サイズを 3.75 K (3840) エントリまで削減することができました。 また、4 K エントリの場合と同様に、符号の操作も併用…

新版FM音源プログラム (11)

2016 年 1 月 1 日付けの記事 (→こちら) の 8 K (8192) エントリの「ウェーブテーブル」を用いる方式で、波形の一部を共有するすることによりテーブル容量を 6 K (6144) エントリまで減らすことができました。 サンプルごとの処理では、8 K エントリ方式と同…

DAC 用 ディジタル・フィルタの特性測定 (3)

パイオニア PD00601 の測定を行ないました。 PD00601 は 2 DAC 出力モードのみをサポートする 8 倍オーバーサンプリング・ディジタル・フィルタで、 阻止域減衰量 53 dB 通過域リプル -0.046 ±0.023 dB SOP (1.27 mm ピッチ) 16 ピン・パッケージ というスペ…

DAC 用 ディジタル・フィルタの特性測定 (2)

パイオニア PD00601 の前に、NPC 製 SM5807ES の測定を行なうことにしました。 SM5807 も古い AV 機器から外してきたものですが、それが何の機器だったかは覚えていません。 SM5807 は 4 倍オーバーサンプリング用ディジタル・フィルタで、fs = 44.1 kHz に…

DAC 用 ディジタル・フィルタの特性測定 (1)

単体の (単純な) DAC と組み合わせてオーバーサンプリング DAC を構成するための、単体のディジタル・フィルタ IC の特性を測定してみました。 対象は YAMAHA の YM3434 で、昔の AV 機器 (MUSE-NTSC コンバータ) から外してきたものです。 昔、秋月で YM343…

新版FM音源プログラム (10)

FM 音源の「オペレータ」のフェーズ・ジェネレータ部、EG 部を除く、波形生成部分の計算量を見積もる作業をしています。 以下のような、波形テーブルのサイズの違う 3 種類のプロトタイプのプログラムを作ってみました。 8 K (8 × 1024 = 8192) エントリのテ…

FPGA 版 FM 音源 (40) -- YMF297 (OPN3/OPL3) 測定 (5)

ほぼ 1 年ぶりに、OPL3 モードに設定した YMF297 の出力を S/PDIF 経由でキャプチャしてみました。 それは、下の記事に示すように、フィードバック量が多い場合に出力波形が振動的になる現象を追求するためです。 FM音源プログラム(20) -- オペレータ(1…

新版FM音源プログラム (9)

STM32F4xx シリーズの DMAC は STM32F1xx シリーズの DMAC に比べて機能が拡張されており、ハードウェアで「ダブル・バッファ」機能をサポートしています。 これは、メモリ・ベース・アドレス・レジスタを「2 面」の DMA バッファに対応して 2 組持っていて…

新版FM音源プログラム (8)

BSP_AUDIO_OUT_Init() で初期化したあとは、 BSP_AUDIO_OUT_Play(uint16_t* pBuffer, uint32_t Size) で実際に DMA 転送によるオーディオ・データ出力を開始します。 第一引数 pBuffer は、配列要素がハーフワード (16 ビット) の DMA バッファ配列の先頭へ…

新版FM音源プログラム (7)

前回までの話は BSP (Board Support Package) ライブラリの「固定部分」を組み込むための手順でした。 手順 5. はユーザ・アプリケーションから API (Application Programming Interface) 関数を介して BSP ライブラリを利用する方法で、手順 6. は BSP ライ…

新版FM音源プログラム (6)

前回の記事の手順 3. に示した、開発環境にコンパイル/インクルード対象として登録すべき BSP_AUDIO_OUT 関係のファイルを下に示します。

新版FM音源プログラム (5)

STM32CubeFx ライブラリでは、HAL (Hardware Abstraction Layer) ライブラリ、BSP (Board Support Package) の他に、各ボード用のサンプル/デモ・プロジェクトが含まれています。 例として、STM32CubeF4 V1.7.0 の場合のフォルダ構成を下に示します。 主にST…

新版FM音源プログラム (4)

STM32CubeMX で新規プロジェクトを立ち上げる際のダイアログで「MCU Selector」タブではなく「Board Selector」タブを選ぶと、選択したボードで使われているピン (ポート) のコンフィギュレーションがあらかじめ設定されたプロジェクトが生成されます。 ただ…

新版FM音源プログラム (3)

BSP (Board Support Package) とは、その名の通り STMicro 製の Nucleo ポード類、Discovery ボード類、および各種の評価ボード類に実装されているペリフェラルをサポートするドライバ類のパッケージです。 これらは、以前の「Standard Peripheral Library」…

新版FM音源プログラム (2)

「ペリフェラル初期化 C ソースコード・ジェネレータ」である STM32CubeMX では、以下の開発環境によるビルドに対応しています。 ARM/Keil MDK-ARM IAR EW-ARM Attolic TrueSTUDIO AC6 SW4STM32 このうち、最初の 3 つは商用の開発環境で、STMicro 以外の他…