ガレスタさんのDIY日記

電子回路、Web、組み込み、自作エフェクターを語るblog

日記

最近STM32ネタかけてなくてすいません。
やって行きたいものに関しては決まっていて

  • Memory to memory DMA
  • VFPU命令の確認(SP、DP)
  • SIMDに関して
  • SDカード関連

こんなかんじです。

一方でi.MX RT1020でやりたいことも結構あって

  • DMA Manager
  • USB CDC
  • I2C
  • UART
  • SAI(FIFOの使い方)

この辺ですかね

RTラインナップがふえている!?

RTシリーズ結構増えてきてるみたいですね。
f:id:gsmcustomeffects:20181124035232p:plain

1064は内蔵ROMになったぽいけど内部バスがQuadSPIらしいので実行はXIPになるのかな?
RT685のほうはデュアルコアなのでその辺どうなるのかなっていう

CortexM33のコプロセッサバス機能を利用したPowerQuad hardware acceleratorとか地味に気になっている。
先日のET2018ではさっそくデモ展示が行われておりARMの渡會さんのつぶやきでこのような画像が。

これはLPC5500(マルチコアマイコン)だがRT685に実装されるPowerQuadと同様なものなので同じように解釈してもよさそう。
肝心なスペックだがサイクルを見ても10倍以上速いことになる。
FFT 512が35usで回るというのならかなり期待だ。

これについてあまり詳しくない方もいると思うので
補足するとオーディオの場合は48kHzとかで信号処理を回すと思うんだけど一個当たりのデータ処理に使える時間は約1/48000 = 21usとなる。
ブロック処理にした場合21us * 512分だけ処理時間として用意されるのでだいぶ余裕があることになる。
はたまたLPC5500は100MHzなのでRT685の300MHzだともっと早いのかな?

Cadence® Tensilica® Hi-Fi 4 audio DSP の場合はHardware Floating Point Unit. Up to four single-precision IEEE floating point MACs per cycleとあるのでほえーってなった。
普通FPU演算は12サイクルとか使うもんだと思ったけど・・・・・

エフェクターに関して

Metriqというパラメトリックイコライザについて設計を行っている。
f:id:gsmcustomeffects:20181124042101p:plain

主な機能

  • 周波数可変(3帯域)
  • Quality factor可変
  • ブーストカット

こんな感じ。
今のところ電源を両電源にしたいんだけどなんのチップを使うか検討している最中。

というわけで日記はこんな感じ

フラックスとフラックスクリーナーのあれこれ

趣味の範囲で表面実装部品あつかうと手付けが多いんですがその際フラックスを結構使うことが多いです。
フラックスは一般に金属表面の活性剤として機能する薬品です。
調べれば出てきますけど有機酸などの添加物が金属表面のO結合を取り除くことで金属表面酸化物を取り除いています。

いかに主な市販品を並べてみます。

液体フラックス

