2010年4月29日木曜日

SH-2A基板用HEWモニタプログラムを外付けシリアル・フラッシュROMに書き込む。



手持ちのシリアル・フラッシュROM(M25P40 512Kバイト)を SH-2A基板(Interface 2010.06付属)のブート用に使いたいと思い、HEWモニタプログラムの書き込みに挑戦しました。











概要

SH-2Aマイコン基板実装SPIシリアル接続フラッシュROM アップデート・ファイル
[アップデートプログラム(SPIwriterAll) ]==(SPI Ch0)==> [基板上のシリアル・フラッシュROM(M25P05-A)]

[アップデートプログラム(SPIwriterAll)改 ]==(SPI Ch1)==> [外付けシリアル・フラッシュROM(M25P40)]
に改造


手順

 1.Interface誌 Webサイトの
   [付属SH-2A基板特設ページ]/[付属SH-2A基板関連のダウンロード・データ]/[付属SH-2Aマイコン基板回路図などをアップロードしました]
    で SH-2Aマイコン基板実装SPIシリアル接続フラッシュROM アップデート・ファイル(2010年4月24日版)
      で ROM_UpDate0424.zip を取得した。

 2.アップデートファイルの解析。
   内容: アップデートプログラム(SPIwriterAll) +  HEW モニタプログラム(書き込みデータ) の構成
  1)アップデートプログラム(SPIwriterAll / main.c)
   ポインタ 0x1C080000 以降のデータをSPI Ch0 のシリアル・フラッシュROMのアドレス 0x00000000 以降に 64Kバイト書き込む。
  2)ポインタ 0x1C080000 について。
    アップデートプログラム(SPIwriterAll)のリンクマップ(SPIwriterAll.map)をみる、マッピングリスト末尾は 1c07ffff となっている。  
     ==> これが、main.cでの HEW モニタプログラム のポインタ 0x1C080000 の 起源?
 (デバッグでの注意点)
     ==> main.cでの HEW モニタプログラム のポインタ(0x1C080000)と HEW ダウンロードモジュールのオフセット設定と、が一致していること。 

 3.アップデートプログラムの改造
  1)フォルダ ROM_Update を ROM_Createに複写 これ以降 ROM_Createでの作業
  2)プログラムソース(serial_flash.c)の修正
    SPI Ch0を Ch1に置き換える。 
   ①関数 io_init_rspi(void) の修正
    ・ポートレジスタの設定 SPI Ch1 用に
     PG20:MISO1 PG19:MOSI PG18:SSL10 PG17:PSPCK1
    ・SPI CH1レジスタの稼動
     スタンバイコントロールレジスタ5のMSTP50(SPI Ch1用)に0設定
    ・SPI Ch1レジスタの設定
     SPI Ch0に対応する一連のレジスタ群用に宣言された構造体RSPI0の使用をCh1用のRSPI1に変更
   ②関数 io_cmd_exe() の修正
    ・SPI Ch1レジスタの設定
   ③関数 io_cmd_exe_rdmode()の修正
    ・SPI Ch1レジスタの設定
   ④関数 io_cmd_exe_rdmode_cpu_l()の修正
    ・SPI Ch1レジスタの設定
   ⑤関数 io_cmd_exe_rdmode_dma_l()の修正
    ・SPI Ch1レジスタの設定
    ・DMAの設定 
      DMA 拡張リソースセレクタ0 の設定 0x52 を 0x56 (DMAC Ch0のMIDの変更)
      DMA ソースアドレスレジスタの設定 SPI Ch0のデータレジスタ(RSPI0.SPDR.BYTE)のポインタをSPI Ch1のデータレジスタ(RSPI1.SPDR.BYTE)のポインタに変更
   ⑥関数 io_wait_tx_end() の修正
    ・SPI Ch1レジスタの設定

  3)ヘッダーファイル serial_flah.hの修正
    M25P05-AとM25P40の差分を反映させました。
    ・セクタサイズ 0x8000を0x10000に
    ・セクタ数 2を8に

  4)HEWでビルドする。

 4.シリアル・フラッシュROM M25P40(512Kバイト)の接続
   付属SH-2A基板 CN3 Pin 21,22,23,33(SPI Ch1)に M25P40 を接続

 5.HEW モニタプログラムの書き込み。

 6.書き込んだシリアル・フラッシュROMを SPI Ch0に繋ぎ直す。
   付属SH-2A基板 CN3 Pin 36,37,38,40 (SPI Ch0)に M25P40 を接続

 7.外部フラッシュメモリによるブート設定
   付属SH-2A基板  JP16パターンカット

 8.HEWモニタプログラムの動作検証
  1)付属SH-2A基板のデモプログラム
    どうも、フラッシュメモリに書き込んだデータに基板上のシリアル・フラッシュROMと同じLED点滅のデモプログラムが書かれているようで、JPP2ショートで、リセット後に基板上のLEDの点滅が始まる。
    念のため、外付けROMを外すと、動かない(LED点滅しない)
  2)HEWでの確認
    Interface誌のサンプルプログラム SH7262_LED のホルダをコピーし、HEWで若干の変更を行った
    (変更内容 ポートBの20,21,22ピン(bit)にそれぞれLEDを接続し、付属基板上のLEDと交互に点滅させる。)
    ビルドし、ダウンロードし、プログラムの動作を確認しました。

