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プレイヤーを作るという方向性で
考えています。
-
免責・連絡先は↑のリンクを
↓SNSもやってます↓
powered by まめわざ- ARM/STM32 (116)
- OpenOCD (27)
- ARM/NxP (34)
- ARM/Cypress (5)
- ARM/Others (3)
- ARM/Raspi (1)
- AVR (13)
- FPGA (4)
- GPS/GNSS (19)
- MISC (81)
- STM8 (2)
- Wirelessなアレ (16)
- おきぱ (1)
- ブラウザベンチマーク (28)
- 日本の自然歩道 (25)
- STM32U0はぢめました
⇒ ねむい (08/07) - STM32U0はぢめました
⇒ ひかわ (07/28) - STM32H5を使ってみる3 -待ち受ける初見殺しの罠たち-
⇒ ねむい (05/17) - STM32H5を使ってみる3 -待ち受ける初見殺しの罠たち-
⇒ どじょりん (05/16) - STM32H5を使ってみる3 -待ち受ける初見殺しの罠たち-
⇒ どじょりん (05/16) - いろいろ試す61(と今年の反省会)
⇒ ねむい (01/02) - いろいろ試す61(と今年の反省会)
⇒ ひかわ (01/02) - いろいろ試す61(と今年の反省会)
⇒ ひかわ (01/01) - STM32H5を使ってみる3 -待ち受ける初見殺しの罠たち-
⇒ ねむい (12/31) - STM32H5を使ってみる3 -待ち受ける初見殺しの罠たち-
⇒ ひかわ (12/31)
- October 2024 (1)
- September 2024 (1)
- August 2024 (1)
- July 2024 (1)
- June 2024 (1)
- May 2024 (1)
- April 2024 (1)
- March 2024 (1)
- February 2024 (2)
- January 2024 (1)
- December 2023 (4)
- November 2023 (2)
- October 2023 (2)
- September 2023 (1)
- August 2023 (2)
- July 2023 (1)
- June 2023 (2)
- May 2023 (3)
- April 2023 (1)
- March 2023 (1)
- February 2023 (1)
- January 2023 (1)
- December 2022 (2)
- November 2022 (1)
- October 2022 (1)
- September 2022 (1)
- August 2022 (1)
- July 2022 (1)
- June 2022 (1)
- May 2022 (1)
- April 2022 (1)
- March 2022 (1)
- February 2022 (1)
- January 2022 (1)
- December 2021 (2)
- November 2021 (2)
- October 2021 (1)
- September 2021 (1)
- August 2021 (1)
- July 2021 (1)
- June 2021 (1)
- May 2021 (1)
- April 2021 (1)
- March 2021 (1)
- February 2021 (1)
- January 2021 (1)
- December 2020 (3)
- November 2020 (1)
- October 2020 (1)
- September 2020 (1)
- August 2020 (1)
- July 2020 (1)
- June 2020 (2)
- May 2020 (1)
- April 2020 (1)
- March 2020 (1)
- February 2020 (1)
- January 2020 (1)
- December 2019 (3)
- November 2019 (1)
- October 2019 (1)
- September 2019 (2)
- August 2019 (1)
- July 2019 (1)
- June 2019 (1)
- May 2019 (1)
- April 2019 (1)
- March 2019 (1)
- February 2019 (1)
- January 2019 (1)
- December 2018 (3)
- November 2018 (2)
- October 2018 (1)
- September 2018 (1)
- August 2018 (1)
- July 2018 (1)
- June 2018 (1)
- May 2018 (1)
- April 2018 (2)
- March 2018 (1)
- February 2018 (1)
- January 2018 (1)
- December 2017 (2)
- November 2017 (2)
- October 2017 (1)
- September 2017 (1)
- August 2017 (1)
- July 2017 (1)
- June 2017 (1)
- May 2017 (1)
- April 2017 (1)
- March 2017 (2)
- February 2017 (2)
- January 2017 (2)
- December 2016 (7)
- November 2016 (2)
- October 2016 (2)
- September 2016 (1)
- August 2016 (1)
- July 2016 (1)
- June 2016 (1)
- May 2016 (2)
- April 2016 (1)
- March 2016 (2)
- February 2016 (1)
- January 2016 (1)
- December 2015 (3)
- November 2015 (1)
- October 2015 (3)
- September 2015 (2)
- August 2015 (2)
- July 2015 (3)
- June 2015 (3)
- May 2015 (4)
- April 2015 (2)
- March 2015 (4)
- February 2015 (1)
- January 2015 (3)
- December 2014 (3)
- November 2014 (2)
- October 2014 (1)
- September 2014 (2)
- August 2014 (2)
- July 2014 (3)
- June 2014 (2)
- May 2014 (1)
- April 2014 (1)
- March 2014 (4)
- February 2014 (4)
- January 2014 (3)
- December 2013 (5)
- November 2013 (4)
- October 2013 (3)
- September 2013 (2)
- August 2013 (2)
- July 2013 (2)
- June 2013 (3)
- May 2013 (2)
- April 2013 (2)
- March 2013 (2)
- February 2013 (2)
- January 2013 (3)
- December 2012 (4)
- November 2012 (2)
- October 2012 (2)
- September 2012 (4)
- August 2012 (1)
- July 2012 (3)
- June 2012 (2)
- May 2012 (3)
- April 2012 (3)
- March 2012 (2)
- February 2012 (3)
- January 2012 (3)
- December 2011 (5)
- November 2011 (3)
- October 2011 (2)
- September 2011 (2)
- August 2011 (2)
- July 2011 (2)
- June 2011 (2)
- May 2011 (2)
- April 2011 (2)
- March 2011 (2)
- February 2011 (2)
- January 2011 (3)
- December 2010 (7)
- November 2010 (1)
- October 2010 (1)
- September 2010 (1)
- August 2010 (3)
- July 2010 (4)
- May 2010 (1)
- April 2010 (2)
- March 2010 (2)
- February 2010 (2)
- January 2010 (3)
- December 2009 (3)
- November 2009 (8)
- October 2009 (7)
- September 2009 (5)
- August 2009 (4)
- July 2009 (6)
- June 2009 (6)
- May 2009 (14)
- January 1970 (1)
Copyright(C) B-Blog project All rights reserved.
Comments
こんばんわ audinです。
printfの件ですが
irukaさんのブログに触発されて
OpenOCD+(Eclipse,Insight)+
LPC1768環境で"sprintf"にfloatを喰わせてみたら全然だめでハマリ中です。整数なら大丈夫でした。
いろいろ試したところCooCoxの
CoDebugger(+oocdlink-s)にダメだったelfファイルを喰わせるとデバッガ上で正しく実行できました。
elfは大丈夫そうな?感じですが、よくわかっていません。orz
LPCXpresso/LPC1343上でNewlib+"sprintf"+floatは大丈夫でした。
audinさん、こんばんは。ねむいです。
私のCodeSourceryG++の環境(sprintfのfloatの出力をOLEDに吐かす)でも試して
みましたが、問題なく浮動小数点の演算結果を出力できました。
おそらくLPC1768でビルドされている際のスタートアップ・リンカスクリプト・
makefileに不整合があると思いますので差支えない範囲で詳細を教えてください。
あと現時点のOpenOCDはちょっと動作不安定ですね(RTCKで動かすともうダメダメ)。
私は安定するまで「0.5.0-dev-00466-g28ddefd」版を使用しています。
話は変わりますが、現時点でLPC17xx系のフラッシュにOpenOCDから書くと
スピードが全然出ないですね…RTCK有効にしても最大9KiB/Secくらいです。
ベリファイは600KiB/Secくらい出るのに…ぐぬぬ
VersaloonだとSWDでも書き込みで30KiB/Secオーバー出てます。
audinです。
いろいろ情報ありがとうございます。
>>makefileに不整合があると思いますので差支えない範囲で詳細を教えてください。
近日中にブログにアップしたいと思います。
OpenOCDはv0.4.0を使っています。
>>RTCK有効にしても最大9KiB/Secくらいです。
うちのFT2232Dもjtagクロック2000KHzまでアップさせて
9KiB/Secと同じくらいです。
ねむいです。おはようございます。
>9KiB/Secと同じくらいです。
2232D系でも同じということはOpenOCDから書くと、
9KiBあたりで頭打ちになってるぽいですね…
デバッガのデバッグなんてしたくない派なので改善
されるまで書き込みはVersaloonに逃げます!(あらら)
動作不安定だった理由はOpenOCDのフラッシュスクリプトを120000(120MHz)に
するべきだった部分が120000000にしてしまってたからでした…何たるイージーミス…
お騒がせしてすみません…
こんばんわ audinです。
openocd+jtagkey2+lpc2388
で約50KiB/sec出ている様でしたが
lpc1768の方はopenocd側の都合がまだある感じですね。
>>120000(120MHz)
の部分は自分も間違えそうなので
例えば
set _WRITE_CLK_MHZ 120
[expr $_WRITE_CLK_MHZ * 1000]
という感じにしようと思います。
ねむいです。こんにちは。
LPC1769に400kBにバイナリを書いて試してみましたが、
Versaloon(SWD接続)だとOpenOCDからだとWrite:26KiB/Sec出てます。
それとLPC11xx系でもaudinさんのIOViewの技出来ました。
LPC1114用のIOViewのファイルは私が作ってみますね〜
こんばんわ audinです。
毎回の役立ち情報参考になります。
>LPC1114用のIOViewのファイル
期待してます。
CMSISのニューバージョンも見てみよっと。
記憶が曖昧ですが
APBは仕様的にアクセスするとき
アドレス指定に1サイクル、
データ読み書きに1サイクルかけていたような
気がするのですが
レジスタ書き込みに2サイクルかかるのは
そのせいのような気がします
間違っていたらすみません
ねむいです。こんにちは。
AMBAの仕様書読んでもう少し細かいところ調べてみましたが、
確かにAPBのSETUP(アドレス指定)->ENABLE(データ読み書き)
のステート遷移があるので最短2クロックサイクルかかりますね・・・。
STM32F2やLPC176x系の場合はGPIOレジスタがAHB直結なので
動作周波数の半分までトグルスピードが出せるわけですね。
ぶろぐの記事に追記しておきますね。ありがとうございます。
Post a Comment