LPC11U35のピン制御
LPC11U35を動かすためのプログラムを書くために、リファレンスマニュアルを読んでいたのだが、ピンの設定がかなり不規則であることが分かった。 これまでに私が使ってきたマイコンでは、GPIOを使おうと思ったら、一部の特殊な機能のピンではその機能を開放する手続きが必要だが、同じ設定でほぼすべてのピンを使うことができた。 しかしLPC11U35では、7つものピンで、GPIOとして使うときに設定する数値が、通常の0ではなく1になっていた。 ADCについても、8つのピンで使えるのだが、そのうちの3つのピンで、この数値が2ではなく1になっていた。 別のマイコンでも、ADCの割り当てられているピンの番号が不規則なことはよくあったが、その設定の仕方はほとんど同じだった。 PWMが使えるピンが複雑な割り当てになっているのは、他のマイコンと同じだった。
これらの三つの機能を使えるようにするプログラムを書くためには、これらを適切に処理しなければならない。 これまでもPWMについては、ピン毎の設定を記録したテーブルを作って、それを元に設定していた。 GPIOやADCの不規則な設定についても、このテーブルに含めてみた。 しかし、頑張って条件分岐を効率化した場合とサイズあまり変らなかったので、どちらが良いのか悩ましいところだ。 汎用性を考えて、テーブルを参照するようにしようかな。
PWMについても予想と違うことがあった。 一つのタイマーに対して、MAT0-3が設定でき、これらの値と一致したときに、出力を変化させたりできるのだが、その中の一つを使ってタイマーの周期を設定する必要があり、dutyを指定するためには残りの三つの値でしか出来無いのである。 一つのピンだけでPWMを使うときには、そのピンに割り当てられていないMATを周期の決定に使えば良いのだが、複数のピンでPWMを使う場合には問題になるので、どのように設計するかが課題である。 一つのやり方はMAT3のピンは使わないことにして、それを周期を指定するのに使うという方法である。 また、その場合にも、MAT3に一致したときにピンのON/OFFを切り換えるように設定すれば、周波数が半分でdutyが50%として使える。 もっとも、同じタイマーを使うPWMピンは、周波数が同じになってしまうという制約はあるので、完全に次優に複数のPWMを使うことはできないのだが。
残念なのは、私が使っているマイコンボードのLEDは、PWMが使えないので、PWMの動作確認ができないことである。 GPIOとADCについては、少なくとも一部のピンでは動作確認はできて、mruby/cからも動いた。