※とりあえず、これで、付属SH-2A基板上のシリアル・フラッシュROM(M25P05-A)が潰れても何とかなりそうです。

---以降 HEW開発メモ---
1.割り込み優先レベル15は使えない。
resetprg.c の #define SR_Init 0x000000F0
を#define SR_Init 0x000000E0に修正する必要 (Interface2010.6 P105 ●ステータスレジスタの初期値設定)
(HEWモニタが割り込みを使用しているため。ユーザープログラムで割り込み優先レベル15は使えない。)

2.セクションの設定
 1)スタックサイズ、スタックポインタ  stacksct.h で設定。 スタックサイズ設定値:H'FA00
スタックポインタの設定ファイル 不明
(HEWでは、[プロジェクト]/[構成の編集]/[スタック]

3.HEWでのアプリケーション開発を、既存のプロジェクトのフォルダをコピーして行う場合。一旦「ダウンロードモジュール」を削除し、再登録しなおしたほうがよい。
 Interface2010.6 第3章「開発ツールHEWの使い方。。。」(P109)での「ダウンロードモジュール」の追加で$(CONFIGDIR)\(PROJECTNAME)を使えば問題ないのですが、どうやら「参照」を使って「ダウンロードモジュール」が設定されていた場合、元フォルダのプログラムをダウンロードすることになります。
 (いくら修正しても”元のまま”ということになります。)

2010年4月27日火曜日

HEWと付属SH-2A基板の接続

CQ出版Interface誌(2010.6)付属基板が、ようやくHEWから認識できるようになったので、その要点を以下にまとめます。

1.構成
[[PC側]][HEW][シリアル接続HEWモニタ](SH2A_VcomINF)==(USB接続)==[HEWモニタプログラム][ユーザープログラム][[付属基板側]]

HEW:shv9302_ev.exe
シリアル接続HEWモニタ:HEWmonitor.zip 
SH2A_VcomINF(付属SH-2Aマイコン基盤用仮想シリアル・ドライバ):SH2A_VcomINF.zip
(5/3)

2.PCで属SH-2A基板は、COM1~COM9の範囲で認識させる。
  シリアルHEWモニターは、10番を超えるCOMポートには対応できません。・・・(Interface2010.6 P100 コラム1)
3.USBケーブルはPC本体に繋ぐ
  パソコン本体のUSBポートを使って下さい。・・・(Interface2010.6 P100 コラム1)

Interface誌Webサイトからダウンロードした、LEDチカチカのサンプルプロジェクト(Interface_Sample.zip)をHEWで開けると、「デバイスドライバが見つからないか、接続をキャンセルしましたSH-2A Serial Moniter」のエラーメッセージが表示され、付属SH-2A基板との接続に失敗しました。

さて接続エラーの対処を以下に記します。

1.PCのシリアルポートを確認
[コントロールパネル]/[管理ツール]/[コンピュータの管理]/[デバイスマネージャ]
ポート(COMとLPT)のエントリを確認すると、[USB SerialPorts Driver(COM18)]で更に、そのエントリのプロパティを確認すると、COM1、COM3~COM17が使用中([ポートの設定]/[詳細設定])となっていた(少々驚き)でCOM3が実際に使用されていないのを確認し、付録SH-2Aを強制的にCOM3に割り当てた。
==>まだ接続失敗 

2.USBケーブルを本体に繋ぎなおす。
==>まだ接続失敗

3.Interface(2010.6)の「開発ツールHEWの使い方とサンプル・プログラムの作り方」(第3章)の 「2.プロジェクト構築」以降を実行。
★この段階で初めてPCに「シリアル接続HEWモニタ」をインストール(HEW アドミニストレーションでの登録)する必要があることを知る。
==>ようやくHEWが付属SH-2A基板に繋がった。

4.ついでに、「Appendix3 シリアル・フラッシュROMのアップデート手順」を実行。
「SPIwriterAll.absとSPIROM.BINの付録SH-2A基板へのダウンロード」
  これらのファイルを一ずつダウンロード。
「リセットを実行(図Aの②のボタンをクリック)して」
 PC(プログラムカウンタ)1C000800、R15(スタックポインタ)1C080000にならなかった。
 *付属基板フラッシュROMが潰れるのを覚悟で、プログラムの実行(図Aの④)ボタンをクリックした。
  数度のクリックで、PC:1C000800、R15:1C080000になった。
  ・・ほっとした。
  プログラムの実行(図Aの④)ボタンをクリックした。
  ==>HEWモニタプログラムの書き換えが始まった。少し待つと基板のLEDの点滅が始まった。(書き換え成功)


確認) 一応 LEDチカチカのサンプルプロジェクトをHEWで開け、付属SH-2A基板にプログラムをダウンロード、デバックを試しました。==>上手くいくようです。


