2013/08/03

[電子工作]LPC-Link2とaitendoのLPC1114Fボード

,
 試験が終わって暇だったのでARMいいよなあって思いが募ってきたので、秋月に閉店間際に駈け込んで、LPC-Link2買っちゃいました。10ピンヘッダが1.27mmピッチなので、それ用のヘッダと基板も一緒にレジに持って行きました…

 あっ、この投稿では、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の選択画面
LPC1114は、基本的なペリフェラルなどの機能を使ったプログラムが、LPC Wareにサンプルとして用意されていますので、それを参考にすることにします。
 流石にデータシートとかと睨めっこして、レジスタを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_3V3ZZ
2 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円のデバッガでこれ。
μVision4でのデバッグの仕方がいまいちわかりませんが、基本的な機能の他に、ウォッチ式への追加(これは基本?)、IOの状態をPeripherals→GPIOとかで見られること、などはとても便利です。

 ちなみに、秋月で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配線すれば大丈夫だと思われる

0 コメント to “[電子工作]LPC-Link2とaitendoのLPC1114Fボード”

コメントを投稿