CQ-LM3S3748 (5) SysTick counter ― 2012年10月26日 21時33分30秒
今回は SysTick counter を使ってみる。SW-EK-LM3S3748-9453.exe の中を探してみたが適当なサンプルが見つからない。CMSIS_LM3S-32.zip の中に簡単なサンプルがあるのでこれを使うことにする。ソースを眺めていると前回のサンプルとI/Oアクセスの方法が若干異なることに気がついた。
さてそれでは動かしてみよう。
前回同様変更するのは blinky.ld と blinky.c 。変更する内容もほぼ同じだ。プロジェクトに組み込むファイルは
blinky.c
core_cm3.c
startup_gcc.c
system_lm3s.c
blinky.ld
µVision の設定は前回と同じだ。そしてコンパイル。
あれ!あれ!コンパイルエラーだ。
問題なくコンパイルできる。コンパイラのバージョンが関係しているようだが先を急ぎたいので core_cm3.c をプロジェクトからはずしてみる。
どちらのバージョンでもコンパイルが通る。とりあえずはずしておいて先に進もう。早速 FLASH に書き込んでみるが動かない。
いつもこんな感じだ。
さて、何がいけないの?
シミュレータにかけてみる。
問題ない。
先日の blinky から追加になったのは SystemInit と SysTick なのでその部分を削除してコンパイル、ラン。
動かない。
こうなると泥沼だ。こんな簡単なプログラムなのに...
blinky.c を入れ替えて動かしてみると先日のソースでは問題なく動く。何が異なるのか詳細に見ていくと Delay a few cycles after enabling the peripheral. の部分。違いは
dummy=SYSCTL->RCGC2;
動くではないか。書き込んだレジスタの値を一度読み出さないといけないのか?
この部分のコメントによると数クロックサイクル後にイネーブルになると書いてある。では、ソースを元に戻して nop を4つ追加してみる。
動く。
どうやら待ち時間が足りなかったらしい。それにしてもこんなクリティカルなサンプルを出してくれるとは困ったものだ。そして、 core_cm3.c の問題が残ってしまった。
参照:Stellaris® ソフトウェアの更新
環境:CQ-LM3S3748
+ CMSIS_LM3S-32.zip
+ Keil MDK-ARM V4.53
+ GCC Sourcery CodeBench Lite 2012.03-56
+ KPIT Cummins GNU-Archive Editor v1.1
+ KPIT Cummins GNU-Map Viewer v1.0
SW-EK-LM3S3748-9453.exe の blinky SYSCTL_RCGC2_R = SYSCTL_RCGC2_GPIOF; CMSIS_LM3S-32.zip の blinky SYSCTL->RCGC2 |= 0x20;同じレジスタに値をセットしているが、前者はアドレスに直接、後者は構造体形式だ。もちろん読み込んでいるヘッダーも異なる。検索して圧倒的に多いのは後者のタイプだ。最近はデバイスごとにヘッダーファイルを用意する前者が多いような気がするが Luminary Micro では違うらしい。
さてそれでは動かしてみよう。
前回同様変更するのは blinky.ld と blinky.c 。変更する内容もほぼ同じだ。プロジェクトに組み込むファイルは
blinky.c
core_cm3.c
startup_gcc.c
system_lm3s.c
blinky.ld
µVision の設定は前回と同じだ。そしてコンパイル。
あれ!あれ!コンパイルエラーだ。
compiling core_cm3.c... C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\ccE9GhRB.s: Assembler messages: Error: C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\ccE9GhRB.s:439: Error: registers may not be the same -- `strexb r0,r0,[r1]' Error: C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\ccE9GhRB.s:463: Error: registers may not be the same -- `strexh r0,r0,[r1]'Sourcery gcc 4.6.3 を Sourcery gcc 4.5.1 に変更してみる。
問題なくコンパイルできる。コンパイラのバージョンが関係しているようだが先を急ぎたいので core_cm3.c をプロジェクトからはずしてみる。
どちらのバージョンでもコンパイルが通る。とりあえずはずしておいて先に進もう。早速 FLASH に書き込んでみるが動かない。
いつもこんな感じだ。
さて、何がいけないの?
シミュレータにかけてみる。
問題ない。
先日の blinky から追加になったのは SystemInit と SysTick なのでその部分を削除してコンパイル、ラン。
動かない。
こうなると泥沼だ。こんな簡単なプログラムなのに...
blinky.c を入れ替えて動かしてみると先日のソースでは問題なく動く。何が異なるのか詳細に見ていくと Delay a few cycles after enabling the peripheral. の部分。違いは
ulLoop = SYSCTL_RCGC2_R; 前回のソース __NOP(); 今回のソース前回と同じように書いて動かしてみる。
dummy=SYSCTL->RCGC2;
動くではないか。書き込んだレジスタの値を一度読み出さないといけないのか?
この部分のコメントによると数クロックサイクル後にイネーブルになると書いてある。では、ソースを元に戻して nop を4つ追加してみる。
動く。
どうやら待ち時間が足りなかったらしい。それにしてもこんなクリティカルなサンプルを出してくれるとは困ったものだ。そして、 core_cm3.c の問題が残ってしまった。
参照:Stellaris® ソフトウェアの更新
環境:CQ-LM3S3748
+ CMSIS_LM3S-32.zip
+ Keil MDK-ARM V4.53
+ GCC Sourcery CodeBench Lite 2012.03-56
+ KPIT Cummins GNU-Archive Editor v1.1
+ KPIT Cummins GNU-Map Viewer v1.0
コメント
トラックバック
このエントリのトラックバックURL: http://syslab.asablo.jp/blog/2012/10/26/6614973/tb
コメントをどうぞ
※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。
※投稿には管理者が設定した質問に答える必要があります。