あっ、この投稿では、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配線すれば大丈夫だと思われる