9. C プログラム
void run(void)
{
*(volatile int *) (MAGIC_TRACE) = 0;
putstr("Hello, I am the ARMn");
#ifdef TEST_GPIO
test_gpio();
#endif
exit(0);
}
Cのルーチン
の先頭
実際に LED を光らせる前に、該当するピンを GPIO として使用するように宣言するために、
特定のアドレスに値を書き込むのですが、
それらはStellarisWare の力を借りることにします。
実際に LED を光らせる前に、該当するピンを GPIO の Output として使用するように宣言するために、
特定のアドレスに値を書き込むのですが、
それらはStellarisWare の力を借りることにします。
実は仕様書が間違っているようです。次のスライドで修正します。
仕様書通りに動かすと動きません。0x3FC のオフセットが正解です。
C で書くとこんな感じになるでしょうか?
種を明かすと、これでは動きません。
なお、この時点でPORT C 上の、他のピンはどうなるの?と考えた人は相当わかってます。
0x400063FC への書き込みは PORT C に関するすべてのピンに対して書き込みをします。
したがって、例えば 3 番に LED があり光っていたなら、上のプログラムでは消えてしまいます。
PL061 では個別にピンにアクセス可能なように、個々のピンに対してアドレスが異なるように
設計されています。
しかし、LM3S811 では PL061 の簡易版のようで、そのような機能はないようです。[仕様書に未記載)
そのかわり、Cortex-M3 の機能である bit band を使用することができます。
led.c は動かないプログラムになっていますが、まずは実行して動かないことを確認します。
プログラムは TOPPERS/ASP 上で動きます。
TOPPERS/ASP の方法でコンパイル・実行します。
そのため TOPPERS/ASP での実行コンパイルの経験が多少必要です。
ここでその経験をするのでもいいかもしれません。(プログラムが簡単なので)
make 時には USE_QEMU=true とします。
asp ができます。
led と名前を変えておきます。
実機で実行するには make 時に何も指定しません。
led は elf 形式なので OpenOCD を使った場合そのままつかえます。
Windows で TI の LM Flah Programer をつかうなら objcopy で bin ファイルにしておきます。
以後、仮想HWでの実行のみを記述