<<注意>>この作業は、フラッシュROMをつぶしてしまう可能性があるので、実行に際しては、Interface誌を熟読のうえ、慎重に行って下さい。上記記事の内容に責任は持てません、ご容赦願います。

5.Windows7でのメモ(5/3)
※Windows7(Home Premium 32bit)でHEWのインストール
 付属SH-2A基板をUSBで繋いだ際に、Windowsで、新しいデバイスの認識が出来なかった。
 Windowsのデバイスマネージャでは不明のデバイスとして表示されていました。
 この、不明のデバイスのドライバのインストール作業が必要 (SH2A_VcomINFを使用)
(忘れがち)

2010年4月25日日曜日

Interface 2010.06(付属基板付き)

ようやくInterface誌が、手元に届きました(4/23)。早速付属基板の解説ページを繰りました。

1.不満な点
まず、搭載シリアルフラッシュメモリの確認、Numoryx(STマイクロ) M25P05-Aとある、「エ!」 M25P05-A、M25P05-A、M25P05-A、M25P05-A。。。。
不安を抱えながら読み進む。512Kビット!!、(64Kバイト)!!、さらに、後半32Kバイトはユーザー用として使う、、、!!
 アマチュアレベルの私にとって、かなりショックキングな内容が明らかになってきました。
昨年のARM7付属基板でLEDチカチカのプログラムサイズが34Kバイト(コンパイル等のオプションで小さくなるかも知れないのですが)
同誌の「CPU内臓LCDコントローラを使った...(第6章)」の記事の内容がこの基板で実現出来るのか!!!

2.納得な点
 ・とにかくSH-2A搭載がうれしい。またその充実した能力もうれしい。
 ・昨年のARM7付属基板と同様拡張コネクタが40Pin×3Chあり、さらに10Pinが1Ch追加で搭載されています。SH7262(SH-2A)の全てCPUピンが使用可能となっていることです。
(PA0~PA3は使えないようですが。)

3.不満な点 その2
 1)SH7262(SH-2A)に対して、
   ・SPI(ルネサスシリアルペリフェラルインタフェース)のチャネル1と、ビデオディスプレイコントローラ3のCPUピンが重なっている。
 2)付録基板に対して、
   ・拡張コネクタの位置、
     CN1,CN2の位置は入れ替わったほうが良さそう。

4.さて、どうしよう
 案1 昨年のInterface(ARM7付属基板 号)を買い足す。
 案2 SH7262のブートモードをNANDフラッシュROMにする。
    ①LPC2388等でNANDフラッシュにプログラムを書き込み、このNANDフラッシュを使い、、、
 案3 シリアルフラッシュメモリを外部につなげる。
    今手元に、シリアルフラッシュメモリM25P40がありこれを使う。
    (雑誌で紹介された、(株)アルファプロジェクト HJ-LINK/USB Debugger for SH7262を使う)
 案3-2 シリアルフラッシュメモリを外部につなげる。
    基板上のHEW モニタプログラムを、大容量のシリアルフラッシュメモリに複写する。

昨年のARM7付属基板の時は、IARの開発ツールの限定に不満を持ち、GNU GCCによる開発環境の整備に四苦八苦、今年は、搭載シリアルフラッシュメモリの容量”小”で、てこずりそうです。

2007年のV850付属基板と比較すると、Interface誌の付属基板の企画はアマチュアにとって年々高度になっているように思います。

Interfaceの編集部各スタッフのスキルUPに私が追いつけなくなってきているだけかもしれません。

Interface編集部には、この付録基板のフォローを厚くして頂くことを希望します。

