LPC1343はぢめました(+Versaloonを使ってSWD接続でOpenOCDデバッグ)

8/16日にARMマイコン パーフェクト学習基板なるものが販売されました。基板に搭載されて
いるマイコンはLPCXPresso(LPC1343版)とおなじLPC1343です。
奇しくもLPC1114・LPC1769の開発環境のとっ掛りが出来たので死蔵していたLPC1343も
はぢめて見よう か な とおもって手を出してみました。決して便乗ではありませんよぅ!


肝心かなめのスタートアップはLPC13xx系がCortex-M3なのを利用してSTM32で使用した
ものとほぼ同一のものとしました。NxP系ARMマイコン特有のCRP&CheckSumValidation
ももちろんスタートアップに盛り込みます。
また、LPC1343にはUSBインターフェースがあるのでXPresso基板にUSBminiBコネクタ
から+5Vを引けるようにし、とある1.5A/3.3Vレギュレータでシステム全体に3.3Vを給電する
ようにしました。SMDだしセラコン使えるし秋月で買うとかなり安値で買えるし性能高いし
で良いLDOだと思います。

un
え?秋月のはセラコン対応じゃないのになんでデータシート無視して使ってるのですって!?
…さぁ?…誰かがなにかを間違えてるんじゃないかなぁ…?ほら型番とか…
un
↑ねむいさんは画像掲示板の住人なので画像で語る


それはさておき基板単体で給電できるようになったので、次はフラッシュの書き込み&デバッグ
に挑戦です。使用するのはSWD接続なVersaloonです。LPC-Link?何スかそれ?

LPC1114ではまだeraseしかできずあまり期待してませんでしたが、LPC17xx系と同じように
OpenOCDからSWD接続でフラッシュ書き込みを行うことができました…これは…ありがたい…!
あとはLPC11xx系のフラッシュ書き込みに対応してくれたら…!


20120229追:
JTAGが無いって言われた時にぃ、じゃぁLPC1114でもSWD接続のOpenOCDつかって
フラッシュ書き込み&デバッグできるじゃない!って確かそういった気もするんですよね


un
先ずはいつものLED点滅からです。邪魔なうんちゃらLinkはもちろんぶった切ってます。

un
SWD接続なVersaloonでOpenOCD+Insightによるデバッグ中の画面です。ペリフェラルは
LPC1114の時と同じくaudin氏のOpenOCD用IOViewをLPC1343向けに移植しました。
もうLPCXPressoIDEなぞ要りません。

というわけでLPC13xx系の開発環境の足場作りも整いました。これをとっかかりにして
色々広げていきたいと思います。




ところで、LPC11xx,LPC13xxはフラッシュ容量が32kBしかないので外部に何か容量の超
でかいROMをぶら下げる必要があります。いま私が記録媒体としてターゲットにしているのは、
少し前になひたふ氏も触れられていたSSTの大容量SPI-ROM(手持ちはSST25VF016B)です。
これは現在一般PC用のBIOSROMとして超大量に流通し、使用されているのでmouserや
digikeyでも安価に購入できるようになっています。

こいつに自在にデータを書き込めるようになったらPCのBIOSアップデートに失敗しても
もうなにも怖くはありません!!(←実はこれが主目的)
兎にも角にもSPI-ROMを使いこなすのだッ!

un
↑接写できるコンデジに買い替えたのでむやみに接写
 …駄目だ上手く撮れない


追:おきを改修しました。
  それに伴いSTM32F107VCT6,LPC2388用のTFT表示プログラムも最新に更新しています。

LPC1769を使う3

mbedやLPCxpresso,Arduino等の圧倒的な利点というのは、ベースとなるハードウエアが
共通かつ基礎的なアプリケーションフレームワークがおぜん立てされているという点で、
他の方が作られたすぐれたアプリケーションを手元で誰でも簡単にすぐに追実験できる
ということに尽きると思います。
1年前はまだまだ秘境だったARMの分野の裾野を一気に広げたというのは賞賛すべきこ
とだと思いました!一方、情(に)弱(い)ねむいさんは足しか出ていないような中華LPC1769
基板をひたすらどうにかしていた…。