フラックス(画像クリックでリンク

大容量フラックス(画像クリックでリンク

通常のリード部品のフラックスアシストなら液体が楽です。

ゲルフラックス

普通Amtechの偽物が多いんですがパッケージも得に誇張してないので信頼できそう
https://ja.aliexpress.com/store/product/Free-Shipping-solder-paste-100g-Flux-Paste-for-BGA-soldering-station-Solder-Tin-Cream/2942090_32825534891.html?spm=a2g11.12010108.1000016.1.1fff3dc8OtIc6v&isOrigTitle=true
f:id:gsmcustomeffects:20181118065006p:plain

RMA-218(おそらく偽物?だけど普通に使える
f:id:gsmcustomeffects:20181118065142p:plain

NC-559とNC-223(NC-223はAMTECH本家のRMA-223のパクリ?
f:id:gsmcustomeffects:20181118071445p:plain

色は違うけどどっちもNO Cleanのものらしい
どっちもSn63/Pb37、Sn42/Bi58に対応してるので趣味で変える半田使う分には関係ないみたい。

ちなみに多少高いけどAMTECH Directっていう販売サイトで本家のが買える
AMTECH Solder Flux - Genuine Flux - Factory Price
本家では水洗浄できるのも売ってるので超音波洗浄機もってる人は純水でいけそう
このVS-213-A-TF No-Clean ってやつはSn42/Bi58, Sn42/Bi57.6/Ag0.4, Sn43/Pb43/Bi14, Sn62/Pb36/Ag2, Sn62.8/Pb36.8/Ag0.4, Sn63/Pb37, Sn60/Pb40, Sn96.5/Ag3.0/Cu0.5, Sn99/Ag0.3/Cu0.7, Sn96.5/Ag3.5, Sn99.3/Cu0.7, Sn95/Sb5, Sn95/Ag5とかなりの半田に対応している。 ぬれ製の改善だったりで銀入りを使う半田も増えてきているのでこういったのに対応しているのはうれしいのかもしれない。
f:id:gsmcustomeffects:20181118072549p:plain

一方でAmtechのなかでもUltra low voidingとうたっているのでボイド*1も少なくできるのであろう

RMAってのはMIL規格の中で規定されている樹脂系フラックスのことで

  • R:活性剤を含まないもの。腐食の原 因となる化学物質を含まないため、電子素子など高い信頼性を必要とされる場合に利用される。
  • RMA:フラックスのはんだ付け能力を高めるために、少量の活性剤を加えたもの。3種類の中で、信頼性・はんだ付け性ともに中間に位置する。
  • RA:RMAよりさらに多くの活性剤を加えたもの。より良好なはんだ付け性が必要とされる場合に利用される。

活性剤には有機酸、アミンなどが使用される。

洗浄剤について

次にフラックスを洗浄するための洗浄剤の話
洗浄剤は一般にはIPAなどをはじめ有機溶媒が用いられていたのですが結局プラスチックパッケージなどを犯すために代替フロン(アサヒクリンとかそのへん)とかが使われるようになったらしい
実際アサヒクリンをはじめハイドロクロロフルオロカーボン系は6000円ぐらいするので高いです。

なので個人メイカーだと無水エタノールを使用することが多いみたい。
無水エタノール(画像クリックでリンク

これは量が多くてそれなりに落ちるんですけどまあ白い粉が吹く(フラックス結晶の晶析?)のでなんかしら強力な溶媒でさらうなりしないと落ちないですね。
実際一回でも洗浄してれば腐食リスクはかなり下げれるのでいいっちゃいいんですけど見た目気にするならフラックスクリーナー使うかなって感じですね。

フラックスクリーナー(画像クリックでリンク

これ結構落ちますね。 その分匂いもきついんですが・・・・

そんなわけで僕はエタノールで軽めに落として最後こいつでスプレーして落としてる感じです。

ぶっちゃけると別に試作なら何やってもいいので含水率低い有機溶媒使えばいいかなって感じ

ネオエタノールP-7 [14kg] 大伸化学株式会社(画像クリックでリンク


*1:はんだ間にできる空洞のこと、クラックや劣化の原因ともなる。資料としては株式会社クオルテック様のPPT資料がためになる

進捗的なやつ

最近外出先でOnshape使って家ではFusion360つかうみたいな流れで設計している。


こんな感じで外出先でポチポチ作ってDXF or STEPで吐きだして家でFusionでレンダーしたりしてます。

最初からFusion360でやることもあるけど・・・・・

そんなわけでレンダー結果がこんな感じ
f:id:gsmcustomeffects:20181117061045p:plain

結構いけてる感じ。

というわけで次は中身であるParaEQの回路図を検討していきたいと思っていてGyrator回路とか検討している

f:id:gsmcustomeffects:20181117061346p:plain

シミュレーテッドインダクタ回路とかいう名前でも呼ばれている。

今後のネタというかサーベイした資料とか

読みたい本、おすすめの本など

ここには僕が読んだ本とか読みたい本とかを載せてく予定
画像クリックでリンクに飛びます

最新の本でなければ図書館で借りれるのでその辺も利用していきたい

読みたいやつ

Designing Audio Effect Plug-Ins in C++

目次見た感じ信号処理一通り説明してくれてる感じ。
RackAFX、VST3向けに書かれているのでVST作りたい人にもいいかもね

Designing Software Synthesizer Plug-Ins in C++


上のと同じでこれはシンセ向きらしい

感想としては洋書ニッチなのあるねえって感じ。

これなら分かる最適化数学―基礎原理から計算手法まで

杉本先生の地盤工学という授業を受けていて最適化の話が出てきてレーベンバーグマーカート法(改善マルカート法とも呼ばれる)というものを扱っている。
そちらで参考になる図書を探したらこれが紹介されてたので読んでみたいなという感じ。

数理最適化の中では結構有名な本らしいので早いうちに手にしたい

世界標準MIT教科書 Python言語によるプログラミングイントロダクション第2版(画像クリックでリンク)


Pythonで学ぶ実践画像・音声処理入門

2018年出版の比較的新しいしコロナ社なので内容的に期待できる。
ネットの情報だったりPaperの実装例はMATLABなことが多いのでPythonでちまちま書くには参考になるのではないかと思って気になっている。

Physical Audio Signal Processing: for Virtual Musical Instruments and Digital Audio Effects

Stanford大学のJulius O. Smith III教授の書いた本
Center for Computer Research in Music and Acoustics (CCRMA)っていうチーム(組織?)で研究していて結構幅広いものが無料で公開されている

この本自体はHTMLでは公開されているのだがPDF版がないので普通にほしいなという感じ

個人的にはリバーブアルゴリズム関連が結構乗っているのでうれしいって感じ(Schroeder Reverberators、FDN、..)

ディジタル回路設計とコンピュータアーキテクチャ[ARM版]

マイコン始めて低層いじり始めたらアーキテクチャについてちょいちょい興味がでてきてARM特化した本があったので読みたいなという感じ

ヘネシー&パターソン コンピュータアーキテクチャ 定量的アプローチ第5版

通称ヘネパタ本
それの和訳版。

今は6th editionの原著が出ているらしい

その他リンクは此方

アルゴリズムイントロダクション

大学の最適制御の授業で動的計画法をやった時に参考文献として挙がっていた本
その時は原著だったので英語だったが和訳版も出ていたみたいなので普通に一回読んでみたい。

RISC-V原典 オープンアーキテクチャのススメ

流行りのオープンソースアーキのRISC-Vの本
書いてるのはヘネパタのパターソン教授

2018年出版の新書なので普通に読みたい

全部ネット接続!Ethernetマイコン・プログラミング (TECH Iシリーズ)

CQ出版のTechIシリーズの本
トラ技、Interfaceに比べてさらに低層組み込み向けの雑誌という印象。
これはEthernetを特集したやつlwIPについてのっているそうなので読みたいなという感じ

定番!超軽量マイコン用ファイル・システムFatFs

CQ出版のTechIシリーズの本
ChanさんでおなじみのFATfsの特集本ですね

本人の本なので普通にコレクションとしてほしい

Pythonによる数理最適化入門 (実践Pythonライブラリー)

最近好んでやっているPython数値計算シリーズ

まあ理論勉強しつつPythonの豊富なライブラリで答え合わせまでできるので結構実用的。
Numpy.Sympy,Scipyなども勉強できるはず。

Data Fitting and Uncertainty: A practical introduction to weighted least squares and beyond


読んだやつでおすすめのやつ

KiCad×LTspiceで始める本格プリント基板設計[DVD付き](TRSP No.142) (トランジスタ技術SPECIAL)

ビアとかリターン経路とか細かいとこのハンドブックとしておすすめ。
ほんとに詳しい情報はメーカーのデータシートと合わせて読んでいくのがお勧め。

アートワークだけでなく部品配置などを学びたい場合は村田の解説資料が良かったと思う
https://www.murata.com/~/media/webrenewal/support/library/catalog/products/emc/emifil/c39.ashx?la=ja-jp

やり直しのための信号数学―DFT、FFT、DCTの基礎と信号処理応用 (ディジタル信号処理シリーズ)

デジタル信号処理シリーズは全部おすすめである
信号処理を始めたてのころに大学の図書館で読んだ記憶があるが数式の展開とかまできっちり書いてあるので学生のレポート作成などに役立つと思う。
そのほかプレゼン資料を作るときのハンドブックとしてもそこそこ役立つと思う。


サウンドエフェクトのプログラミング―Cによる音の加工と音源合成

デジタルエフェクター始めるにあたっていろいろ探していたときに発見。
ダブルバッファによるデータ転送とかリアルタイムも考え書かれているので体系的な知識を得たい方にもおすすめである。

個人的には発弦アルゴであるKarplus-Strong string synthesisについて触れられているのが良いなと思った。

DAFX: Digital Audio Effects

オーディオエフェクトに特化した信号処理の本

空間系から適応フィルタリングまでふれているニッチな本
洋書だけあってページ数も半端ない

エフェクタやるなら買うべき

音遊び!Blackfin DSP基板でディジタル信号処理初体験

これもエフェクトに特化した内容がかかれている本
アナログデバイセズの16/32ビットDSPであるblackfinを用いたIFX49(付属基板)で信号処理をする本
信号処理の基礎の部分とBlackfinの基礎の部分両方に触れられていてじっくり読めばエフェクタをどうやって構成すればいいかわかる良本

実際に開発をするならCCESという有料の開発環境があるのだがこの本ではUARTブートローダーを用いて書き込みをできるようにしていてそこら辺は優しい。

リンカ・ローダ実践開発テクニック―実行ファイルを作成するために必須の技術 (COMPUTER TECHNOLOGY)

リンカースクリプトについて結構真面目に解説している和書で唯一の本といってもいいぐらいの本
マイコンを使う際にメモリ配置とかセクターを区切ってメモリを使うとかそういうところで困っていた時に助けられた本。
僕が尊敬するidさん(@idt12312)もおすすめしている本である。

著者の坂井さんはOS関連の本を多く出しているのでその辺もチェックしてみるといいと思う

ARMマイコンCortex-M教科書

みたままARMの本です。
教科書とありますが微妙かな。
一応しくみ的なのは網羅しているので初心者にはいいと思います。

後半はほとんど最近のCortexMマイコンのメーカー固有機能の解説になっちゃってます。
著者が桑野さん(正確には中森さん、桑野さん)なのでKinetis推しの書き方になっていますけど各社のflashアクセラレータについても触れられているので読み物としていったん通るのはありだと思います。

STM32のMCO2からPLLI2Sクロックを出力してみる

今回はSTM32のMCO(Master Clock Output)の機能を使ってPLLI2Sのクロックを出力してみる。
品質はどうなのかわからんけど主に外部オーディオコーディック用のMLCKとかに使えそうな予感

通常のMCO1に関しては以前やっている(STM32F3での実施)ので基礎に関しては以下の記事を参照
gsmcustomeffects.hatenablog.com

今回はSTM32F767を使うので上記の記事のレジスタ構成と多少異なる部分があるが基本は同じなのでリファレンスマニュアルを見るなりして対応してほしい

今回の試験環境

  • STM32F767 Nucleo144 board (評価ボード)
  • CubeMX Ver4.27(CubeF7 latest)(SDKというかHAL)
  • Atollic TrueStudio(IDE
  • RIGOL DS1054(オシロスコープ

というわけでやって行こう!

CubeMXでの作業

f:id:gsmcustomeffects:20181027232016p:plain

まずピンコンフィグ画面でMasterClockOutput2のチェックを入れる

f:id:gsmcustomeffects:20181027232647p:plain

次にクロック画面でPLLの設定とMCO2の設定をしてあげて24MHzあたりを出せるように設定してください

それが終わったらCubeから出力してください

AtollicTrueStudioでの作業

次にIDEでの作業ですがMCOの場合は何もいじらなくても初期コードだけで済みます。

まあそうはそうなんですがHALにバグ?みたいのがありましてクロックコンフィグ内の低レベルAPIを修正してあげないといけません

内容としてはSystemClock_Configの内部で呼ばれているHAL_RCCEx_PeriphCLKConfig内のI2SPLL部分です。
f:id:gsmcustomeffects:20181027233547p:plain

以上を修正したらビルドして書き込みしてください

見てみる

nucleoを使っているならここにオシロでもあててみてください

f:id:gsmcustomeffects:20181027234443p:plain

上手くできていればこのように波形が出ると思います
f:id:gsmcustomeffects:20181027234346p:plain

所感

MCO2からクロックを出力できた。

主な用途としてはエフェクターなどに使われているAK4558(32bit 192khz audio codec)のMLCKとかですかね。
f:id:gsmcustomeffects:20181027235224p:plain

24MHz与えると様々なサンプリングに対応できるのでこういったクロック出力機能は便利なんじゃないでしょうか?

bugfixへのアドバイス

最後に僕がどのような手順でデバッグしているかの話です。

まずはレジスタの値を確認する方法です。
f:id:gsmcustomeffects:20181027234233p:plain
SFRに関してはこの画面からレジスタに書き込んだりもできるので便利です。

最初行き詰ったらここを見てきちんとレジスタにされるべき設定が入っているか確認してください
もちろんこのSFRのjson定義にもバグがあるかもなので過信しすぎるのもよくないですけどね・・・・・

次に変数だったり構造体のトレースができる式タブですね
一般にはexpressionという名前で呼ばれています。

f:id:gsmcustomeffects:20181027234921p:plain

最近のマイコンではSDKで構造体を多用するのが増えていてそのメンバに対してif分岐するのが多いのでなんでこのループに入らないんだろう?とかbitシフト結果がほんとに正しいの?とかそういった疑問を実際に見れるのでHALの動作のステップ確認では便利です。

以上の二つを駆使していろいろ見てみると動作の勉強にもなりますし自身でfixできる癖がつきますので時間を溶かさないようにこういった機能を駆使してみてください。

STM32CubeProgでUARTを使ったフラッシュ書き換えを試す

STM32に関しては久しぶりですが
今回はSTからリリースされたSTM32CubeProgというソフトについてみていこうと思います。

STM32CubeProg

www.st.com

簡単に説明すると

STlink utility とかflash loaderとかdfuツールとかそういうのが一緒になってWindows,Mac ,Linuxに対応したものです。
以前できたことは一通りできます。

というわけで・・・・・

SWD接続とかDFUはいろんな方がやっているので
UARTブートローダーでもやってみようと思います。

UART bootloader

UARTからバイナリをぼこぼこ投げて書き込みできる機能。
特にまあたらしい物でもないからこんなもんで早速やって行きましょう。

今回使うものはSTM32F767 Nucleoを使うのでそれ用の設定で説明していきます。

STM32F767の場合UARTは以下のものが使えます。
f:id:gsmcustomeffects:20181020085513p:plain

んでまあ見てわかるんですが注意が必要でUART3ってSTLINKとつながってるのでそれが使えるやん?思う方もいると思うんですがところがどっこい
f:id:gsmcustomeffects:20181020085624p:plain

ブートローダーで使えるピンと違うとこからUART3を出してるのでSTLINK経由では使えません(このせいでなんでつながらないんだろうと5分位悩みました。
問題が整理できたとこでPC10,11が使えるとのことからこの辺から引っ張ってあげましょう

f:id:gsmcustomeffects:20181020090002p:plain

STLINKのTX RXピンから延ばしてもいいのですがシリアル変換器はこの辺の使ってます
f:id:gsmcustomeffects:20181020090144p:plain

次にbootloaderに遷移するための準備です。
STM32の場合は基本BOOT1とBOOT0の設定でフラッシュブートとsystem bootloaderから起動するか設定できるんですがF7の場合BOOTピン一個になりまして起動アドレス指定ができるようになりました。
f:id:gsmcustomeffects:20181020091839p:plain

初期状態でBOOTをHIGHにするとsystem bootloaderでいけるという感じですね。オプションバイトに関してはCubeProgで書き換えたり今の状態を見たりできるのでその都度確認してみてください。
ピンで言うとここです
f:id:gsmcustomeffects:20181020092138p:plain

ココまで終わるとフローチャート的にはこうなります
f:id:gsmcustomeffects:20181020092315p:plain

というわけでBOOTピンをHIGHにしてリセットしてUARTで接続してみましょう。
つながるとこのようになります。
f:id:gsmcustomeffects:20181020092536p:plain

先ほど示したオプションバイトはこのように確認できます。
f:id:gsmcustomeffects:20181020092623p:plain

書き込みはこの画面からできます
f:id:gsmcustomeffects:20181020093101p:plain

所感

というわけでかなり簡単にフラッシュの書き換えができるというわけです。
近年デバッガが安くなってきており持ってると特に使わない機能なんですが

エフェクターとか開発してると弾き手とかそういう人とやりとりする機会が結構あってアルゴリズム詰めてる時向こうが書き込み機を持ってないときとかに便利です。
あとは製品出荷後にアップデートとかしたいときに使えます。

あとF7ならDFUで書くほうが何もいらないのでいいと思いましたw

おまけ

ブートローダーについてCubeProgが自動でやってくれるので特に必要ありませんがマイコン間とかでファーム書き換えする場合は自前で打つ必要があります。
f:id:gsmcustomeffects:20181020093528p:plain

BOOTピンをHIGHにして該当UARTに0x7Fを送るとUARTブートするみたいです。
それを送るとACKがかえるみたいなのでTeratermで実験してみた。
f:id:gsmcustomeffects:20181020093833p:plain

Teratermを16進表記するとわかりやすいのでココを参考にしてみてください
shuzo-kino.hateblo.jp

デバッグmodeにできたら
信号を送信していきます。

ここでもTeratermのマクロ機能が便利です。

send $7F

とすると0x7Fを送ってくれます。

保存はこのような拡張子にします
f:id:gsmcustomeffects:20181020094134p:plain

次に接続設定です。
f:id:gsmcustomeffects:20181020094223p:plain

パリティEVEN以外は得に変わりはないです。

そうしたら上部メニューからコントロール/マクロを選択 先ほどのiniファイルを選択すると

f:id:gsmcustomeffects:20181020094332p:plain

きちんと79が帰ってきています。

そのあとはマニュアル通りにコマンドを打ってあげると書き込みできます。

ちなみにteratermのマクロはいろいろできるのでプロトコルとかそういった通信テストには便利だと思いますので覚えておくといいでしょう。

資料など

  • AN3155 Application note USART protocol used in the STM32 bootloader
  • UM2237 User manual STM32CubeProgrammer software description
  • AN2606 Application note STM32 microcontroller system memory boot mode