ガレスタさんのDIY日記

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

Eclipseのリファクタ機能が意外に便利だった

最近気づいたんだけどリファクタ機能が結構便利だったものでそれの紹介

一括リネーム

変えたい変数のうえで右クリしてRefactor->Rename

f:id:gsmcustomeffects:20170921100427p:plain

そうすると一括変更が出来ちゃうねって話

べた書きを関数化

こういうくそコードを
f:id:gsmcustomeffects:20170921101217p:plain

Refactor->Extract function

f:id:gsmcustomeffects:20170921101320p:plain

f:id:gsmcustomeffects:20170921101352p:plain

おしまい

今日も一日がんばるぞい

AtollicにRunボタンがないのでそれっぽいデバッグ設定を作る

皆さんこんばんわ

僕はいままでSW4STM32を使っていたのですがひょんなことからAtollicTrueStudioに切り替えました。
そうしたら上のほうにあったRunボタンがないんですね・・・
このRun機能書き込みリセットだけを行う機能でわざわざデバッグ起動しなくてもプログラムを試せるのでパラメーター調整をしているときは結構便利なんですよね

f:id:gsmcustomeffects:20170917015511p:plain

というわけでこういうふうにしてみた。

通常のデバッグもできるようにデバッグ設定を複製する。

f:id:gsmcustomeffects:20170917015620p:plain

そうしたらスクリプトのloadのあとを消してquitにする。

f:id:gsmcustomeffects:20170917015710p:plain

するとデバッガー画面に切り替わるが勝手にquitして元の画面に戻ってくれる。

切り替えはこの辺からできる。
f:id:gsmcustomeffects:20170917022248p:plain

※上記の画像でRunボタンがあるがこれはカスタムされていないので押してもエラーが出るだけ

まとめ

Runっぽい機能を作れた。

本家フォーラムによるとそのうち実装されるらしい。

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

NVIC_SetVectorについて

久々にST限定じゃなくARM全般の話ですね。

NVIC_SetVectorについて

Set Interrupt Vectorともあるように割り込みベクターを再セットするAPIです。

主にこうやって使います。

NVIC_SetVector(SPI3_IRQn, (uint32_t)my_irq_handler);

第一引数は割り込み番号です。 第二引数は変更先関数です。

STの例題で話すとSPI3_IRQHandlerというものが初期で定義されています。
これはSPIの何かに反応して割り込みが発生してこのハンドラが呼ばれるものですがそこを無効にしてmy_irq_handlerという自前定義の関数に変更することができます。

ここで以前書いたこの記事とを組み合わせると後述するようなことができます。

gsmcustomeffects.hatenablog.com

例題

まず変更先の関数を定義します。

void my_irq_handler(){
	a++;

}

次にNVIC_APIを使って割り込み類を再定義していきます。

	NVIC_DisableIRQ(SPI3_IRQn);//割り込み無効
	NVIC_SetPriority(SPI3_IRQn, 1);//優先度の指定
	NVIC_SetVector(SPI3_IRQn, (uint32_t)my_irq_handler);//ベクターセット
	NVIC_EnableIRQ(SPI3_IRQn);//割り込み有効

ここまで来るとあとはソフト遷移で割り込みを呼ぶだけです。

NVIC->STIR= SPI3_IRQn;がそれにあたります。

するとこのように周期的に自分の指定した関数をコールできます。

f:id:gsmcustomeffects:20170827070452p:plain

使いどころは悩みますがある割り込みからこの記述を行えばほかの記述に飛べますし処理時間計測とかの応用に使えるのではないでしょうか?
まああくまでこういうこともできるよということなので基本的に非推奨です。
また、元の割り込みは使用しないであろうペリフェラルにしないと動作保証が出来なくなるのでそこらへんもよく考えてやる必要があると思います。

問題点

これをやるにあたりMbedのCMSIS関数周りにはNVIC_SetVectorが入っているのだがCubeMXの吐きだすCMSISヘッダーにはこの定義が含まれていないので自分で作成する羽目になる。

#define NVIC_USER_IRQ_OFFSET          16
#define NVIC_RAM_VECTOR_ADDRESS   (0x20000000)  // Vectors positioned at start of RAM
#define NVIC_FLASH_VECTOR_ADDRESS (0x08000000)
__STATIC_INLINE void NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) {
    uint32_t *vectors = (uint32_t *)SCB->VTOR;
    uint32_t i;

    // Copy and switch to dynamic vectors if the first time called
    if (SCB->VTOR == NVIC_FLASH_VECTOR_ADDRESS) {
        uint32_t *old_vectors = vectors;
        vectors = (uint32_t*)NVIC_RAM_VECTOR_ADDRESS;
        for (i=0; i<IRQn; i++) {
            vectors[i] = old_vectors[i];
        }
        SCB->VTOR = (uint32_t)NVIC_RAM_VECTOR_ADDRESS;
    }
    vectors[IRQn + NVIC_USER_IRQ_OFFSET] = vector;
}

他のcmsisから参考にこのように書いた。

実際HALのような抽象化レイヤーではユーザーがこういう部分をいじることを想定していないというか逆にやらせてはいけないというポリシーがあるのか使わないのは削除しているみたい
なので初期テーブルをいじるようなときは自己責任で!

AtollicTrueStudioのC++コンバート機能を使ってSTM32 CubeMX生成プロジェクトをC++で開発

