ちょっと便利な tools (2) - 22012年10月03日 21時25分59秒

GNU-Archive Editor
以前紹介した KPIT GNU Archive Editor 。「 Disassemble はできない。」と書いたが実はできることがわかった。これで全ての機能が使えることになる。
では説明していこう。

①ディレクトリの中身をどこか適当な所にコピーする。
私は C:\Keil\ARM\Utilities\GNU-ArchiveEditor にした。
以下のファイルはディレクトリの中身だ。 renesas-xxx.exe を除いてまるごとコピーしよう。もちろん、予め Kpit GNU Tool がインストールしてあるものとする。(RX、SH、H8、M16C どれでもよい)
 C:\Program Files\Renesas\Hew\Tools\KPIT Cummins\GNURX-Archive Editor\v1.1 のディレクトリ

2010/10/04  15:29              .
2010/10/04  15:29              ..
2010/05/04  17:05               660 ArcEdit.cnt
2010/05/04  17:05            94,208 ArcEdit.exe
2010/05/04  17:05            27,424 ARCEDIT.HLP
2010/05/04  17:05            11,758 CONTEXT.HLP
2010/05/04  17:05            50,176 CSH.DLL
2010/05/04  17:05               281 GNULIB.HRF
2010/05/04  17:05               248 GNULIB.HUF
2010/05/17  21:48         1,387,858 renesas-ar.exe
2010/05/17  21:48         1,379,185 renesas-nm.exe
2010/05/17  21:48         1,669,750 renesas-objdump.exe
              11 個のファイル           4,621,548 バイト
               2 個のディレクトリ   2,197,864,448 バイトの空き領域

②gnu-arm コンパイラ(使っているコンパイラ)の中から以下のファイルを先ほどのディレクトリにコピーする。
arm-none-eabi-ar.exe
arm-none-eabi-nm.exe
arm-none-eabi-objdump.exe

③リネームする。
arm-none-eabi-ar.exe を renesas-ar.exe に変更
arm-none-eabi-nm.exe を renesas-nm.exe に変更
arm-none-eabi-objdump.exe をrenesas-objdump.exe に変更

④ArcEdit.exe を Keil µVision4 に登録する。(あるいはショートカットを Windows メニューに登録する。)

これで µVision4 のtools メニューから使えるようになる。
おそらく AVR や PIC MCS-51 その他 gcc のtools があればなんでも使えるはずだ。しかし、如何せん出番が少ない。

環境: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

Keil µVision4 + GCC (3) LPC2300 (1) Startup2012年10月10日 21時17分31秒

Keil MDK-ARM V4.53 を使い始めて3ヶ月ぐらいになる。最新版は既に 4.60 だ。それはいいとして Startup ディレクトリを見ているうちに LPC2300.s / LPC2400.s が新しくなっているのに気がついた。コンフィギュレーションウィザードの部分が巨大になっている。その主な内訳は Clock Setup と External Memory 関係だ。使ってみたくなったので GCC 用に修正してみることにする。
ほとんど機械的な作業だが進めているうちに気になるところがあった。 Copy Exception Vectors to Internal RAM という部分でベクターを RAM にもって行くものだ。このままだと data セクションとかぶってしまう。ベクターエリアを空けなければならないのだろうか?この部分は後回しにしよう。
そして出来上がったのが以下のファイルだ。(LPC2300.s for Sourcery CodeBench Lite)

 



そしてリンカースクリプト LPC23xx_rom_gnu.ld

 



最後は確認のために簡単なテストプログラム。 Clock Setup は使っていない。従って、全てがデフォルトなので4MHzのRCオシレータがそのまま Fcclk それを4分周したのが PCLK で1MHz。というわけで0.5秒間隔でLEDが点滅する。

 



環境:CQ-FRK-NXP-ARM
    + 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

Keil µVision4 + GCC (3) LPC2300 (2) Clock Setup2012年10月14日 20時58分54秒

コンフィギュレーションウィザード
修正した LPC2300.s がうまく動いた所でコンフィギュレーションウィザードを使ってPLLの設定をいろいろ変えて確認する。
その前にLPC2388のデータシートで概略を見てみよう。

・ARM7TDMI-S processor, running at up to 72 MHz.
・The flash memory is 128 bits wide and includes pre-fetching and buffering techniques to allow it to operate at SRAM speeds of 72 MHz.
・The nominal IRC frequency is 4 MHz.
・The PLL input, in the range of 32 kHz to 25 MHz.
・The resulting frequency must be in the range of 275 MHz to 550 MHz.
・CCLKCFG(CCLKSEL) is only 0 and odd values (1, 3, 5, ..., 255)
・a value ‘M’, in the range of 1 through 32768.
・a value ‘N’, which may be in the range of 1 to 256.
・MAMCR
 0 - MAM functions disabled
 1 - MAM functions partially enabled
 2 - MAM functions fully enabled
