マキシム >
設計サポート
> アプリケーションノート
>
[マイクロコントローラ ]
キーワード: MAXQ6810, MAXQ2010, MAXQ8913, MAXQ2000, マイクロコントローラ, uC, RISC, 16ビット, IRリモート, IR遠隔, 赤外線遠隔制御, リモートコントロール, 低電力, バッテリ駆動, コード保護, SPI, シリアルインタフェース, 評価, キット
関連製品
APP 4314: Feb 23, 2009
ダウンロード、PDFフォーマット (396kB)
アプリケーションノート 4314
MAXQ610の評価キット(EVキット)およびIAR Embedded Workbench入門
要約:このアプリケーションノートでは、低消費電力RISCマイクロコントローラMAXQ610を対象とするアプリケーションの作成、ビルド、およびデバッグの方法について解説します。このアプリケーションノートでは、IAR™ Systems社のIAR Embedded Workbench®ツールセットおよびCコンパイラを使用します。
はじめに
The MAXQ610 は、Maxim Integrated Products製の低消費電力マイクロコントローラです。これはバッテリで動作するアプリケーション用に設計されており、小さなアクティブモード電流(1MHzで1.4mA (typ)、12MHzで3.5mA (typ))および小さなストップモード電流(200nA (typ))を実現しています。また、このマイクロコントローラは極めて効率的な16ビットシングルサイクルRISCプロセッサコアと、性能および消費電力の動的な制御に役立つ柔軟なクロック機構を備えています。MAXQ610は、多数のI/O端子を必要とし、低消費電力が重要となるアプリケーションに最適です。
MAXQ610は、次のような多数の重要な特長を備えています。
広範囲の動作電圧:1.7V~3.6V
64KBのインアプリケーション設定可能な(IAP)フラッシュ
2KBのデータSRAM
SPI™および2個のUSART
8kHzの低消費電力ナノリングウェイクアップタイマー
IRキャリア周波数の生成および変調
攻撃者によるソフトウェアIPのダウンロードを防止するコードスクランブル
コアライブラリを隔離しサードパーティ製アプリケーションからIPを安全に守るメモリ保護
MAXQ610の評価(EV)キットは、MAXQ610プロセッサ用の低消費電力アプリケーションを開発するための、実証済みの、信頼できるプラットフォームを提供します。このキットには、IRトランスミッタとレシーバ、2個のシリアルポート、ユーザ入力用の8個のプッシュボタン、アプリケーションで使用可能な4個のLED、プロトタイピング用のスペース、およびMAXQ610のすべてのI/O端子にアクセスするためのヘッダが含まれています。さらに、動作中にMAXQ610プロセッサが消費する実際の消費電力を容易に監視することができるジャンパが用意されています。
MAXQ610のEVキットのセットアップ
MAXQ610のEVキットのボードの写真を図1 に示します。EVキットには、以下のハードウェアコンポーネントが含まれています。これらのコンポーネントは、このアプリケーションノートのデモプログラムの実装と検証に使用します。
MAXQ610のEVキットのボード
JTAGボード
JTAGケーブル(MAXQ610キットのボードとJTAGボードの接続用)
9ピンのシリアルケーブル
安定化電源(5V、±5%、300mA、センタープラス)
画像の拡大 (PDF、284kB)
図1. MAXQ610のEVキット
MAXQ610のEVキットのボードとJTAGボードは、それぞれ設定変更用の複数のジャンパを備えています。このアプリケーションノートでは、表1 および2 に示すようにジャンパを設定します。
表1. MAXQ610のEVキットのボードのジャンパ設定
ジャンパ
状態
目的
JH1、JH2
任意
RS-232のレベルシフタのFORCEONおよびアクティブローのFORCEOFF入力の制御
JH3、JH4
任意
RS-232のトランスミッタ入力の設定
JH20、JH21
任意
RS-232のレシーバ出力をMAXQ610の信号に接続
JH18
任意
RS-232のアクティブローのINVALID入力をMAXQ610の制御端子に接続
JH5
ピン1 (正方形のパッド)と2を接続
安定化電圧をMAXQ610の電源に接続
JH22、JH23、JH24、JH25
短絡
MAXQ610のポート端子をLEDに接続
JH15、JH16、JH17
任意
IR回路をMAXQ610の端子に接続
JH26
短絡
JTAG接続からの電源を使用してMAXQ610のボードに給電
JH14
短絡
ボードの電源をMAXQ610に接続
表2. JTAGボードのジャンパ設定
ジャンパ
状態
目的
JH1、JH2
任意
外部DTRを使用してボード上のマイクロコントローラへのロードを制御
JH3
短絡
JTAGボードの5.0V電源をJTAGコネクタのピン8 (ターゲットボードへの給電)に接続
JTAGケーブルでJTAGボードとMAXQ610のEVキットのボードを接続してください。ケーブルの赤い線が入っている側を、JTAGボード上のコネクタのpin 9およびpin 10と印刷されている側と、MAXQ610のEVキットのボード上のコネクタのTDI-GNDと印刷されている側に接続してください。
9ピンのシリアルケーブルでPCとJTAGボードを接続してください(MAXQ610のEVキットのボードには接続しないでください)。最後に、5Vの電源をJTAGボードの電源コネクタに接続してください。
IARコンパイラ入門:blinker
Hello Worldの代わりに、MAXQ610のEVキットのボード上の4個のLED (すなわち、DS1、DS2、DS3、およびDS4)を点滅させる簡単なアプリケーションの構築から始めます。ツールスイートとして、IAR Systems 社のIAR Embedded Workbenchを使用します。このアプリケーションノート用のソフトウェアは、IAR Systems KickStartトライアルパッケージのバージョン2.12を使用して作成とテストを行いました。
新しいプロジェクトを開始する前に、MAXQ610固有のファイル数個をIARのインストールディレクトリ(通常はC:\Program Files\IAR Systems\Embedded Workbench 4.0、以下[IAR]と表記)にコピーする必要があります。このアプリケーションノートで使用するファイルは、オンライン(記事末尾の「補足情報 」の項を参照)またはEVキットに付属するCD-ROMから入手可能です。以下の指示に従ってファイルをコピーしてください。
iomaxq610.hを[IAR]\MAXQ\incにコピーします。
lnkmaxq610.xclを[IAR]\MAXQ\configにコピーします。
maxq610.sfrを[IAR]\MAXQ\configにコピーします。
maxq610.ddfを[IAR]\MAXQ\configにコピーします。
maxq610.menuを[IAR]\MAXQ\config\devicesにコピーします。
次に、IAR Embedded Workbenchを起動してください。「Create new project in current workspace」を選択してください(図2 )。MAXQ®のtool chainを選択して、「Empty project」が選択されていることを確認してください(図3 )。OKをクリックするとファイルダイアログが表示されます。この例では、プロジェクトファイルの名前を「blinker」にしました(図4 )。
図2. Workbenchの起動
図3. Empty projectの作成
図4. プロジェクト「blinker」のSave As画面
ワークスペースに「blinker」プロジェクトが表示されます。ここで、新しいファイルを作成して(File New File)、次のテキストをそのファイルにコピーしてください。
#include <iomaxq610.h>
#include <iomaxq.h>
void main()
{
/*
* Try to get a 1Hz blink on the LEDs. System clock = 12MHz.
* Timer reload = 0x5B8D = 23437. Running at div 256, so we get a timer
* interrupt once every 23437*256 cycles = 5,999,872, or roughly 500ms.
* We toggle every 500ms, so we get a 1Hz cycle.
*/
TB0R = 0x5B8D; // reload for timer 0
TB0CN = 0x0416; // timer set to run, enable interrupt, down count, div 256
PD3 = 0x0f; // set port 2 lower nibble to output
IC_bit.IGE = 1; // set global interrupt enable
while (1)
{
}
}
この簡単なアプリケーションプログラムでは、EVキットのLEDをオンにした後オフにするトグル操作のコードを、タイマー割込みを使用して呼び出しています。割込み時に、自動的にリロード値がタイマー値レジスタにロードされ、それによって約500msごとの規則正しい周期的な割込みが実現します。タイマーの動作を設定した後、LEDに接続されたポート端子を出力に設定した上で、割込みがグローバルにイネーブルされます。その後、アプリケーションは無限whileループに入ります。割込みサービスルーチン(Interrupt Service Routine、ISR)のコードで、アプリケーションが完成します(この後の図5 を参照)。
Saveをクリックして、main.cというファイル名で保存してください(コードの保存先が新規プロジェクトを作成したのと同じディレクトリ内であることを確認してください)。ワークスペースウィンドウで、「blinker」を右クリックして、Add Add main.cを選択してください。
次に、ソフトウェアの配布ソースから、isr.cとclib.r66という2個のファイルをプロジェクトのディレクトリにコピーしてください。C言語のファイルには、プログラムをコンパイルするためにコンパイラが必要とする割込みスタブが含まれています。r66ファイルには、アプリケーションの動作に必要なスタートアップコードと標準ライブラリのコードが含まれています。このコピーのステップは、新しいMAXQ610のプロジェクトを開始するごとに繰り返す必要があります。
ワークスペース内の「blinker」の行を再び右クリックして、Add Add Filesを選択し、isr.cを選択してください。
ここで、プロジェクトのオプションを設定する必要があります。Project Optionsを選択すると、オプションウィンドウが表示されます。以下のステップに従って設定を行ってください。
General Options: Targetで、MAXQ610を選択します。
General Options: Library Configurationで、ドロップダウンリストからCustom CLIBを選択します。Library FileテキストフィールドのBrowseを使用して、先ほどプロジェクトのディレクトリにコピーしたclib.r66ファイルを選択します。
Debugger: Setupで、ドライバのドロップダウンからJTAGを選択します。
JTAG: に、JTAGボードとの接続に使用するシリアルポートを入力します。
その後のアプリケーションのビルドは、簡単に行うことができます。F7を押下するか、Project Makeを選択してください。先にワークスペースの保存を行うよう促すメッセージが表示されるかも知れません。その場合は、「gettingstarted」という名前を入力してください。エラーなしでプロジェクトがビルドされるはずです。
この段階でアプリケーションを実行しようとしても(たとえば、Project Debugを選択して右矢印ボタンをクリックしても)、ボード上では何も起こりません。これは、このアプリケーションコードがタイマー割込みを使用してLEDを変化させるタイミングを判定しようとしているにもかかわらず、タイマーのISRに何もコードが存在しないためです。したがって、タイマー(ISR)用に何らかのコードを記述する必要があります。
ファイルisr.cを開いて、isr6(void)という関数を見つけてください(横に//timersというコメントが付いています)。その関数内に、次のコードを記述してください。
TB0CN = TB0CN & 0xFF7F; // clear timer 0 interrupt
PO3 = PO3 ^ 0x0f; // toggle lower nibble
このコードは、最初にタイマー割込みフラグをクリアしています(割込みフラグをソフトウェアでクリアしないと、割込みベクタが繰り返し発動する原因になります)。2行目は、ポート端子P3.0~P3.3に接続されている4個のLEDをすべてトグルさせます。
これで、プロジェクトのビルドとデバッグを行うことができます(Project Debugを選択すると、図5に示すように、実行可能なCコードの1行目に移動します)。図ではコードの先頭行がハイライト表示されており、左マージンに矢印が表示されて、プログラムがそこで停止していることを示しています。ここで実行ボタン(図6 )をクリックしてください。このボタンは、プログラムを最後まで(または次のブレークポイントまで)実行します。プログラムが無限ループを実行するのに伴って、LEDバンクが点滅し続けます。
図5. コードの1行目でプログラムが停止します
図6. プログラム実行ボタン
IAR Embedded Workbenchを使用したアプリケーションのデバッグ
次に、MAXQ610とEmbedded Workbenchツールが持つデバッグ機能の一部について調べてみましょう。MAXQ610プロセッサは、実際のシリコン上におけるデバッグを可能にする組込みのJTAGエンジンを備えています。この機能によって、高価なエミュレータや潜在的に不正確性を持つシミュレータも必要なくなります。
元のblinkerアプリケーションに戻って、前述のようにデバッガを起動してください。1行目がハイライト表示されたら、Goボタンをクリックして実行を継続してください。LEDが500msの間オンになり、続いて500msの間オフになる動作が繰り返されます。
Breakボタン(図7 )をクリックするか、またはDebug Breakを選択して、実行を一時停止してください。プログラムはwhile(1)文で停止しているはずです。プログラムは、ほとんどの時間をこの無限ループ内での実行に費やしており、割込みベクタ内では非常にわずかな時間(500msごとに数サイクルのみ)しか動作していないためです。
図7. Breakボタン
プロセッサのレジスタの値を調べるため、レジスタウィンドウを開いてください(View Register)。ここでドロップダウンメニューからTimer 0を選択すると、LEDの点滅を制御しているタイマーに関連したレジスタが表示されます(図8 )。ここに表示されるTimer 0のレジスタには、リロードレジスタ(TB0R)、制御レジスタ(TB0CN)、カウントレジスタ(TB0C)、および値レジスタ(TB0V)が含まれます。
図8. RegisterウィンドウにTimer 0レジスタが表示されています。
実際の例として、コードを数行実行して、これらのタイマーレジスタに何が起こるかを見てみます。何回か、Step Overボタン(図9 )をクリックするか、Debug Step Overを選択してください。TB0Vの値を見てください。Step Overボタンは1行のCコードを実行しますが、関数呼出しの中には入りません。このボタンをクリックするたびに、TB0Vの値が大きく変化するはずです。これは、デバッグエンジンの実行中、タイマーが常に動作しているためです。また、タイマー割込みの開始と終了ごとに、TB0CNレジスタも変化します。
図9. Step Overボタン
レジスタウィンドウは、レジスタの内容を表示するだけでなく、デバッグセッション中にそれらの値を書き込むことも可能です。プログラムを一時停止している間に、TB0Rレジスタの値をダブルクリックしてください。レジスタを0x2DC6 (=0x5B8C/2)に書き換えて、Goボタンをクリックしてください。タイマーのリロードカウントが半減し、したがってタイマー割込み間の時間が半減したため、LEDが以前の2倍の速度で点滅します。
もう1つの実例として、ライトの点滅パターンを一斉にオン/一斉にオフ(1111 0000 1111)から交互のパターン(1010 0101 1010)に変更します。ただし、この変更はプログラムを再コンパイルせずに行います。最初に、ブレークポイントを追加する必要があります。アプリケーションの実行中にisr.cファイルを開いて、タイマー割込みベクタを見つけてください。コード1行目の左側のグレー部分をダブルクリックすると、赤い×が表示されます。この×は、ブレークポイントが追加されたことを示しています。プログラムの実行がコードのこの行に到達すると、アプリケーションが停止して、画面は図10 のようになります。緑の矢印とハイライト表示されたコードが、ブレークポイントに到達してプログラムの実行がそこで停止したことを示しています
図10. 設定したブレークポイントに到達した状態。
レジスタウィンドウで、ドロップダウンリストからPort I/Oを選択してください。このコードはXOR (^)操作を使用してポート3 (PO3)の下位4ピンをトグルさせていますが、これらのピンは一度も明示的に設定されていないことに注意してください。この動作を変更するには、PO3の値をクリックして、新しい値として0x05を入力してください。これを入力すると、0101というパターンでLEDの内の2個がオンになり、2個がオフになります。その後で、Runをクリックしてください。プログラムが実行されて再びブレークポイントで停止すると、LEDの状態が切り替わっており、今度はプロセッサが1010のパターンを出力していることが分かります。赤い×をダブルクリックしてブレークポイントを解除して、Goをクリックしてください。これで、交互のLEDパターンでプログラムが連続的に動作します。
IAR Embedded Workbench内では、レジスタと同じ方法で、変数の値の監視と変更を行うこともできます。これを実際に示すため、Stopをクリックするか、またはDebug Stop Debuggingを選択することによって、アプリケーションを停止してください。これでコードの変更が可能になり、main関数に変数xを追加して、whileループ内に入れ子の形でディレイループを追加することができます。次に示すようにプログラムの変更を入力してください。このコードには意図的な誤り が含まれていますが、それについては後で説明します。
void main()
{
/*
* Try to get a 1Hz blink on the LEDs. System clock = 12MHz.
* Timer reload = 0x5B8D = 23437. Running at div 256, so we get a timer
* interrupt once every 23437*256 cycles = 5,999,872, or roughly 500ms.
* We toggle every 500ms, so we get a 1Hz cycle.
*/
long int x;
TB0R = 0x5B8D; // reload for timer 0
TB0CN = 0x0416; // timer set to run, enable interrupt, down count, div 256
PD3 = 0x0f; // set port 2 lower nibble to output
IC_bit.IGE = 1; // set global interrupt enable
while (1)
{
for (x=0;x<100000;x++)
{
if (x==100000)
PO3 = PO3 ^ 0x01;
}
}
}
これらの変更は、ポート3の最下位のピンをときどきトグルさせることで、LEDの内の3個は同時に点滅させ、1個はある程度独立して点滅させることを意図したものです。ディレイループのインターバルはそれほど重要ではありませんが、結果が観測可能になるだけの十分な遅延を実現する必要があります。このアプリケーションを実行すると(デバッグの開始後、実行)、すぐに元のアプリケーションと何も変わっていないことに気づくはずです。すべてのLEDが1秒間隔で同時にオン/オフの点滅を行います。アプリケーションを一時停止して、ローカル変数ウォッチウィンドウを開いてください(View Locals)。プログラムが停止した位置がメインアプリケーションのwhileループ内であれば(その可能性が非常に高くなります)、ウィンドウに変数xが表示されます(図11 )。
先ほどのコードには、誤りが含まれていたことを思い出してください。ここでStep Overボタンを数回クリックすると、実行がループの比較(x<100000)から「if」文の条件テスト(x ==100000)に進み、インクリメント(x++)が行われ、ローカル変数ウィンドウ内でxの値が変化する様子を見ることができます。PO3 = PO3 ^ 0x01という行にブレークポイントを設定して、Goをクリックしてください。どういうわけか、実行が停止しません。明らかに、プログラムが「if」文に到達していません。再度Breakをクリックして、変数xの値を99999に書き換えて、Step Overを数回クリックしてください。「for」ループが終了した後、x=0の部分が実行されるために、またループが開始することに気づくはずです。恐らく問題は明白でしょう。「未満なら」というテストを行っているため、「for」ループ内でxの値が絶対に100000に到達しないのです。プログラムを停止して、「if」文の比較値を99999に書き換えてください。プログラムを再コンパイルして、デバッガを起動して、Goをクリックしてください。今度はLED DS1だけ他と揃わずに点滅する形でLEDが点滅します。
図11. Locals変数ウィンドウ
補足情報
このアプリケーションノートで使用したすべてのファイルのソースコードは、EVキットに付属するCD-ROMに収録されています。また、マキシムのウェブサイトからダウンロード することもできます。このファイルには、プロジェクトファイル、すべてのヘッダとインクルードファイル、およびマシンローダブルな.HEX出力ファイルも含まれてます。.HEXファイルは、ダウンロードで入手可能なマキシムのMTK (Microcontroller Tool Kit)パッケージなどのターミナルエミュレータを使用して、直接(すなわち、コンパイラツールセットを使用せずに)ダウンロード して実行することが可能です。
ソフトウェアライブラリ、アプリケーションノート、およびリファレンス設計がマキシムから入手可能です。利用可能なライブラリとツールに関する最新の情報が必要な場合、またはこのアプリケーションノートに関して何か問題がある場合は、マキシムのウェブサイト でマイクロコントローラの部分を探すか、または までお問い合わせください(英語のみの対応となります)。
IAR Embedded WorkbenchはIAR Systems ABの登録商標です。
IARはIAR Systems ABの商標です。
MAXQはMaxim Integrated Products, Inc.の登録商標です。
SPIはMotorola, Inc.の商標です。
関連製品
APP 4314: Feb 23, 2009
自動アップデート
お客様が関心のある分野でアプリケーションノートが新規に掲載された際に自動通知Eメールの受信を希望する場合は、EE-Mail™にご登録ください。
フィードバックをお寄せください。 内容に満足されましたか、あるいは満足されていませんか?もっと良いページにできると思いますか?あるいは、単なるコメントでも結構です。フィードバックをお待ちしています。 —マキシムはお客様からいただく訂正、提案を元に改善していきます。
このページを評価し、フィードバックを送信する。