![]() |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
基礎編 |
HEWの「ビルド」ボタンを押すとMOTファイルまで勝手に作ってくれます。通常はこれで何の問題もなく使えるので「そういう物だ」くらいにしか認識していないと思いますが、実はこれにはフラッシュROMが128KBで、RAMが4KBであるという前提の元、それぞれのメモリのどのアドレスにどの命令を置くとか、どの変数領域を確保するとかを決めてくれているのです。だから仮に、 char tmp[30000]; のように決して確保できない変数を確保しようとするとエラーが起きます。 これからやろうとしていることは、この「RAMは4KB」という大前提を覆すわけですから、HEWにもそれなりの設定が必要です。 ここからはまずハードウェアの設計を説明し、それからソフトウェアの設定について順に述べていきたいと思います。
機能を紹介する中で「変化させます」とかいう表現を使ったりしていますが、実は、CS・OE・WEに関してはチップによってHighで有効な場合と、Lowで有効な場合で種類が違うことがあります。だいたいは問題なく使えるのですが、たまに違う物があるので知識として知っておく必要があります。 どちらのタイプなのかを知るには仕様書のタイミング波形図を見れば良いわけですが、もっと簡単な見分け方として、ピンのところに、
という約束になっているので覚えておいてください。なお、H8の方がリード・ライトの際にそれぞれの端子にどのような信号を出すのかについてはハードウェアマニュアル6章「バスコントローラ」にタイミング波形図が載っています。 なお、ホームページではバー表記ができませんので、以降は「CS-」のように表現します。 では、実際にSRAMとH8/3048Fの結線を次の表に示します。
ここで、アドレスバスが0〜14の15ビット分しかありませんが、私が実験に使用したSRAMがたまたま32KBの物であったためにこれで足りたのですが、もっと大きな容量のSRAMを使用する際には当然アドレスバスはさらに多くなります。H8/3048Fには20本のアドレスバスが存在しますので、普通に考えられる範囲の容量には対応できるはずです。 また、データバスがH8では8〜15ビット目を使っています。これは3048Fの仕様で8ビット幅でアクセスする際にはデータバスの上位を使用するという決まりが有るためです。さらに、ライトイネーブルに対してHWRという端子を使っていますが、この「H」とはデータバスの上位を使っているという意味ですので、本質的には同じ役割を果たすLWRを間違って使うとまったくタイミングが合いませんので注意してください。 最後に、うっかり忘れてはいけない配線ですが、今まで使うことの無かったAKI−H8のCN5を今回は使います。これはモードを設定するための端子で、今まではシングルチップモード(モード7)を使ってきましたが、今回は
という条件ですので、モード5を使います。したがって、MD1端子をGNDに落としてください。具体的にはCN5-3,4をショートさせます。 以上でハードウェアのセッティングは完了です。 まず、HEWの[Options]の中にある[H8S / H8/300 IM OptLinker]を開いてください。さらにそのなかの[Section]というタブがこれから変更する設定です。初期の状態では次のような表示になっているはずです。
ここからでは見えませんが、スクロールバーを下に動かしていけば「B」というセクションがH'000FEF10という領域に割り当てられていることが分かります。この番地は標準搭載のRAMが始まる番地で、この「B」というのはHEW付属マニュアルの一つ、リンケージエディタユーザーズマニュアル34ページによると「未初期化データ変数領域」となっています。これを新しいRAMの領域に引っ越しさせます。 そもそも新しいSRAMがどこにマッピングされているかですが、ハードウェアマニュアル3章「MCU動作モード」8ページ目によると、モード5におけるCS1はエリア1番、つまりH'00020000からマッピングされていることが分かります。
このままでは単にその番地にも何らかのセクションが設けれるようになっただけですので、実際にセクションを指定しますが、その前にあらかじめH'000FEF10に登録されいた「B」のセクションを「Remove」で削除しておきます。セクションがあちこちにマッピングされていると面倒ですから・・・ そして、次の図に示すように新たにマッピングしたH'00020000のところに「B」のセクションを設定します。
これでBのデータ変数領域は引っ越せました。疑わしければプログラムで一度内蔵RAMの容量(4KB)を超える配列なり変数なりを確保してみれば、確かにそこのメモリが使われていることが分かるはずです。
なお、この使い方の場合にはプログラムそのものには何ら変更は必要有りません。単に使うRAMのアドレスを変更しただけですので、以降はHEWが今までと同じように領域の配分を考えてくれます。 ユーザーが唯一気にしなければいけないのは、ビルド時に生成されるMAPファイルを時々確認して、増設したSRAMの容量を超えていないかどうかだけは念のためにチェックしておく方が無難です。
秋月電子で販売されているH8/3067Fボードを使う場合、標準で付属している32KBのSRAMならば付属説明書の通りにジャンパすれば配線的には何も難しいことはありません。 (はまやんさん、情報提供ありがとうございました)
|