・MAMTIM
 1 - For a system clock slower than 20 MHz.
 2 - For a system clock between 20 MHz and 40 MHz.
 3 - For a system clock between 40 MHz and 60 MHz.
 4 - For system clocks of 60 MHz and above..

Datasheet と User manual では書いてある数値が異なる場合があるが主に Datasheet の記述を引用している。

さて、ここで気になるのは動作クロックとPLL出力周波数の最大と最小はどのくらいになるかということだ。幸いPLLを使えばクロックは自由に設定できるので気軽に試すことができる。
まず、PLL出力周波数 (Fcco) の最小値は?
OSC=RCosc
M=7
N=1
CCLKSEL=4
PCLK_TIMER0=0 (1/4)
Mが7未満では動かないので上記の設定が最小値になる。
Fcco = Foscx2xM/N = 4x2x7/1 = 56MHz
Fcclk = Fcclk/PCLK_TIMER0 = Fcco/CCLKSEL = 56/4 = 14MHz
PCLK = 14/4 = 3.5MHz
確認のため T0MR0 に 1750000-1 を設定して点滅速度で確認する。
結果:問題なく動作

それでは、PLL出力周波数 (Fcco) の最大値は?
OSC=RCosc
M=130
N=1
CCLKSEL=16
PCLK_TIMER0=1(1/1)
Mが141までは動くが点滅速度が逆に遅くなるのでPLLがうまく動作していないのだろう。従って、上記の設定を最大値ということにする。
Fcco = Foscx2xM/N = 4x2x130/1 = 1040MHz
Fcclk = Fcco/CCLKSEL = 1040/16 = 65MHz
PCLK = Fcclk/PCLK_TIMER0 = 65/1 = 65MHz
確認のため T0MR0 に 32500000-1 を設定して点滅速度で確認する。
結果:問題なく動作

最後は動作クロック (Fcclk) の最大値は?
OSC=RCosc
M=58
N=1
CCLKSEL=4
PCLK_TIMER0=1(1/1)
Mが59になると動かないので上記の設定が最大値ということになる。
Fcco = Foscx2xM/N = 4x2x58/1 = 464MHz
Fcclk = Fcco/CCLKSEL = 464/4 = 116MHz
PCLK = Fcclk/PCLK_TIMER0 = 116/1 = 116MHz
確認のため T0MR0 に 58000000-1 を設定して点滅速度で確認する。
結果:問題なく動作

少しは余裕があると思っていたが結構余裕があるものだ。ただし、Fcclk 116MHz になると MAMCR=0 MAMTIM=7 でしか動かない。従って、MAMCR=2 MAMTIM=3 で動く Fcclk 100MHz あたりが一番高速なのかもしれない。そして、細かく設定を変えて試したい場合必要な部分だけ簡単に変更できるコンフィギュレーションウィザードはありがたかった。しかし、自分で書くとなると頭が痛くなる。あまりなじみの無い書式だ。

環境:CQ-FRK-NXP-ARM
    + 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

Keil µVision4 + GCC (3) LPC2300 (3) Interrupt Vectors are in RAM2012年10月16日 19時01分32秒

Copy Exception Vectors to Internal RAM
さて、気になっていた RAM 上に Vectors をコピーして動かすという件だ。ソースをながめると RAM_INTVEC 、 REMAP 、 RAM_MODE を定義すれば目的は達せられるようだ。コンパイルしてみる。

LPC2300.s(865): error: undefined symbol Vectors used as an immediate value

なるほどラベルが無い。 Vectors をベクターの先頭に追加する。再びコンパイル。

LPC2300.s(865): error: symbol .cs3.interrupt_vector is in a different section

セクションが異なるとアクセスできないのか?
                ADR     R8, Vectors を
                LDR     R8, =Vectors に変更する

コンパイルは通るが動かない。シミュレータで見ると main に入った途端せっかく書いたベクターがクリアされてしまう。RAM の先頭 0x40 バイトを空けなくてはならないのだ。 .space を入れてみる。
                .section ".cs3.region-head.ram","wx"
                .globl  _RAM_INTVEC_
                .type   _RAM_INTVEC_, %object
_RAM_INTVEC_:   .space  0x40
                .size   _RAM_INTVEC_, . - _RAM_INTVEC_
やはり main に入った途端ベクターがクリアされてしまう。これは却下。

今度はエリアを強制的に空ける。リンカースクリプトの変更だ。
ram (rwx) : ORIGIN = 0x40000040, LENGTH = 64K-0x40