un
超高速なIOを利用して件のSPI接続可能でQVGAな液晶をSoft-SPIで…。SPIバス接続して
さらにDMAでぶん投げられたらもっと早くなるでしょう。


さて、先日NxPのサイトにてLPC17xx用のペリフェラルライブラリがアップデートされました。
こちらを元にテスト段階のLPC1769の環境も固めていきたいとおもいます。
このライブラリはGCC向けにはCodeSourceryG++の使用を前提としてスタートアップ・
リンカスクリプト・etcが用意されています。LPC13xx,LPC11xx系はほぼ自前でこさえま
したがせっかくなのでLPC17xx系は豊富なメモリ資産があるのでCodeSourcery提供のも
のを積極的に使用していきます。

で、注意しなければならないのがそのスタートアップ等なのですが、そっくりそのまま使う
人はべつにどうということはないのですが私のようにCRPの記述入れてたりChecksum
Valitdateを直打ちな人は不整合が起こらないようにしなければなりません。あと見落と
しづらいのがdataやbss領いk(iruka氏が分かりやすく解説してくれてますので省略)



んでもってaudin氏に尋ねられた浮動小数点演算でハングする件をちょっと試してみました。
冒頭のカワウソ画像に見える浮動小数点演算の結果はsprintf(書式は%f)+FONTXドライバの
文字表示で表示していますが、NxPのLPC17xxのライブラリのGCC向けで使用されているCodeSourceryのスタートアップ(CodeSourcery Common Start-up Code Sequence (CS3))
を使うとsyscalls.cというかsbrkを作り込まなくてもふつーにsprintf関数とか使えました。
しらんかった…。ということで私の環境では浮動小数点演算OKでした。

そろそろベースも固まってきたことですからLPC1769用のとっかかりプログラムも更新するつ
もりです。またaudin氏がOpenOCD+Insightから利用できるIOビュー画面機能を実現する方法
を公開されていますのでこちらもありがたく使わせてもらいます!






今日はもう一件、どちらかというとこっちの方が重要な事柄なんですけどVersaloonで使用で
きるSWD接続なOpenOCDデバッグがまだ制限付きですがLPC11xx,LPC13xx系でようやく
出来るようになっています!
LPC1114,LPC1343はJTAG接続というものが存在せず、SWDでしか接続できません。
OpenOCDが0.5.0に上がるのを機にSWD接続も対応になるとのことですがそれに先立って公開
されていたパッチを適用してデバッグを試してみました。

↓フェイクじゃなくてマジもんです。SWD接続に使用したデバイスはもちろんVersaloon。
un

キャプ画像見てもらったら分かるともいますが、audin氏のIOView機能をLPC11xx系に
適用して、ビット単位でGPIOのポートを見れるようにしています。コレめちゃくちゃ便利すね…!
もうLPC-LinkとかLPCXpressoのIDEとか必要ですらないです…これで勝つる!!1!
…と言いたいところですがデバッグは問題ないですがOpenOCDからのフラッシュメモリ操作
がまだLPC11xx系には完全対応しておらず(LPC13xx系は普通に使えること確認しました!)、
eraseしかできません。
まぁvsprogがあるので書き込みはこっち使っておいて正式対応までちょっと我慢です。

un
↑おまけ。LPC1114の基板に改造加えてEtherPodっぽくしてみました

LPC1769を使う2

※連日の猛暑で頭がたいぶ湧いてます。この段落は読み飛ばしてくだち
8月2日はぱんつの日でしたね…♥ぐふふ…♥
訓練されたとしあき君や「」ならモザイク掛けても緑と黒と肌色の配色でいなちゃんだっt
ぇっとこれは3.2インチの240x400液晶モジュール(aitendoさんのとは別の品)なんですが…
taobao経由で買ったこれは御多分にもれずユーズド品でいきなりLEDがブッ壊れてたり
タッチパネルの内部配線が断線してたりで3つ購入したたうち1つしかまともに動かんorz