2010年4月23日金曜日

Interface 2010.06(付属基板付き)発売前夜

いよいよ、今週末、CQ出版 Interface誌(付属基板付き)が発売となります。

この基板には、マイクロコントローラして、ルネサスSH-2Aが搭載されます。
同誌の付録基板(旧NECエレV850)でマイコンデビューし、STM32、78K、LPC2388のプログラム作成にトライしてきた私としては、SH2付録基板は、入手し損ねた幻の基板という位置付けです。

本年当初には、Interface 増刊として液晶マイコン基板付きの雑誌が発行され、トランジスタ技術でも、ルネサスH8基板が付いた増刊が発行されたりしたことから、今年の同誌付録基板企画は無いのではと諦めていました。
ところが、2月下旬ごろ、同誌の予告で今年の基板は、「ルネサスSH-2A」と知り、さらにその性能が桁外れに優れたものであることを知り同誌の発売を心待ちにするようになりました。
また、併せて、SH2Aの下調べを行い、その内容を以下に述べます。

1.資料等の入手
 1)ルネサスエレクトロニクスWebサイトより。
   「ホーム / 製品 / マイクロコンピュータ / SuperH RISC engine ファミリ / SH7260 シリーズ / SH7262, SH7264 グループ / 」

   ・SH7262グループ、SH7264グループハードウェアマニュアル
   ・アプリケーションノート サンプルコード 
     ルネサス エレクトロニクス(株)の「MY RENESAS」というアカウント登録が必要
     サンプルコードとして、「ビデオディスプレイコントローラ3 映像表示例」等を入手
 2)SHのサンプルコードを入手
   各Webサイトより、SH772x、SH7144のサンプルコードを入手

2.SH-2Aの特徴
 あくまでも、趣味レベルの感想ですので、思い違いもあるかと思います。ご容赦願います。

 1)[iodefine.h] によるレジスタ定義
  9.2Kステップを超える巨大なヘッダーファイルにSHのレジスタの定義情報が各機能ごとに格納されています。
  ARM系のマイコンとの比較になりますが、SHのレジスタのコーディング上の扱い。

         |<ARM_系>         |<SH系>          |
=========+==============+==============+
レジスタ定義   |ポインタ(アドレス指定)  |構造体           |
---------+--------------+--------------+
レジスタ設定   |ビットビットパターンで設定 |構造体メンバーで設定    |
---------+--------------+--------------+
レジスタサイズ  |ほとんど32(16)ビット    |08,16,32ビットが混在    |
---------+--------------+--------------+


  例 UART(シリアル通信)Rx端子設定

   ①ARM系
     コーディング PINSEL1 &= 0xFFFFFFFC;
            PINSEL1 |= 0x00000001;
         PINSEL1:汎用入出力の機能選択レジスタ 対象ポート0の16~31番ピンが対象
         ポート0の16番ピンはPINSEL1の0-1bitで機能選択
         まずピットパターン(マスクパターン)ANDでレジスタの該当ビットをクリア
         機能1選択用のビットパターン ORでレジスタの該当ビットを設定

-----------------LPC23xx.h---------------------------------------
#define PINSEL_BASE_ADDR 0xE002C000
#define PINSEL1 (*(volatile unsigned long *)(PINSEL_BASE_ADDR + 0x04))
....汎用入出力の機能選択レジスタのアドレス(ポインタ)
------------------------------------------------------------------

   ②SH系
      コーディング  PORT.PGCR3.BIT.PG12MD = 4;
        PORT:汎用入出力の構造体
        PGCR3:ポートG コントロールレジスタ3を定義する構造体
        PG12MD:ポートG 12番ピンの設定ビット
        4:機能 [RxD1]を 選択

-----------------iodefine.h---------------------------------------
#define PORT (*(volatile struct st_gpio *)0xFFFE3812) 
.....汎用入出力の構造体宣言 (宣言の代替といったほうがよいかも!)
struct st_gpio {                /* PGCR3    */
    union {                 /* PAIOR0    */
       _UWORD WORD;            /* Word Access */
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
    union {                 /*    */
       _UWORD WORD;            /* Word Access */
       struct {              /* Byte Access */
          _UBYTE H;          /*  High    */
          _UBYTE L;          /*  Low    */
          } BYTE;           /*       */
       struct {              /* Bit Access */
          _UBYTE :1;         /*       */
          _UBYTE PG15MD:3;      /*  PG15MD   */
          _UBYTE :1;         /*       */
          _UBYTE PG14MD:3;      /*  PG14MD   */
          _UBYTE :1;         /*       */
          _UBYTE PG13MD:3;      /*  PG13MD   */
          _UBYTE :1;         /*       */
          _UBYTE PG12MD:3;      /*  PG12MD   */
          } BIT;           /*       */
       } PGCR3;              /*       */

・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
--------------------------------------------------------------------