シミュレータではうまく動く。基板に書き込んでみても動く。しかし、実際に RAM 上のベクターテーブルで動いているのかどうかは確認のしようが無い。では、これで何ができるんだというと RAM 上にあるので書き換えができる。或いは FLASH 上に Monitor をおいて RAM でプログラムを実行できる。といった所だろうか。

環境:CQ-FRK-NXP-ARM
    + 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

CQ-LM3S3748 (1) 超入門!付属ARMマイコンで始めるロボット製作2012年10月18日 21時53分52秒

amazon のギフト券をもらったので何に使おうかと使い道を考えていた。いろいろ探していて見つけたのが 「超入門!付属ARMマイコンで始めるロボット製作」。2012/3/21発売、とあるからずいぶん前に発売になっている。しかし、気がつかなかった。本屋さんにもよく行くが見た記憶がない。CQ出版社のホームページからこの本を見つけるのもきわめて困難だ。サポートページに至ってはどこから入るのかさえ分からない。
さて、問題の CPU は LM3S3748 。前から Luminary Micro のものがほしかったのでちょうどよかった。しかし、高価だ ¥3780 なり。ポチ。

次に TI のサイトでデータシートを手に入れる。さらに「ファームウェア開発パッケージ」 、「キット CD、EKC-LM3S3748、CodeSourcery ツール付き」、「Stellaris® フラッシュ・プログラマ、GUI およびコマンド・ライン」をダウンロードしようとするがダウンロードできない。ダウンロードの仕方が分からないといったほうがよいかもしれない。なかなか手ごわいぞ TI 。
•Please take a moment to review your information.
We are sorry but your transaction was unable to be processed.
We apologize for the inconvenience. Please try again later.


参照:超入門!付属ARMマイコンで始めるロボット製作

CQ-LM3S3748 (2)2012年10月21日 20時23分50秒

CQ-LM3S3748
二日間にわたってクリックを続けた結果「ファームウェア開発パッケージ」 と「Stellaris® フラッシュ・プログラマ、GUI およびコマンド・ライン」は無事ダウンロードできた。ダウンロードのボタンをクリックし続けているとそのうちダウンロードメニューが出てくる。その時すかさずダウンロード。最初の段階でこんなに苦労するとは思わなかった。

まずはダウンロードした「ファームウェア開発パッケージ」 の中身を見てみよう。
サンプル、ライブラリ、ドライバと盛りだくさんだ。プロジェクトも IAR KEIL CCS GCC と一般的なものはそろっている。しかし、CMSIS は採用してないようだ。
もうひとつのソフト「フラッシュプログラマ」はよくできたソフトだ。多機能で使いやすい。他のメーカもこんなライターソフトを出してほしいものだ。

そうこうしているうちに注文していた基板が届いた。いや、本が届いた。 特別変わった基板ではないがプッシュスイッチが2個実装されている。リセットスイッチはありがたい。もうひとつは何だろう?とりあえず付属の本を読んでみる。Pawn という単語がたくさん出てくる。Pawn という言語らしいが使うつもりは無いので読み飛ばす。
わかったこと
・Stellaris Ware が ROM に内蔵されている。
・ROM には Serial Boot Loader が内蔵されている。
・Serial Boot Loader は UART0 、SSI0 、I2C0 のいずれかを使う。
・USB ブートローダーがフラッシュROMに書き込んである。
・アプリケーションプログラムは 0x00001800 - 0x0001FFFF の範囲。
・フラッシュプログラマは bin フォーマットのみ受け付ける。

なんとなく STM32 に似ているような気がする。
さて、0x1800 のオフセットはどうすればいいんだっけ?

LMFlashProgrammer Configuration
LMFlashProgrammer Program


参照:超入門!付属ARMマイコンで始めるロボット製作

CQ-LM3S3748 (3) blinky LED2012年10月22日 21時59分09秒

いつもの LED 点滅からはじめよう。
ベースにしたのは「ファームウェア開発パッケージ」 SW-EK-LM3S3748-9453.exe の boards\ek-lm3s3748\blinky 。変更したのは blinky.c と blinky.ld 。そのまま使ったのは startup_gcc.c 。

blinky.ld は MEMORY の部分のみ変更。オフセット 0x1800 を入れてみた。
変更前
MEMORY
{
    FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00020000
    SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00010000
}
変更後
MEMORY
{
    FLASH (rx) : ORIGIN = 0x00001800, LENGTH = 0x0001E800
    SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00010000
}


blinky.c は port.f0 を port.g2 に変更しただけ。

 



後は µVision の設定だけだ。
では Target の設定を見ていこう。まず Device 、当然 LM3S3748 を選択。
Options for Target Device