さて戯言はここら辺にして、前回少し触ったLPC1769のボードの続きをやってみた
いと思います。今回は100MHz動作から120MHz動作に変更して動きを確かめてみます。

動作周波数(=CCLK)の変更はLPC2388の時と同じくPLLレジスタをいじって目的の倍数に
設定してやればよいです。LPC1768のCMSISライブラリのPLL周辺の初期化コードが値
決め打ちで書いてあって分かりずらいこっちゃないってことで少してこずりましたが
ユーザ・マニュアル片手に120MHz化できました。
LPC1769はUSBのクロック生成専用にもう一つPLLがあって、なおかつメインのPLLから
も従来通りUSBクロックが設定可能という柔軟な対応ができるようになってました。


てわけで120MHz動作にしたLPC1769でGPIOの単純なトグリングしてみました。
un
ヤダ超早い…♥

100MHz動作のLPC1768(mbed等)を想定した場合はこんな感じ。
un
波形汚いのはご容赦を。

以下はCodeSourcery G++(GCC4.4.1)のOptimize-2でコンパイルして吐かれたアセンブ
ラリストの一部抜粋です。

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
LPC_GPIO1->FIOSET = (1<<28);
3dc: f2c2 0309 movt r3, #8201 ; 0x2009      
3e0: f04f 5280 mov.w r2, #268435456 ; 0x10000000
(↑最初に必ず入る)
3e4: 619a str r2, [r3, #24]
LPC_GPIO1->FIOCLR = (1<<28);
3e6: 61da str r2, [r3, #28]
LPC_GPIO1->FIOSET = (1<<28);
3e8: 619a str r2, [r3, #24]
LPC_GPIO1->FIOCLR = (1<<28);
3ea: 61da str r2, [r3, #28]
LPC_GPIO1->FIOSET = (1<<28);
3ec: 619a str r2, [r3, #24]
LPC_GPIO1->FIOCLR = (1<<28);
3ee: 61da str r2, [r3, #28]
LPC_GPIO1->FIOSET = (1<<28);
3f0: 619a str r2, [r3, #24]
LPC_GPIO1->FIOCLR = (1<<28);
3f2: 61da str r2, [r3, #28]



〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
Cortex-M3はフラッシュアクセスがゼロ・ウエイトの場合かつロード・ストア命令が連続する場合
Rx,[Ry,#imm] は、常に1サイクルになるので(Cortex-M3マニュアル参照)、ゼロ・ウエイトで
動作が可能でなおかつGPIOがAHBバスにぶら下がっているLPC1769はGPIOのトグリング
周波数がMAX60MHzまで出るということですね。


ちなみにLPC2388の場合は同条件でARMモードでコンパイルした場合、以下のように
展開されました。もちろんLPC2388のFIOのアクセスです。
"DISPLAY_CONTROL_CLR = CTRL_WR;"の部分は
FIO4CLR1 = (1<<1);
FIO4SET1 = (1<<1);
に読み替えてください。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
DISPLAY_CONTROL_CLR = CTRL_WR;
61c0: e3e03103 mvn r3, #-1073741824 ; 0xc0000000
61c4: e2433c3f sub r3, r3, #16128 ; 0x3f00
61c8: e3a02002 mov r2, #2
61cc: e5432062 strb r2, [r3, #-98] ; 0x62
DISPLAY_CONTROL_SET = CTRL_WR;
61d0: e5432066 strb r2, [r3, #-102] ; 0x66
DISPLAY_CONTROL_CLR = CTRL_WR;
61d4: e5432062 strb r2, [r3, #-98] ; 0x62
DISPLAY_CONTROL_SET = CTRL_WR;
61d8: e5432066 strb r2, [r3, #-102] ; 0x66
DISPLAY_CONTROL_CLR = CTRL_WR;
61dc: e5432062 strb r2, [r3, #-98] ; 0x62
DISPLAY_CONTROL_SET = CTRL_WR;
61e0: e5432066 strb r2, [r3, #-102] ; 0x66
DISPLAY_CONTROL_CLR = CTRL_WR;
61e4: e5432062 strb r2, [r3, #-98] ; 0x62
DISPLAY_CONTROL_SET = CTRL_WR;
61e8: e5432066 strb r2, [r3, #-102] ; 0x66
DISPLAY_CONTROL_CLR = CTRL_WR;
61ec: e5432062 strb r2, [r3, #-98] ; 0x62
DISPLAY_CONTROL_SET = CTRL_WR;
61f0: e5432066 strb r2, [r3, #-102] ; 0x66
DISPLAY_CONTROL_CLR = CTRL_WR;
61f4: e5432062 strb r2, [r3, #-98] ; 0x62



〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
ARM7TDMI-Sの場合はstrが最小2クロックサイクルなので、ゼロ・ウエイトで動作が
可能でなおかつGPIOがAHBバスにぶら下がっているLPC2388ではトグリング周波数が
最大18MHzになります(CCLK=72MHzの時)。
un
↑実際の波形です。波形汚いのは(ry






んでもってSTM32F103BVT6の場合はこんな感じ
"DISPLAY_CONTROL_CLR = CTRL_WR;"の部分は
GPIOD->BRR = GPIO_Pin_12;
GPIOD->BSRR = GPIO_Pin_12;
に読み替えてください。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
DISPLAY_CONTROL_CLR = CTRL_WR;
800459a: f44f 5380 mov.w r3, #4096 ; 0x1000
800459e: 6163 str r3, [r4, #20]
DISPLAY_CONTROL_SET = CTRL_WR;
80045a0: 6123 str r3, [r4, #16]
DISPLAY_CONTROL_CLR = CTRL_WR;
80045a2: 6163 str r3, [r4, #20]
DISPLAY_CONTROL_SET = CTRL_WR;
80045a4: 6123 str r3, [r4, #16]
DISPLAY_CONTROL_CLR = CTRL_WR;
80045a6: 6163 str r3, [r4, #20]
DISPLAY_CONTROL_SET = CTRL_WR;
80045a8: 6123 str r3, [r4, #16]
DISPLAY_CONTROL_CLR = CTRL_WR;
80045aa: 6163 str r3, [r4, #20]
DISPLAY_CONTROL_SET = CTRL_WR;
80045ac: 6123 str r3, [r4, #16]
DISPLAY_CONTROL_CLR = CTRL_WR;
80045ae: 6163 str r3, [r4, #20]
DISPLAY_CONTROL_SET = CTRL_WR;
80045b0: 6123 str r3, [r4, #16]



〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
STM32F1xx系は72MHz動作だとフラッシュアクセスに2ウエイト掛かるのでトグリング周波数
は18MHzになります。LPC2388と同じ早さです。

STM32F1xx系は72MHz動作ではフラッシュのプリフェッチバッファが効いて分岐なしで動かした
場合はノーウエイトと等価になりGPIOもMAX36MHzでトグリングできるはずですが・・・、
STM32ではAHB->APB2(GPIOがぶら下がってるバス)にかかるSTR命令は最短2クロック
サイクル(※)となるため、MAX18MHzで頭打ちとなります。同じ理由で内蔵高速RAMから
実行してもMAX18MHzになります。
※:AMBAの仕様書(IHI0011A_AMBA_SPEC.pdf)参照
un
↑期待値通りですね。波形汚いのは(ry



GPIO上げ下げだけじゃナンなのでaitendoさんで急に人気沸騰(?)のOLEDを使用してLPC1769
内蔵フラッシュに書き込んだ画像と文字表示を。LPC1769固有のSPIモジュールの詳細は
まだ調べてないので制御はソフトSPIです。
un
ノーウエイトの超高速のGPIOでブンまわしてもOLEDは付いてきました!


さて、これからLPC1769使って何をするかですが、I2Sのデバイスも数種類手に入れているので
I2Sの学習しながらベタですがMP3プレイヤーを作るという方向性で考えています。

Go to top of page