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の単純なトグリングしてみました。

ヤダ超早い…♥

100MHz動作のLPC1768(mbed等)を想定した場合はこんな感じ。

波形汚いのはご容赦を。

以下は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の時)。

↑実際の波形です。波形汚いのは(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)参照

↑期待値通りですね。波形汚いのは(ry



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

ノーウエイトの超高速のGPIOでブンまわしてもOLEDは付いてきました!


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

Go to top of page