経緯

ここ最近外部I2Cデバイスのドライバやらを書いていたのだがオブジェクトな書き方をCでやろうとするとポインタ型の代入が大量に発生するのでややこしいしめんどい
C++ならメンバ関数が使えるのでインスタンスを生成すればIDEの補完機能でPrefixから呼べる。そうこれがしたい。(画像は気にしないでくれ

f:id:gsmcustomeffects:20170824002502p:plain

あとドライバ初期化の段階でI2Cとかのハンドルを投げるのも容易にできるのでArduino的な書き方にできるのではないかと考えた。

というわけで今回はコンバート機能の紹介とやり方について書いていこうと思う。

プロジェクトのコンバート

CubeMXでのプロジェクトを読み込んでプロジェクトで右クリをするそうするとこういう画面が出る。
そこで以下のようにConvert to C/C++をクリック

f:id:gsmcustomeffects:20170824003248p:plain

そのあとこのウインドウが出るので各自設定をしてConvert

f:id:gsmcustomeffects:20170824003358p:plain

設定などなど

次に.cppにリネーム

f:id:gsmcustomeffects:20170824003706p:plain

このままコンパイルするとエラーだらけになるので次はコンパイル設定をいじっていく

PATH設定

f:id:gsmcustomeffects:20170824004041p:plain

プロジェクトプロパティを開いてPATH設定の部分を開く

f:id:gsmcustomeffects:20170824004529p:plain

そこで以下のようにGNUCからC++にコピーする。

f:id:gsmcustomeffects:20170824004616p:plain

終ったら適応を押して閉じる。

シンボルの設定

こちらもプロジェクト固有設定なのでいじっていく

プロパティを開いてC/C++Build/Setting/Tool Setting/C CompilerのSymbolsを開く

以下のようにシンボル情報をコピーする。

f:id:gsmcustomeffects:20170824005126p:plain

f:id:gsmcustomeffects:20170824005225p:plain

コンパイル

この時一度Clean Projectをしないとリンク情報が残ったままなのでここでCleanして一からビルドする。

そうするとちゃんとg++コマンドでビルドされてる。

f:id:gsmcustomeffects:20170824005414p:plain

CとC++の複合環境がこれで整ったわけだがCubeで吐きだし直すとMain.cが新しく作られてしまうのでMain以外のファイルをcppで作ったほうがいいと思う。
CからC++を呼び出す方法ないしそれの逆はarm本家が説明してくれてる。

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0471gj/Babjggdd.html
f:id:gsmcustomeffects:20170824010013p:plain

ちなみにCubeの生成するヘッダーファイルはC++のこと意識して#ifdef __cplusplusのマクロでくくってくれているのでC++コンパイルした時にその対応がされるようになっている。
extern "C"修飾子がエラー回避をしているとのことなので自分でC++ファイル作ったりしてやる場合はhppを工夫して作るなどしたほうがよさそう。
※__cplusplusはC++コンパイルされると定義されるマクロである。



ちなみにその辺は複数のサイトでコメントされているので他を読むといいだろう。

僕はここ参考にした
qiita.com

余談

ちなみにこういうtweetを見かけたのでこれについても

これについてはC++ 11を使用してコンパイルすればいいのでC/C++Build/Setting/Tool Setting/C++ Compiler/GeneralからC++ 14かC++ 11を選べばいいと思う。
そうするとこの通りコンパイルが通る。

f:id:gsmcustomeffects:20170824011139p:plain

ちなみにC++14はコミュニティ機能らしいのでC++11にしておこう

f:id:gsmcustomeffects:20170825032108p:plain

余談その二

C++のデバッグ設定も変えておかないとC++でのブレークが張れません
None以外のどれかにすることで解決できます。

※尚設定によってはGDBが落ちます。この件に関しては今んとこよくわかってないですが現状動くようになったので放置してます。

ZOOM MS50gのハードウエア構成を見てみる

僕のブログではこんなことやったりして普通の使い方と違う使い方をやっていますが・・・・・


gsmcustomeffects.hatenablog.com


今回も普通の使い方というより教材として使う的なニュアンスでみていこうと思います。

まず全体図

f:id:gsmcustomeffects:20170806152921j:plain

メイン基板と各種スイッチ基板やらがフレキシブルなやつでつながれてますね

ちなみにZFXとか書いてありますがTIのDSP(TMS320C6745)ですね。
f:id:gsmcustomeffects:20170806153024j:plain

スペックはこんなもん

f:id:gsmcustomeffects:20170806153202p:plain

次に裏面を見ていく

f:id:gsmcustomeffects:20170806153238j:plain

いくつかのICがのっている

拡大してく

f:id:gsmcustomeffects:20170806153307j:plain

ADCは現シーラスロジックのWM8782

スペックはこんなもん

f:id:gsmcustomeffects:20170806153442p:plain

DACはTIのPCM5101だが現在は新規設計に非推奨らしい・・・

f:id:gsmcustomeffects:20170806153632p:plain

その他RT9971AとかいうマルチCH電源とFIDELIXのシリアルメモリがついてる。

SDRAMはEtronTechの4M x 16 bit Synchronous DRAMがのってる。

まとめ

結構しっかりしてる・・・・・

というかこれだけのスペックで9000円ぐらいとかしゅごい