I’m loser, baby.

So why don't you kill me?

改めてmbedLPC1114について調べてみる

今日は久々の学校。隣の席のKさんとか体調不良でお休み。授業の内容は休み前の復習およびPLCの続き。
かなりマイコンよりのことまで出来て面白いはずなのだけれど、自分の興味が
今は完全にマイコンに行ってしまってるので、こっそりマイコンの勉強の内職しながら授業を受けたりしてました。

直叩き系の調べ物

で、判らんことは多いけれど、アタックしなけりゃ判らんまま、ということでまたLPC1114について調べる。
何回か読んで目が泳いでしまっていたトラ技のLPC1114特集号を腰を据えて読みなおす。やっぱりアナログ人間なのかノート取って読むのが一番理解が進むみたいです。
取り敢えず自分の理解としてLPC1114で直接PWMをコントロールするには以下の段取りが必要で、これをやれば現在floatで扱っている数値がintに収まるはず。

  • まずマイコン自体のクロックであるペリフェラル・クロックがあって、内部クロックだと48MHz周期
  • これを分周器であるプリスケール・カウンタで任意のクロックにまで落とす。8bit11kHzだと2822400Hzだから48MHzを割るとおよそ17。これ引く1の16の値をプリスケール・レジスタに格納。
  • プリスケール・カウンタがカウントアップする毎にタイマ・カウンターがカウントされる。
  • タイマ・カウンタはほっておけば32bit上限までカウントしていくので、マッチ制御レジスタに8bit値-1の255を格納。これで11kHzの周波数が確保される。
  • 次にマッチ・レジスタに周期Tの256と設定したいパルス幅を設定する。
  • するとPWM制御レジスタが指定された周期とパルス幅でパルスを発生。
  • 最後に外部マッチ出力からパルス波が出力.

というところまではトラ技記事から判明。
その他に通常の割り込み処理についても調べてみたけれど、11kHzの周期で行うデューティ比の変更についてはどうすればいいのか、まだ決定打は見つからず。作戦としては

  • メイン関数内でデューティ比変更の処理をして(処理にそんなに時間がかからない前提で)処理後タイマがカウント終わるまで待つ
  • カウンタで一定時間ごとにデューティ比の更新関数を呼び出し

の2つが考えられるけど、どっちが良いのだろう。

何の環境で直叩きするか

開発環境についても実は悩みどころ。LPCXpressoが一番良いんだろうと思うのですが、どうも自分にとっては直感的じゃないようで。gcc+vimが好きなのですが最近エラーが出まくる。googleで検索すると同じ症状で悩んでいる人はいるようだが解決策までは判らず。mbedライブラリが邪魔とか文句を言ってましたがそういう意味ではmbed環境の安定感は素晴らしい。
ただ、Monolistの記事でも直叩きの話があったので、直叩きについても用意されている枠組みがあるはずだろうと思って調べてみたらやっぱりありました。調べ方が足りないなあ。
mbed library internals - Handbook | mbed
ARMプロセッサ一般の規格であるCMSISがmbedでも使われていて、ここを使えばいいようです。
CMSIS自体にはDSPRTOSAPIもあるようですが、mbedにはコアの部分のみ使われている模様。
CMSIS - Cortexマイクロコントローラ ソフトウェア インタフェース規格 - ARM
上のページではLPC17XXの例が出ていますが、mbedのWebIDEからエクスポートしたファイル群を見てみると
プロジェクトフォルダ>mbedフォルダ>TARGET_LPC1114
の中に一通り入っていました。とするとmbedでもこういう書き方は可能ということか。

#include "mbed.h"
 
// Reuse initialization code from the mbed library
DigitalOut led1(LED1); // P1_18
 
int main() {
    unsigned int mask_pin18 = 1 << 18;
    
    while (true) {
        LPC_GPIO1->FIOSET |= mask_pin18;
        wait(0.5);
        
        LPC_GPIO1->FIOCLR |= mask_pin18;
        wait(0.5);
    }
}

mbedの説明ではあまりこの様な書き方は出てなくてトラ技のLPCXpressoでの開発での記事でよく出てくる書き方だったので、mbedとは違うnpxが自分の開発環境用に独自に作ったライブラリなのかと思っていましたがそうではなかったです。
読み返したらMonolistの記事でも確かに直叩きの例でLPC_GPI01関数とか使っていたのですが、

LPC1114のメーカーであるNXPセミコンダクターが提供する開発ツール「LPCXpresso 統合開発環境」で使われているシンボルのいくつかはmbedでも使えるようです。ベアメタルといってもmbedでのコンパイルの方法や、書き込み方は今までのクラスライブラリを普通に使う方法と変わりません。

という書き方だったんで何で使えるのか、読んだ当初はどこまで使えるのかまで意識が回りませんでした。
何を直叩きすれば良いかはトラ技の記事で判ったので、この後はmbedにおけるCMSIS-COREの事を詳しく調べてみることにします。

目的を思い出すと

音を出すって話でいえば、正直な話DAC用のICを組み込んだシステムを考えれば良いような気がしますし、組み込みおよびその設計の勉強という意味で言うとそちらが正解のような気がしますが、一つのCPUを詳しく知ることでデジタル回路について知るっていう側面もあるので、これもまあ有りでしょう。
それに秋月さんのHPとかで見るとDAC用ICの方がLPC1114より高かったりするし(でも250円とかですが)。
デジタル回路って話ではFPGAも射程に入ってきましたけど、LPC1114の駄菓子屋感覚はやらかしがちな初心者としては安心して実験できる心強さはあります。FPGAの評価ボードは一番安いやつでもおいそれとは壊せないものなあ。

あと目的とは違う話ですが、mbedはコミュニティとしての機能も充実していて、こっち方面では活用していなかったので今後使う予定。
自分のソースさらすとかおっかなびっくりですけどそこでお知り合いとか出来たらハッピー。