µVision が気に入っている理由のひとつ以下のように外部 Tool が簡単に使えること。ここでは elf file からバイナリファイルを作る。
arm-none-eabi-objcopy.exe -O binary !L.elf !L.bin
Options for Target User


Compile Thumb Code にチェックを入れる。
Options for Target CC


リンカースクリプトファイルを指定する。
Options for Target Linker


ここでも外部 Tool LMFlash.exe が簡単に使える。もちろん Device Database に登録しているのでいちいち書き込む必要もない。
Command: C:\Program Files\Texas Instruments\Stellaris\LM Flash Programmer\LMFlash.exe
Arguments: -r -v --interface=USB --offset=0x1800 "!L.bin"
Options for Target Utilities


設定ができたら、コンパイル、書き込み。
どちらもワンクリックだ。
クリック直後に LED が点滅する。書き込みも高速だ。
いいね~。

環境:CQ-LM3S3748
    + SW-EK-LM3S3748-9453.exe
    + 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

CQ-LM3S3748 (4) Password2012年10月24日 20時13分16秒

Password
ここまでは比較的順調に進んできた。このあたりでCQ出版のサポート・ページを参照する。ダウンロード・ファイルがたくさん並んでいるがどれが必要な物かわからないので全てダウンロードした。windows_drivers_cq.zip と LM3S3748_board_test.zip は既にダウンロードして使っている。Chapt14_sample.zip には boot_uart_0x1800.zip が入っているらしいのでこの中身を見てみることにする。解凍すると Chapt14_sample_pass.zip と password.txt が入っている。圧縮ファイルの中に圧縮ファイルでさらにパスワードがかかっている。ものすごい念の入れようだ。パスワードを入れて解凍しようとすると
「入力したパスワードが間違っています。もう一度入力してください。」と出てくる。
あれ!間違えたか?
もう一度入力。
だめだ。
確認のため別のファイル(Chapt3_sample.zip)を解凍してみる。
問題ない。解凍できて中身も見ることができる。
どうやら Chapt14_sample_pass.zip は圧縮の時にパスワードを間違って入れてしまったのだろう。
CQ出版に確認してみたいが「ご注意」の中に
”付属マイコン・ボードに関する技術的なサポートや問い合わせはいっさいお受けできません。”
とあるので問い合わせもできないらしい。

Advanced Archive Password Recovery でキーを捜したら 13 Character なので何年かかるかわからない。
困った...

と思っていたら password.txt にパスワードのことが書いてあった。ファイルによってパスワードが異なるのだ。
ああ!何ということだ。
お馬鹿な私。

CQ-LM3S3748 (5) SysTick counter2012年10月26日 21時33分30秒

今回は SysTick counter を使ってみる。SW-EK-LM3S3748-9453.exe の中を探してみたが適当なサンプルが見つからない。CMSIS_LM3S-32.zip の中に簡単なサンプルがあるのでこれを使うことにする。ソースを眺めていると前回のサンプルとI/Oアクセスの方法が若干異なることに気がついた。
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

CQ-LM3S3748 (6) Using ROM_ functions2012年10月28日 21時01分32秒

Preprocessor Symbols Define:
LM3S の特色 ROM functions を使ってみる。今回使うファイルを以下に示す。
・startup_gcc.c は CMSIS_LM3S-32.zip の中のもの weak 宣言がしてあるので使いやすい。
・blinky.ld これはどれでもよい。
・SW-EK-LM3S3748-9453.exe の中の driverlib と inc ディレクトリ。適当な場所にコピーする。
・そして blinky.c

 



µVision の設定は、ほぼ前回と同じだが CC タブ Preprocessor Symbols の Define: と Include Paths に追加がある。
まず、 Define: はデバイスと Device Class の指定だ。LM3S3748 は Stellaris® DustDevil-class devices になるのでその指定が必要。
PART_LM3S3748
TARGET_IS_DUSTDEVIL_RA0
そしてヘッダーディレクトリの指定。これは driverlib と inc ディレクトリをどこに置くかによって異なってくるので自分の環境に合わせる。

では、コンパイル、書き込み。
問題ないようだ。
ここで ROM functions を使った場合と使わない場合のサイズの違いを見てみよう。
5,952 ROM functions(PART_LM3S3748 TARGET_IS_DUSTDEVIL_RA0)
8,640 通常ライブラリ(PART_LM3S3748)
使えば使うほどコンパクトに収まるということか?でも、そのせいで CMSIS との相性が悪くなってしまったようだ。

参照:Stellaris® ソフトウェアの更新

環境:CQ-LM3S3748
    + CMSIS_LM3S-32.zip
    + SW-EK-LM3S3748-9453.exe
    + 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