続・統合開発ツールで"ラクラク"マイコン開発 <ARM編> ―― IAR Embedded Workbenchを使った開発を体験してみる

山際 伸一

●プロジェクトをビルドする

 リスト1のmain.cをビルドすると,多くのエラーが表示されます.それぞれの対応策を見ながら,簡単に回避できる方法を考えてみましょう.

(1)ヘッダ・ファイル

 リスト1で使用しているヘッダ・ファイルは,μVision特有の名前ですから,当然エラーになります.

IAR Embedded Workbenchでは,C:\Program Files\IAR Systems\Embedded Workbench 5.4 Kickstart\arm\INC\にヘッダ・ファイルがあります.C言語の標準関数もデバイス依存性なくサポートしています.しかし,リスト1のようなデバイスのレジスタを直接制御するようなコードにマッチしたヘッダ・ファイルはありません.

(2)レジスタの宣言

 IAR Embedded Workbenchでは,レジスタの宣言が用意されていません.そこでリスト2のようなマクロを,main関数の前に追加する必要があります.

リスト2 main関数の前に追加するマクロ記述

#define SCB_BASE_ADDR    0xE01FC000
#define SCS            (*(volatile unsigned long *)(SCB_BASE_ADDR + 0x1A0))    

#define PINSEL_BASE_ADDR    0xE002C000
#define PINSEL1        (*(volatile unsigned long *)(PINSEL_BASE_ADDR + 0x04))
#define PINMODE1        (*(volatile unsigned long *)(PINSEL_BASE_ADDR + 0x44))

#define FIO_BASE_ADDR        0x3FFFC000
#define FIO1DIR        (*(volatile unsigned long *)(FIO_BASE_ADDR + 0x20))
#define FIO1MASK       (*(volatile unsigned long *)(FIO_BASE_ADDR + 0x30))
#define FIO1PIN        (*(volatile unsigned long *)(FIO_BASE_ADDR + 0x34))

 

 ここで,μVisionを併用すると,μVisionが生成したヘッダ・ファイルを利用できるので,ラクができます.

メイクして,HEXファイルをマイコンに書き込んでみると,LEDの点滅が非常に長い周期で実行されることが分かります.これは,LPC2388をデフォルト設定のまま使っているためです.つまり,所望のタイミングを得るために必要なクロック設定を行っていません.

(3)クロック設定のコードを足す

 クロック設定のための関数をリスト3に示します.リスト2の直後に足して,main関数の最初でCPU_Initialize関数を呼び出します.これでLEDの点滅間隔が適切になります.

リスト3 クロック設定のための関数

// CLK initialization code below
#define CCLKCFG        (*(volatile unsigned long *)(SCB_BASE_ADDR + 0x104))
#define PLLFEED        (*(volatile unsigned long *)(SCB_BASE_ADDR + 0x08C))
#define CLKSRCSEL      (*(volatile unsigned long *)(SCB_BASE_ADDR + 0x10C))
#define PLLCFG         (*(volatile unsigned long *)(SCB_BASE_ADDR + 0x084))
#define USBCLKCFG      (*(volatile unsigned long *)(SCB_BASE_ADDR + 0x108))
#define PLLSTAT        (*(volatile unsigned long *)(SCB_BASE_ADDR + 0x088))
#define PLLCON         (*(volatile unsigned long *)(SCB_BASE_ADDR + 0x080))

void CPU_Initialize(void)
{
  if ( PLLSTAT & (1<<25) ) {
    /* PLLCON - PLL Enable & disconnected */
    PLLCON   =0x00000001;
    /* PLL Feed operation */
    PLLFEED  =0x000000AA;
    PLLFEED  =0x00000055;
  }
  /* PLLCON - PLL Disable & disconnected(PLL完全停止) */
  PLLCON   =0x00000000;
  /* PLL Feed operation */
  PLLFEED  =0x000000AA;
  PLLFEED  =0x00000055;

  SCS = 0x21;    /* 12MHz OSC Enable & FGPIO Select */
  while((SCS&0x40) == 0){}    /* OSCSTAT Wait */

  /* CLKSRCSEL - MASTER oscillator select */
  CLKSRCSEL=0x00000001;

  /* PLLCFG - MCLK=12MHz use, FCC0 = 288MHz M=144,N=12 */
  PLLCFG   =0x000B008F;
  /* PLL Feed operation. */
  PLLFEED  =0x000000AA;
  PLLFEED  =0x00000055;

  /* PLLCON - PLL Enable & disconnected */
  PLLCON   =0x00000001;
  /* PLL Feed operation */
  PLLFEED  =0x000000AA;
  PLLFEED  =0x00000055;

  /* CPU Clock Divider 1/4 */
  CCLKCFG  =0x00000003;
  /* USB Clock Divider 1/6 */
  USBCLKCFG=0x00000005;

  while ( ((PLLSTAT & (1<<26)) == 0) ); /* Check lock bit status */

  /* PLLCON - PLL Enable & Connected */
  PLLCON   =0x00000003;
  /* PLL Feed operation. */
  PLLFEED  =0x000000AA;
  PLLFEED  =0x00000055;
  while ( ((PLLSTAT & (1<<25)) == 0) ); /* Check connect bit status */
}

 

 IAR Embedded Workbenchでは,このようなコードを用意しなければならないので,記述量が多くなってしまう傾向があるようです.しかしツール自体に含まれているサンプルを活用すれば,コードを記述することは難しくありません.図5のように,ツールに含まれているARM用インフォメーションセンターを利用します.

 


図5 LPC2388向けのサンプルの選び方

●まとめ:自分にとって有益な機能をじっくり検証しよう

 μVisionとIAR Embedded Workbenchを比較してみます.

μVisionは,GUIでラクに設計できる傾向にあります.マイコンの型番が決まっている場合は,μVisionのほうが自動的に設定される事柄が多く,専用のスタートアップ・コードを生成してくれるからです.

一方,IAR Embedded Workbenchには,サンプル・コードがツールに含まれているところが強みです.

どのような設計ツールにも,一長一短があります.評価版を使うときには,自分にとって有益になる機能をじっくり検証することをお勧めします.

組み込みキャッチアップ

お知らせ 一覧を見る

電子書籍の最新刊! FPGAマガジン No.12『ARMコアFPGA×Linux初体験』好評発売中

FPGAマガジン No.11『性能UP! アルゴリズム×手仕上げHDL』好評発売中! PDF版もあります

PICK UP用語

EV(電気自動車)

関連記事

EnOcean

関連記事

Android

関連記事

ニュース 一覧を見る
Tech Villageブログ

渡辺のぼるのロボコン・プロモータ日記

2年ぶりのブログ更新w

2016年10月 9日

Hamana Project

Hamana-8最終打ち上げ報告(その2)

2012年6月26日