2018開発環境の紹介

ツールだったり調達先だったりをまとめてくれと前々から言われていたので簡単にまとめてみようと思う。
ハードウエア環境、基板メーカー、部品調達先、ソフトウエア環境な感じで紹介していく感じにしようかなと
というわけで今回はハードウエア面のことをやろうと思う。


ハードウエア

YIHUA 992DA+

まずはコテ
YIHUAの992DA+
f:id:gsmcustomeffects:20180402201521p:plain

こいつはAliexpressのYIHUAストアでセールをやっているときに180ドルぐらいで手に入れた。
コテ部分には温調機能とスモークアブソーバーがついているためフラックスを大量に使ったりするときに煙が舞わなくて良い。
海外製ということで消耗品の購入までのリードタイムが長すぎるとか心配する人もいるだろう。
なんと小手先はHAKKOのが使えるw
f:id:gsmcustomeffects:20180402211329p:plain

小手自体は流石に無理なのでこいつ(20ドル程度でヒーターはHAKKOらしい)
https://ja.aliexpress.com/store/product/YIHUA-907I-soldering-iron-for-weldering-machine-tools/401349_1853158228.html?spm=a2g11.12010612.0.0.569f60e0pG8BaX
f:id:gsmcustomeffects:20180402211141p:plain

その他ホットエアーがついている。
その他とは言ってもこれがついているので選んだところが大きい。

中華系サイトで探せば互換品がいくつもあるがこいつについてるホットエアーは結構しっかりしていて安物とは違う感じがある。
Twitterでよく耳にする風が強すぎてチップ部品が飛んでいく等の問題はないレベルまで風量を下げられる。
その他温度も400度ぐらいまで上がる(推奨はしないが)ので結構綺麗にリワークできる。

それ以外の詳細スペックは以下を参照されたい
ja.aliexpress.com

ANDONSTAR ADSM201

普通のHDMIマイクロスコープ
自身にも液晶がついてるがまあ補助程度基本はHDMIで使う方がいいだろう。
f:id:gsmcustomeffects:20180402205524p:plain
SMDパーツの半田付けやリフローのショートチェックに使っている。

あとは基板のリフローの接写とかそういうのにも使える。

山善ホットプレート

ホットプレートリフロー用に購入したもの。
安いので簡単な施策には必須。

基板焦げになりやすいという欠点があるので上にアルミブロックとか置くとヒートショックを避けれる。
参考までにツイート

ホットプレートでもここまで綺麗にできるぞっていう自慢

ピンセット

ピンセットはamazonで買える安いやつ。

先曲がりとストレートが一個づつあるといいと思います。

ディスペンサ

注射器とかシリンジとかその類の話

使用用途としてはフラックス添加とかステンシルがない時のペースト半田印刷

参考ツイートをいくつか貼る。



使っているのはここの青いチップ
https://ja.aliexpress.com/store/product/0-5-Tubing-Length-100-PCS-X-22G-TE-Premier-Dispensing-Tips-dispensing-tips-dispensing-needle/1503742_32627886559.html?spm=a2g11.12010612.0.0.141b46f20TfhQ0

本体はこれ
https://ja.aliexpress.com/store/product/3CC-Manual-Glue-Dispensing-Syringe-Applicator-for-precisely-dispensing-pastes-sealants-and-epoxies/1503742_32219596623.html?spm=a2g11.12010612.0.0.306fb73dh7uskB

本体は好きなの選べばよいがチップを装着する部分がねじ込み式のロックがあるやつを選んだほうがいい。
理由として半田ペーストの粘土が思ったより高いためロックがないタイプのを使うと先端が飛んでいって悲惨なことになる。(僕はこれでなんども萎える経験をしました。)

そのほか補足をしておくと
先端はgという単位で扱われていて数字が大きくなるほど細い
f:id:gsmcustomeffects:20180402223017p:plain

よくわからなければこのようにセットのを買ってみて自分好みのを探すのも良いだろう。
https://ja.aliexpress.com/store/product/1-4-Tubing-Length-100-PCS-TE-Premier-Dispensing-Tips-dispensing-needles-Glue-Dispensing-Tip/1503742_32625074730.html?spm=a2g11.12010612.0.0.45062766LsQwVW


