あっ、この投稿では、LPC-Link2のCMSIS-DAP化と、aitendoのLPC1114基板でLチカするまでのことを書いています。
| LPC-Link2と、aitendoのLPC1114基板(やっすい!) |
これで、家にあるARM基板(LPC2388の載ったインターフェースの基板とか)もさわれるようになるんでしょうかね…
とりあえず、aitendoのLPC1114ボードを買って来ました。書き込みコネクタは8ピン2.54mmピッチなので、どうにかこうにかしないといけないのですが、まあ何とかなるでしょう…
とりあえず、Keilの統合開発環境μVision4と、MDK-ARMを入れて、LPC-Link2を認識してくれるかやってみました。
KeilでLPC-Link2を使うには、LPC-Link2をCMSIS-DAPというデバッガとして認識させないといけません。その為には、LPC-Link2に搭載されているLPC4370のプログラムを書き換えないとダメです。方法に関してはNXPさんのHPに詳しく解説が書かれています。
この方法でやってみたら、ちゃんと認識されました。1つ困った点は、図8ではJP1を解放してUSBを繋ぐと、自動的にStep1が赤になると書かれていますが、私が実行した時にはここは緑のままでした。ちょっとビビったのですが、Step2のボタンをポチったらちゃんとStep3の書き換え成功のテロップが出ました…(真似する人は自己責任でお願い、壊れても知らん)
| Step1が緑のまま進む様子 |
以下、μVision4で認識してる様子です。ターゲットは繋いでないのでなしです。
| デバッガの設定画面([Flash]→[Configure Flash Tools]) |
| LPC-Link2がCMSIS-DAPとして認識されています。CoreSight(ARMのデバッグ用のIPコア)が、SWDで繋がってるのも見えます。 |
μVision4では、新規プロジェクトは[Project]->[New μVision Project]を選択し、ダイアログに従ってプロジェクトの保存場所を選んだら、CPUを選択して終了です。
| CPUの選択画面 |
流石にデータシートとかと睨めっこして、レジスタを1つ1つ叩いていくのも馬鹿らしいので、CMSISライブラリを使うことにします。インクルードしたり追加するべきファイルはここら辺にも書いてありますが、
・core_cm0.h
・LPC11xx.h
・gpio.h(これがないとLPC_GPIO->とかがエラーになる?)
と、
・core_cm0.c
・system_LPC11xx.c
・startup_LPC11xx.s(空プロジェクトでも、追加しますか?ってダイアログが出る)
・gpio.c
です。他にmain.cppを追加し、そのなかにエントリーポイントであるmain()を書きます。
とりあえずLチカコードを書きます。
#include "LPC11xx.h"
#include "gpio.h"
//Blink LED(PIO2_0)
#ifdef __cplusplus
extern "C" {
#endif
void SysTick_Handler(void);
#ifdef __cplusplus
}
#endif
//wait for 500ms
void SysTick_Handler(void){
static unsigned int counter;
//LPC_GPIO2->MASKED_ACCESS[(1 << 0)] = 0;
//interrupt function
if(counter++ > 500){
//toggle LED port
LPC_GPIO2->MASKED_ACCESS[(1 << 0)] = ~(LPC_GPIO2->MASKED_ACCESS[(1 << 0)]);
counter = 0;
}
}
void portInit(){
//set port function(reference : UM10398(datasheet written in Japanese) p.56
//[2:0] : FUNC function PIO(default) -> 000
// function DTR(Active Low) -> 001
//[4:3] : MODE pullup -> 10(default)
//[5] : HYS
//[31:6] :
//LPC_IOCON->PIO2_0 = (1 << 4);
//set direction(care about JTAG/SWD port...)
LPC_GPIO2->DIR |= (1 << 0);
//set output high
LPC_GPIO2->DATA |= (1 << 0);
}
int main(){
portInit();
if(SysTick_Config(SystemCoreClock / 1000)) { //1ms?
//Handling error.
LPC_GPIO2->MASKED_ACCESS[(1 << 0)] = (0 << 0);
while(1);
}
//dummy loop
volatile int i = 0;
while(1){
i++;
}
return 0;
}
コードの解説です。1)ポートの設定は、
・IOCONレジスタでポートの機能、プルアップorプルダウンなどの選択
・DIRレジスタで方向の選択
・DATAレジスタで出力の値の選択
です。データシートに書いてあります(最新版ではないと但し書きがありますが、日本語データシートもLPC1114にはあります)。
例の如くレジスタにorなどで値を書き換えていきますが、どうやら"あるbitだけを書き換える"ということが出来るらしく、MASKED_ACCESSがそれになります。この解説は以下のページが詳しいです。
JugglerYou日記 :: LPCマイコンを使ってみる(IO編 その2) http://blog.livedoor.jp/juggleryou/archives/5796273.html
最初はPIO1_0を使おうと思ってたんですが、ちょっと特殊らしく?当たり障りの無い方を選びました。
2)SysTick_Config()でタイマーを設定し開始します。設定値はSystemCoreClock / 100だとエラーが出た気もしますゆえ、/ 1000にして1msごとに割り込みを発生させます。
唯一つまったのが、SysTick_Handler()が呼ばれなかったことで、どうやらcppで書くとextern "C"の記述が必要ならしいです。以下のページに詳しい解説が書かれています。
マイコン風雲録: ARM: Cortex-M3 割込みハンドラと weakシンボルと C++ http://avr.paslog.jp/article/1587312.html
C++編(言語解説) 第38章 C言語との連携 http://www.geocities.jp/ky_webid/cpp/language/038.html
3)デバッグについてですが、LPC-Link2は1.27mmピッチのコネクタしか無いと思ってましたが、端っこのLPCXpresso向けのピンも普通に使えるんですね。回路図を見ると、うえから
1 VIO_3V3ZZ2 TMS/SWDIO
3 TCK/SWCLK
4 TDO/SWO
5 TDI
6 nRESET
7 EXT_POW
8 GND
9 ISP_CTR_OD
になっています。SWDインターフェースで書き込みたい場合、SWDIOとSWCLK、nRESET、VCC(3.3V)、GNDを接続すれば大丈夫みたいです。
| 書き込み/デバッグの風景、ワイヤ5本だから楽といえば楽。aitendo基板のLEDは電源のインジゲータ。 |
| デバッグ時のIDEのスクリーンショット。無償IDE+約2000円のデバッガでこれ。 |
ちなみに、秋月で1.27mm1列40ピンのピンヘッダ買ったんですけど、幅があるので1.27mmピッチで2つ並べる(2*5とか)ことが出来ないんですね…マルツに売ってるこっちを買うべきみたいです、切るの難しそうだけど。あと1.27mm2*5のケーブルは、秋月に売ってたんですね…意外とこれレアだと思ってた
//関係ない話ですけど、変わったデバイスとして、電子ペーパー触ってみたいですね。こういうやつです。でも結構お値段高いので手が出せませんね…
BADGEr – EReader badge and shield « adafruit industries blog http://www.adafruit.com/blog/2013/07/22/badger-ereader-badge-and-shield/
//KeilでSTM8Sもいけるんじゃないかと思ってたんですが、ST-Linkは認識されたけれど、肝心のデバイスで選べなかったです。残念。
LPC2388はデバイスで選べるので、JTAG配線すれば大丈夫だと思われる