2006年7月15日
以前に内蔵ROMが正しくReadできなかったのは、PARTNER-Jの起動時の設定ファイル(jptSH.cfg)に設定の足りない点があったようだ。
FLASH MEMORY 00000000,0003ffff,INTERNAL
MAP 00000000,0003ffff,ROM
を追加することで、内蔵ROMにも起動時にプログラムを書き込んでくれる。
MAP 00400000,0047ffff,RAM
MAP ffff8000,ffffffff
とすることで、SRAMや内蔵RAM、内蔵I/Oにもアクセスできる。
また、SH7144Fは、モード2でリセットするとアドレスやデータバスがI/Oポートとして初期化されてしまうようだ。 これではSRAMのエリアにプログラムをダウンロードすることができない。
PFC.PACRL1.WORD = 0x1550; //ポートAをRD,WRなどの機能に設定する
PFC.PBCR1.WORD = 0x000A; //ポートBのA21,A20をアドレスに設定する
PFC.PBCR2.WORD = 0xA005; //ポートBのA16〜A19をアドレスに設定する
PFC.PCCR.WORD = 0xFFFF; //ポートCのA0〜A15をアドレスに設定する
PFC.PDCRL1.WORD = 0xFFFF; //ポートDをデータバスに設定する
PFC.PDCRL2.WORD = 0x0000; // 同上
上記の処理を、設定ファイル(jptSH.cfg)でプログラムをダウンロードする前に設定してやればよいようだ。 周辺I/Oレジスタの番地を調べて、下記のように設定を追加した。 INIT POW,ffff838c,1550
INIT POW,ffff8398,000a
INIT POW,ffff839a,a005
INIT POW,ffff839c,ffff
INIT POW,ffff83ac,ffff
INIT POW,ffff83ae,0000
init.mcrには下記のように設定を追加。
RESET
FW 400000,41ffff,ffff ←これにより、プログラムがダウンロードされている部分がわかりやすい。
L C:¥○○¥△△.abs
HEWのリンカのセクションの設定を下記のように変更。
Address |
Section |
0x00400800 |
PResetPRG |
0x00401000 |
P
C
C$BSEC
C$DSEC
D |
ベクターは0番地のままなので、それらは内蔵ROMに書き込まれる。 フラッシュROMに書き込むには時間がかかるが、ベクタだけなら2秒程度で書き込まれるようだ。 ベクタ以外のプログラムはSRAMにロードされるので、ブレークして再スタートするときにフラッシュROMに書き込まれることはない。
いざ、実行してみよう。
あれ? 動かない。 単純なLEDの点滅プログラムなんだけど。
調べてみると、スタックポインタ(R15)がセットされていないようだ。
RESET、Loadすると、R15はFFFFFFFFに初期化されるが、そのまま先へ進んでしまうようだ。
ためしに、Loadしたあと、R15を0に書き換えて動かすと、ちゃんと動作する。
resetprg.cには、
#pragma entry PowerON_Reset_PC
と記述してあるのに、コンパイル後のアセンブラのリストをみると、
R15(SP)へのセットがされていない。 SH2はリセットでPCとSPをベクターテーブルより持ってくるため、PowerON_Reset_PCの先頭ではSPにセットすることはしないようだ。
#pragma asm
MOV.L #0, SP
#pragma endasm
と追加してみると、コンパイルエラーになってしまう。 #pragma asmは、このコンパイラでは許されていないようだ。 毎回R15を書き換えるのはとっても面倒だ。 どうしたらよかんべ。 なにかよい方法はないものか。
【後日記】 #pragma asmや#pragma inline_asmは、コンパイル出力を.srcに設定する必要があるようだ。 それだと、毎回すべてのモジュールを.srcファイルに落として、さらに.objにアセンブルされるので、なんかいやだなぁ。
2006年7月16日
resetprg.cを、コンパイラの出力をアセンブリプログラム(*.src)にしてコンパイルし、出てきたresetprg.srcをresetprg.cの代わりにプロジェクトに追加した。
_PowerON_Reset_PC: ; function: PowerON_Reset_PC
; frame size=0
.STACK _PowerON_Reset_PC=0
.LINE "D:\USR\ESPE\SH7144\test\test\resetprg.c",71
MOV.L #0, SP ;←この行を追加
MOV.L L12,R6 ; _INT_Vectors
これで、SPには0がセットされる。
あまり良い方法とは言えないが、resetprg.cを変更することはめったにないと思うので、よしとするか。 これでやっと毎回R15の値を変えてやる必要がなくなった。 (デバッガの画面のソースファイルでresetprg.cが表示されなくなってしまうのが悲しい。)
【後日記】 もとのresetprg.cが残っていれば、デバッガの画面にそれが表示されるようだ。
なにも表示されないよりはずっといい感じだ。
ところで、LEDの点滅の速度がやたらと遅い。
FDTで内蔵ROMに書き込んで動作させたときは1秒間に5回程度LEDが点滅したが、SRAMにプログラムをダウンロードして動かすと1回の点滅に5秒程度かかってしまう。
内蔵ROMは32bitバスだが、SRAMは16bitだからだろうか。
waitはリセット時には15waitになっているようなので、設定を変えてみた。
ついでに、将来内蔵ROMで動作させることを考慮して、hwsetup.cに以下の設定を追加しておいた。
BSC.WCR1.BIT.W0 = 0; // CS0, CS4 no wait
BSC.WCR1.BIT.W1 = 1; // CS1, CS5 1 wait
// PA
PFC.PACRL1.BIT.PA14MD = 1; // RD
PFC.PACRL1.BIT.PA13MD = 1; // WRH
PFC.PACRL1.BIT.PA12MD = 1; // WRL
PFC.PACRL1.BIT.PA11MD = 1; // CS1
PFC.PACRL1.BIT.PA10MD = 1; // CS0
// PB
PFC.PBCR1.BIT.PB9MD = 2; // A21
PFC.PBCR1.BIT.PB8MD = 2; // A20
PFC.PBCR2.BIT.PB7MD = 2; // A19
PFC.PBCR2.BIT.PB6MD = 2; // A18
PFC.PBCR2.BIT.PB1MD = 1; // A17
PFC.PBCR2.BIT.PB0MD = 1; // A16
// PC A0-A15
PFC.PCCR.WORD = 0xFFFF;
// PD D0-15
PFC.PDCRL1.WORD = 0xFFFF;
PFC.PDCRL2.WORD = 0x0000;
CS1を1waitにすることによって、LEDの点滅時間が5秒から約1.5秒へと速くなった。
それでも内蔵ROMでの動作に比べると、とても遅い。やはり16bitバスと32bitバスの違いか。
2006年7月31日
CQ出版では、SH-2基板特設ページというのを公開している。
そこには、14pinのJTAGコネクタのピン配置やDBGMDピン以外のことにも触れられている。
1.電源が発振することがある。 LDOの一次側のC8コンデンサに並列に47μF〜220μFのコンデンサを追加したほうがよいようだ。
2.RX1のプルアップ抵抗をカット。 掲示板で「RX1がVccでプルアップされている」と盛り上がっている。 最初、プルアップされていてなにが問題なのかピンと来ませんでしたが、TTL側ではなく、RS232C側のRxDラインがVccにプルアップされているようだ。 そりゃーまずいわな。 さっそく私の基板もパターンをカットした。
掲示板では、CQ出版社の対応などがいろいろと批判されているが、私はSH-2基板を付録に付けたというのは、絶賛されるべき企画だと思う。 私のようなソフト(ファーム)屋が、2万円も3万円もするCPUボードをおいそれと購入してみる気にはなれないが、雑誌に「おまけ」でついていると知って、おもわず購入してしまった。 「雑誌」の影響力は大きいと思う。
2010年10月19日
ひさしぶりに、この基板を使用して、プログラムをHEWで新規に作成して動かしてみた。
PARTNER-Jで起動しようとすると、「キーコードが合っていない」と表示され、起動できない。
「キーコード」ってなんだっけ? すっかり忘れてしまった。
いろいろと以前に作成したプログラムを調べてみると、
PARTNER-Jの起動時の設定ファイル(jptSH.cfg)に「KEY CODE」を設定し、
プログラムの20h〜23hに、同じキーコードを設定していた。
具体的には vecttbl.c のINTTBLの8番目にキーコードを埋め込んでいた。
ちなみに、jptSH.cfgの「KEY CODE」をffffffffに設定すると、キーコードが合っていなくても
PARTNER-Jは起動するが、フラッシュROMは毎回消去されるようだ。
|