Linux版へ
Windows版へ
目次 次へ
ヘッダファイル(3664.h)
 

(他のマイコンでもそうですが、)H8 3664では、 内臓I/Oレジスタに値を設定することによって、 各種の機能を実現します。

したがって、それぞれのレジスタに使いやすいように名前をつけておくと便利です。 それを行っているのがヘッダファイル3664.hです。

ここでは、ヘッダファイル3664.hの意味を考えてみましょう。

なお、 GCC Developer Liteのヘッダファイル3664.hは、 標準ではC:\Program Files\BestTech\GCC Developer Lite\TARGET\3664F\3664.hにインストールされているので、 実際に見比べて確認してみてください。

 
typedef
 

typedef unsigned long  _LONG;
typedef unsigned short _WORD;
typedef unsigned char  _BYTE;

ここでは、typedefを使って、データ型に別名を付けています。

typedef unsigned long  _LONG;
は4バイトの符号無しlong型に _LONGという別名をつけているわけです。 以下では、_LONGと書けば、unsigned long型と同じことになります。

同様に、_WORDは2バイトの符号無しshort型を、 _BYTEは1バイトの符号無しchar型をあらわします。

 
ビット・フィールド、構造体、共用体
 

union _BITFIELD {
  _BYTE   BYTE;
  struct {
    _BYTE B7  :1;
    _BYTE B6  :1;
    _BYTE B5  :1;
    _BYTE B4  :1;
    _BYTE B3  :1;
    _BYTE B2  :1;
    _BYTE B1  :1;
    _BYTE B0  :1;
  }       BIT;
};

ここでは、ビット・フィールド、構造体、共用体が使われています。 まずは、structの部分だけを見てみましょう。

  struct {
    _BYTE B7  :1;
    _BYTE B6  :1;
    _BYTE B5  :1;
    _BYTE B4  :1;
    _BYTE B3  :1;
    _BYTE B2  :1;
    _BYTE B1  :1;
    _BYTE B0  :1;
  }       BIT;

この部分では、 1バイト(8ビット)を1ビットずつ操作できるように、 ビット・フィールドを用いています。

    _BYTE B7  :1;
は、_BYTE型の1ビットのフィールドをB7という名前で 定義していることになります。

structは構造体をあらわし、 ここでは、1ビットのフィールドB0からB7で構成されていることを表しています (この書き方は、ちょっと気になるのですが・・・)。

各フィールドを参照するには、 BIT.B7のような書き方をします。

unionは共用体といい、 構造体が「並べて」メモリを確保するのに対して、 「重ねて」確保します。

今の場合には、BYTEで1バイト全体を、 BITで1ビットずつを利用できるようにしています。

 
内臓I/Oレジスタ
 

/*-------------------------------------------------------------------------
   タイマA
 *-------------------------------------------------------------------------*/
struct st_ta {
  union {
    _BYTE     BYTE;
    struct {
      _BYTE   CKSO  :3;
      _BYTE         :1;
      _BYTE   CKSI  :4;
    }         BIT;
  }           TMA;
  _BYTE       TCA;
};

#define TA      (*(volatile struct st_ta    *)0xFFFFA6L)   /* TA    Address*/

上記の説明から、構造体st_taは以下のような構造をしているのが分かるかと思います。 分からなかったらごめん・・・

#define TA      (*(volatile struct st_ta    *)0xFFFFA6L)
は、TAを
(*(volatile struct st_ta    *)0xFFFFA6L)
で置き換えろという意味です。 この書き方も良く分からないのですが、 構造体st_taへのポインタにタイマA関連のレジスタのアドレスを割り当ているようです。 TA.TCAのように使うことができます。

上では、記述が短かったのでタイマAで説明しましたが、 他のレジスタに関しても同様の定義がされています。 確認してみてください。

 
2003/05/12(Mon)
AKI-H8/3664 QFP版のトップページへ
トップページへ
SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送