 2)マニュアル上の独特機能表現
   マニュアル上に、ルネサス独特の以下のような表現があり、戸惑いを覚えました。
   ①UARTを使おうとすると、FIFO 内蔵シリアルコミュニケーションインタフェースを利用
   ②SPIを使おうとすると、ルネサスシリアルペリフェラルインタフェースを利用
   ③タイマを使おうとすると、マルチファンクションタイマパルスユニット2または、コンペアマッチタイマを利用


3.開発環境の整備
 開発環境としてHewがあるが、無料版の制限次第で、GNUの環境を整えました。
 1)GNUの開発環境を整備
   ・KPIT(Webサイトには、ルネサスのパートナーと表記)からSHの開発環境(GNU)をダウンロード
    開発環境は、 GNUSHv1001-ELF.exe というインストールプログラムで提供されます。
インストール実行でGNU GCCの環境、newlib、binutils等の環境が整うようです。
    注意点)KPITに対し、ユーザー登録が必要であり、平日(営業日)に行う必要がある。私は休日にユーザー登録を行ったため、当日、パスワードが発行されず、後日営業日にパスワード発行のメールを受け取った。
   ・各ツールにパスを通す。
     インストール先をデフォルトのままにしたので、以下のパスをWindowsの環境変数PATHに追加した。
     C:\Program Files (x86)\KPIT Cummins\GNUSHv10.01-ELF\sh-elf\bin
     C:\Program Files (x86)\KPIT Cummins\GNUSHv10.01-ELF\sh-elf\sh-elf\bin
     C:\Program Files (x86)\KPIT Cummins\GNUSHv10.01-ELF\sh-elf\libexec\gcc\sh-elf\4.4-GNUSH_v10.01
    以前のARM系の開発環境の整備では、Cygwinのカレントディレクトリの.bash_profileで PATH=/usr/local/arm-tools/bin:${PATH}を追加してPATHの設定を行った。
    Windowsの環境変数でも可能だと言うことを認識しました。

 2)Cygwinはインストール済み

 3)Eclipseのインストール
   ①EclipseのWebサイトより統合開発環境として、Eclipseをダウンロード( Eclipse IDE for C/C++ Developers (79 MB) )
   ②eclipse-cpp-galileo-SR2-win32.zip を展開 ホルダeclipseをC:\にコピー
   ③「Select a workspace」で C:\Embedded\SH_2A\Project_Eclipse(任意)を指定
   ④「Welcome to the Eclipse IDE for C/C++ Developers」で メニュー Help/Install New Software
   ⑤「Availabe Software」 [Add….]で
 「Add Site」で Name Zylin EmbeddedCDT Location http://opensource.zylin.com/zylincdt
Check [Zylin Embedded CDT]
   ⑥「Review Licenses」 [I accept the terms of...]
      「Securty Warning」 [OK]
      「Software Update」 [Yes]
   ⑦ eclipse.exe再起動
      「C/C++ -Eclipse」
        [Workbench]をクリック(Welcome ウインドウ内 アイコンの一つ)

 4)Hello World!(project01)のプログラムを作成
   C++でHello World!のプログラムを作成、ビルドは通る。
   実行でこける。(cygwin1.dllが見つからないエラー)
   => Cygwinを立ち上げ、project01.exeを実行 Hello World!の表示確認

  *Eclipseでは、Cygwin自体のGNU GCCが使われているようです。

    [プロジェクト]を選択
     プロパティ表示
      [C/C++ Build]/[Tool Chain Editor]
        [Used tools][Select Tools..ボタン]
     「Slect tools」
    ここに、[Available tools]と[Used Tools]が表示される。
GCC C Compiler(Av.) Cygwin C Compiler(Us.) が対になって、入れ替え可能となっています。
    たぶんこの入れ替えを行えばSH2の開発ができるのではと思いますが。。。

    現在Cygwinの環境下で、ARM7用他複数のGNU GCC環境が存在しています。そのうちSH用のGCCが GCC C Compiler(Av.) と結びついているとは思えない。

    また、[Zylin Embedded CDT]がEclipseでどのような役割を果たしているのか不明。
     プロパティ表示
      [C/C++ Build]/[Emvironment]の環境変数PATH
      [C/C++ General]/[Path and Symbols] のInclude等の設定
     ともかくいろいろありそうです。