余談だがフラックスを添加するにはこのぐらいの太さがいい(ペーストより多めに添加するため)
https://ja.aliexpress.com/store/product/16G-2-Dispensing-Needles-Tips-For-Glue-100pcs-bag/1503742_32389438536.html?spm=a2g11.12010612.0.0.45062766BYLuVg


ペースト半田およびフラックス

リフローに使う半田と金属表面活性化のためのフラックス

半田はここのを使っている。
https://ja.aliexpress.com/store/product/Leaded-SMT-solder-paste-LED-dedicated-solder-paste-Sn63Pb37-500-grams/2942090_32805542877.html?spm=a2g11.12010612.0.0.405479aeiF6tRC

このケースは結構見るがこのストアは色々な種類を扱っており安心感がある。(まあ他のだと製造日がクソみたいの送ってきて期限がすぎてたりする。)

使用感はこんなもん(フラックスで多少の粘度調整を入れている

Twitterではこのタイプ使ってる人をよく見るけど内蓋のパッキンがないのですぐカピカピになる。
f:id:gsmcustomeffects:20180402224002p:plain

僕の知り合いのあろえさんとかはこれ使ってるらしいけどあの人みたいに一回で結構使わない人だとこれよくない説はある。
無論上記の500gも微妙なところではあるが今の所1年経っても動画のように粘度は低いままだ。

ちなみに鉛フリーも売っている。
https://ja.aliexpress.com/store/product/ECO-solder-paste-M705-s101zh-s4-lead-free-solder-paste-containing-silver-Sn96-5-ag3cu0-5/2942090_32826369659.html?spm=a2g11.12010612.0.0.bed09537RopKNT

見た目はSMICのeco solderっぽい。
ag3.0%って結構いいやつっぽいのでlead freeならこれかな。

無論こっちでもいいのだけれど
https://ja.aliexpress.com/store/product/High-temperature-lead-free-SMT-solder-paste-BGA-solder-paste-special-mobile-phone-repair-Sn99-Ag0/2942090_32807755672.html?spm=a2g11.12010612.0.0.bed09537XlqVBP

ちなみにビスマス含有の場合鉛とか混ざるとクラックがやばいらしいので注意が必要だ。

次にフラックスの話。

コテ使う場合は基本液体の方使ってる。

なぜかでかいの使ってる。
前勤めてた会社で一個もらったのでこんなにでかい。

長くコテ当てたりリフローする場合はこっち使ってる
吉田 YT 60 bga はんだフラックスペーストはんだ 100 グラム SMT を Reballing|flux paste solder|solder flux pasteflux paste - AliExpress


あとはこれ(多分中はあんまし変わらない
Pjlsw はんだペースト,ミルキーホワイトNC 559 ASM g,bga,はんだフラックス,送料無料|solder flux paste|flux pastebga solder flux paste - AliExpress

元ネタ(純正のわけがないw)はamtechのフラックスなんですけど洗浄ありとか無洗浄とかあるけどケースの色で分けてるんかね?(その辺はわかりませんのでとりあえず洗浄することにしてる。

最後にリムーバー

無水エタ使ってる時期もあったけど残渣の結晶化で白い粉が基板に付着するのでトルエンとかキシレンとか入ってるやつの方がいいと思うということでこっちに変えました。
オススメしていただいたざわざわ(@ZawaZawah)さんありがとうございます。

まとめ

今回はツールを紹介した。
万人にオススメできるものではないがsmtで試作をする場合のツールの一つとしてみてくれたら嬉しい。

自作エフェクタデザインのぺーじ



ここ最近エフェクターの創作アイデアをゆきょんくん(@Yukyoooon)と一緒にやってるのでそれの紹介
僕が適当に構図指定するとそれを送ってくれるので非常に助かってます。

デザインは上から順に新しいのがのるはず

はやく形にしたいなぁ
f:id:gsmcustomeffects:20180325011552p:plain

続きを読む

ARMのData Watchpoint and Trace Unitを使って処理時間計測をしてみよう

毎度おなじみのARM共通の機能を使ってみようの記事です。


GPIOを使った処理時間の計測

まあオシロスコープがある方はこういう計測方法をよくやると思います。

MCU_GPIO_WRITE(GPIO_PORT_A,GPIO_PIN_13,TRUE);
/*
計測したい処理を記述
*/
MCU_GPIO_WRITE(GPIO_PORT_A,GPIO_PIN_13,FALSE);

処理時間の幅をはかればある程度の処理時間を計測できます。
f:id:gsmcustomeffects:20171006003331p:plain

ですがこれだと毎回つなぐのめんどいしGPIOの立ち上がり時間が入っちゃう(特に問題にならない)

Data Watchpoint and Trace Unit

DWTははオプションのユニットで、次のようなデバッグ機能を実行します。
DWTユニットには4つのコンパレータが組み込まれており、ハードウェアウォッチポイント、ETMトリガ、PCサンプライベント トリガ、またはデータアドレスサンプラ イベントトリガとして構成することができます。最初のコンパレータDWT_COMP0は、クロックサイクル カウンタCYCCNTに対して比較することもできます。2番目のコンパレータDWT_COMP1は、データコンパレータとしても使用できます。DWTにコンパレータが1つだけ含まれるように構成し、そのコンパレータをウォッチポイントまたはトリガとして使用可能にすることもできます。コンパレータが1つしか存在しない場合、データの一致はサポートされません。
DWTには、次のものに対して使用するカウンタが組み込まれています。

  • クロックサイクル(CYCCNT)
  • フォールドされた命令
  • ロード/ ストアユニット(LSU)操作
  • スリープサイクル
  • CPI(最初のサイクルを除くすべての命令サイクル)
  • 割り込みオーバヘッド

※ARM社より引用

ちなみにこの機能オプションなのでメーカーによってはない場合もある。
STはデータシートの一番下のDEBUGに搭載の記述があるので使える。
f:id:gsmcustomeffects:20171006010306p:plain

今回はこれのCYCCLE(クロックサイクルカウンタ)を利用して処理時間計測を行います。

DWTのレジスタをいじいじしていく

まずやらなければならないことはDWTのアクセスロックの解除です。
LARに対してアクセスキーを入力します。
f:id:gsmcustomeffects:20171006004602p:plain
まあサンプルが出ているのでそのまま使います。

#define DWT_LSR_SLK_Pos                1
#define DWT_LSR_SLK_Msk                (1UL << DWT_LSR_SLK_Pos)
// CoreSight Lock Status Register lock availability bit
#define DWT_LSR_SLI_Pos                0
#define DWT_LSR_SLI_Msk                (1UL << DWT_LSR_SLI_Pos)
// CoreSight Lock Access key, common for all
#define DWT_LAR_KEY                    0xC5ACCE55

static inline void dwt_access_enable(int ena)
{
    uint32_t lsr = DWT->LSR;//ロックステータスのチェック

    if ((lsr & DWT_LSR_SLI_Msk) != 0)
    {
        if (ena)
        {
            if ((lsr & DWT_LSR_SLK_Msk) != 0)    //locked: access need unlock
                DWT->LAR = DWT_LAR_KEY;//ロック解除キーの入力
        }
        else
        {
            if ((lsr & DWT_LSR_SLK_Msk) == 0)    //unlocked
                DWT->LAR = 0;
        }
    }
}

プログラムの最初にこいつを呼んでやります。

あとは以下のようにしてDWTいじってあげます。

void init_cpu_cycle(){
	dwt_access_enable(1);
	CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
	DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk;
	(*((volatile uint32_t *) 0xE0001004)) = 0;//DWT->CYCCLE = 0;でも可
}

uint32_t get_cpu_cycle(){
	uint32_t cycle = DWT->CYCCNT;
	return cycle;
}

この二つでは主に何をやっているかというと

  • カウンタの有効
  • カウンタの初期化

です。

f:id:gsmcustomeffects:20171006005057p:plain

f:id:gsmcustomeffects:20171006005159p:plain

あとはこれらで取得したサイクルを減算してクロックで除算を行う関数を定義してやると楽です。
僕の場合オーディオ信号処理なので48kHzで割り込みが起きるので処理時間最大値のうちどのぐらいの時間を使っているかで負荷計測をしています。

float get_process_time(uint32_t start,uint32_t stop){
	float time = ((float)stop-(float)start)/(float)SystemCoreClock;
	return time*1000000;//マイクロで返したいから
}

float get_cpu_load(uint32_t start,uint32_t stop){
	float load = (((float)stop-(float)start)/(float)SystemCoreClock) / (float)(1.0/SAMPLE_RATE);
	return load*100;//%で返したいので
}

あとはこんな感じに埋め込む
f:id:gsmcustomeffects:20171006005429p:plain

biquadフィルタを計算させたときの動作はこんな感じ

f:id:gsmcustomeffects:20171006005758p:plain


5.6%とかなのでかなり余裕がある(ART+DSP関数を使っているので)

まとめ

ARMの共通機能のDWTについて理解を深めた
時間があればほかの機能についても試していきたい

STM32 ARTアクセラレータで高速化してみる。

stm32 Advent Calendar 2017 16日目の記事です。

100MHz越えのマイコン使ってるけど思ったより計算速度が出ない・・・・っていう問題があって色々調べたらフラッシュの速度が原因だった。
そこでSTのARTアクセラレータの機能を使って信号処理の高速化をやってみたって話です。
あくまでSTがすごいだけで僕はその機能を使ったってだけなので悪しからずw


ART Accelerator(Adaptive real-time memory accelerator)

f:id:gsmcustomeffects:20171005182840p:plain

ART Acceleratorは図の赤の部分についてるTCMバス経由でのフラッシュの読み出しウェイトを事実上0にするキャッシュ群みたいなもの。

実際flashの速度って80MHz程度が限界なので高速動作する場合はRAMにコードを置いたりする。(LPCなんかがそう

そこで下の図のようにflashから大量に先読みしてバッファするっていう脳筋ハードウエアペリフェラル
俗にいうインストラクションプリフェッチとか言われている奴をメモリで殴った感じ
f:id:gsmcustomeffects:20171005184126p:plain

インストラクションプリフェッチにもいろいろ問題があって例えばに実行時にキャッシュ上に必要なデータがあってうまくヒットした場合はいいが何かのデータを当てに分岐命令を書いている場合必ずしもヒットしない。
この場合再リロードを行う必要がある。この際flashからの応答にコアはwaitで待つことになる。

そういうことも見越してART内にはブランチキャッシュというものを持っておりある程度の緩和を行っているものだと思う。

実際の流れでは以下のようになる。

インストラクションプリフェッチなし

f:id:gsmcustomeffects:20171005185743p:plain

128bit読み出しを行っているので4命令までは連続フェッチ行けるがそのあとFlashをwaitしている。
この図はF4のなのでF7では256bit

インストラクションプリフェッチあり

f:id:gsmcustomeffects:20171005190302p:plain

一方こちらではインストラクションキャッシュがFIFO的に働くので送りながら次の命令をプリフェッチできている。
なのでCPU的には連続で実行できる。

AXIMのこと忘れてね?

おっとそうでした。
図に示す通りにFlashへのアクセスはTCMだけではなくAHBのバスマトリックスを経由したAXIMからでも行えます。
f:id:gsmcustomeffects:20171005191031p:plain

そもそもCortexM7にはI/Dキャッシュがあります。(0~64KBの間でベンダーが決定して搭載)
こっちを有効にすれば命令、データともにキャッシュが有効になります。

実質この機能だけでだいぶ高速になります。

このAXIMってバスはペリフェラルバスと同一なレーンにいるため渋滞を招くことも懸念されます。
そのためSTはTCIM経由でキャッシュできる構造を取ったのでしょう。

おまけ1:その他の高速化

とりあえずここまででARTが何なのか?がわかったと思うので僕が感心しているDTCMメモリでも話そうと思います。

f:id:gsmcustomeffects:20171005193349p:plain

要するにCPUから最速アクセス可能な密結合メモリのことです。

場所としてはここ

f:id:gsmcustomeffects:20171005193753p:plain

クリティカルなコードやデータをここに配置することで高速化を図れる。
おき方としてはリンカーでアドレスくくって定義てそこに対して起動時にコピーすれば行ける。

その他DTCMにはGPDMAでも書けるのでCPUとペリフェラルで書き換えが頻繁なものはこのアドレスに対して書き込ませれば処理時間が少しは早くなるかもしれない。
またこの領域はキャッシュの影響を受けないのでその点でも結構使いやすい。

各種配置による速度差はIAR様のこの資料がわかりやすいです。
https://www.iar.com/globalassets/pdf/st-kits-kk/8_work_with_effective_software_development_for_cortex-m7_201504.pdf

やりかた

やりかただけ書いておく。

CubeMXでCortexM7の欄を開く

f:id:gsmcustomeffects:20171005194738p:plain

このように設定する。

次にリンカスクリプトでROMの開始アドレスを0x00200000に変更する。

これで実行した時のプログラムカウンタがそれっぽい番地に来てればいいはず

f:id:gsmcustomeffects:20171005195433p:plain

ちなみに有効になってるか確認するにはFlashレジスタを確認するといいです。

f:id:gsmcustomeffects:20171215205512p:plain

ちなみにONとOFFでFIRフィルタを回した時はこんな感じだいぶ処理時間が変わってくる。

f:id:gsmcustomeffects:20171002073035p:plain

2018/11/24追記
いつの間にかCubeMXもVer5になっていますが・・・・
F4ではRCCのメニューで有効にできるみたいです。
f:id:gsmcustomeffects:20181124214419p:plain

各社CortexM7のひかくてきなやつ

Kinetis® KV5x MCU

f:id:gsmcustomeffects:20171005195903p:plain

SAM V70

f:id:gsmcustomeffects:20171005200000p:plain

i.MX RT1050

f:id:gsmcustomeffects:20171118001020p:plain

これに関してはキャッシュが32KBもあるので強すぎかな?w

まとめ

CortexM7のキャッシュについて理解を深めた。
ARTが何なのかがわかった気がした。
関連してこの記事もどうぞ
gsmcustomeffects.hatenablog.com




参考文献

ネットの記事

APS様CortexM7解説
www.aps-web.jp

ねむいさんのブログ
ねむいさんのぶろぐ | STM32F7を使ってみる5 -AXIMとITCM-

CQ出版の解説ページ
www.kumikomi.net

マイナビニュース
news.mynavi.jp

書籍

  • ARMマイコンCortexM教科書
  • Interface2016年12月号付録 STM32便利帳2016

STM32のタイマークロックについて

ここ最近タイマーを結構使うようになってクロック源について悩んだのでメモ

僕が普段使っているSTM32F7のタイマーのクロック源としてはAPB1、APB2の二つがある。


んでCubeでクロック設定をしている僕は気にしていなかったのだけどたくさん使うようになってどれがどこからもらってきているかがわからなくなった。
そんなわけでメモを残す。

うだうだ言ったけど結構簡単でRCC関連のレジスタをみれば書いてある。

f:id:gsmcustomeffects:20170827085138p:plain

f:id:gsmcustomeffects:20170827085206p:plain

ここに書いてある通りに割り振られてるのでCubeでこの辺いじると各種タイマーがどうなるのかわかると思う。

f:id:gsmcustomeffects:20170827085307p:plain

あと注意するのがRCC_DCKCFGR1レジスタのタイマークロックプリスケーラ(タイマーのカウントプリスケーラとは別のやつ)のビットをいじった時はこのへん読む

f:id:gsmcustomeffects:20170827085712p:plain

STM32のUSBCDCでMicroShellを動かす

前回まででUSBCDC(コミュニケーションデバイスクラス)でVCP(VirtualCOMPort)の動作は確認できたので今回はこれにMicroShellを使える状態していく作業になります。
CDCのやり方はこの記事みてください。
gsmcustomeffects.hatenablog.com

やることは

  • 1文字送受信APIの準備
  • 受信バッファサイズの設定
続きを読む