続・統合開発ツールで"ラクラク"マイコン開発 <ARM編> ―― IAR Embedded Workbenchを使った開発を体験してみる
tag: 組み込み ディジタル・デザイン
技術解説 2010年4月30日
●プロジェクトをビルドする
リスト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 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 クロック設定のための関数
#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には,サンプル・コードがツールに含まれているところが強みです.
どのような設計ツールにも,一長一短があります.評価版を使うときには,自分にとって有益になる機能をじっくり検証することをお勧めします.