FM3マイコンを使ってみる2

一応ねむいさん的にはChaN氏のFatFsといつものTFT-LCDドライバの実装までを目標と
しています。今回はその中継ぎとしてSTM32F4の時に行ったメモリ構成の決定とFM3の
機能であるMFSを使ったUARTを使った標準関数のリダイレクト、そしてOpenOCDを使っ
たデバッグ環境の強化を行いました。

FM3のシリアル通信はMFSというUART,I2C,SPIの機能を柔軟に切り替えて使用可能な
ユニットを通じて行われます。マニュアルやサンプルコードをざっと見た感じでは非常に
めどそうな設定や操作項目が多い感じでした。


●基本の"き"、UART実装
…と言いたいところでしたがIF誌の特設ページを見るとなんとChaN氏自身がFatFsとシ
リアル通信関連のプログラムをFM3移植されていたのでこれを最大限に活用させていた
だき、まずUARTの環境を拵えました。ChaN氏のUARTのルーチンとはバッファ構成が少し
違っていてXMEGAを触った時に覚えたリングバッファをパクで構成しました。

また、ChaN氏は周辺機器レジスタ定義をFujitsuが提供するCMSISのもの(mb9b610t.h)
ではなく自己生成のパブリックドメインな物を使用されていました。こちらも私の都合で
一部だけ利用させてもらい他はFujitsu製のレジスタ定義にしています。
1文字送信関数は動作したのでお次はprintf系の標準関数にリダイレクトを行いました。


●メモリ構成の決定と標準関数(newlib)のリダイレクト
もう何度も何度も言及していますが、GCC環境でARMを初めて触った人が引っかかるの
はprintf系の関数がビルドできない動作できないという点です。尤も今回のFM3マイコ
ン基板に限ってはIF誌を1章から馬鹿正直読み進めてその通りにしてしまうとLED点滅
すらできず(なんでそうなるかはよく読めばわかります)、人の話を聞かないねむいさんのよう
なタイプの人のほうがさっさと先に進めるというのは何とも言い難いところですが、これは
本やネットに書いてること鵜呑みにして自分の頭で考えないからそんなくだらない所で
嵌るんだよ
」というCQ出版の読者に対する挑戦なのでしょうか?もしそうならカンガルー先輩
を本国から再召還して編集部全員にヤキ入れ直しt済みません話逸れ過ぎました
20120522追:
カンガルー先輩がヤキ入れした結果


ぇっとprintfの話でしたっけ、GCCのビルド環境でたとえばSourceryCodeBenchでnewlib
を使うためにはいくつかの未定義の関数をユーザーが定義して紐つける(=リダイレクト)
が必要となります。細かい説明はLPC2388の時と同じです。

前回はLEDの点滅ができる程度で適当に決めていましたがnewlibを使用するにあたって
内蔵SRAMの構成をひとまず下のようにしました。

20120612変更:
内蔵RAM上のどのアドレス領域でもDMAできるのがわかったので分割は止めて、
128kByte分まるまる使う構成に変更しました。


MB9BF618Tの128kByteあるSRAMのうち0x1FFF0000から始まる64kByteはI/Dコードバスに、
0x20000000から始まる64kByte分はシステムバスに接続されているそうです。
まだ未確認ですがDMACがシステムバス経由でしかやり取りできないっぽいのでDMA用
のRAMを確保するために0x20000000から先の64kByte分はまるまるHEAP領域としました。
この構成はFatFsを積んだときにまた変わるかもしれません。

20120530追:
実験を行いましたが、どの領域でもDMAは可能でした。
また、同じくどの領域でもコード実行が可能でした



というわけでUART経由のprintf関数も無事動作。もちろんsprintfやscanf等も使用できます。
UARTに使用されるポートはボリ松拡張基板のUART入出力で使用されるMFS3_2なので、
(FRK-FM3ではCN3の33p&34p)ボリ板でも再現可能です。
ところでmankoiって何ですかって?ぐふふ…


●ioviewを使いOpenOCDからペリフェラルレジスタを参照する
Fujitsuが提供しているレジスタの定義は全てがビットフィールドの定義もなされて
いてフツーにプログラミングする際は便利です(mb9b610t.hのサイズが超でかくなっ
てはいますが)しかし、これをこのままioviewに適用するとunionの数が多すぎるのか
参照した瞬間にinsightやGDBが落ちてしまいました。
やはり地道に一つづつ定義していくしかないのかと思っていた矢先、ChaN氏謹製の
レジスタ定義があるのを思い出しこちらを活用させてもらいました!自動生成されて
いるので一部レジスタの定義が二重になっている箇所がありましたがすぐに気付いて
修正し、mb9bf61x_io_view.cの完成です!

ビット単位の参照が可能なのは現状PDORx系のレジスタのみです。私の動作検証が
進むにつれて主要な物はレジスタのビット参照可能なようにして行きます。



ということで長々とお話ししましたが前回のLED点滅プログラムに+αを加えた物
すでに更新しています。以前のプログラムを使用してprintfとかしようとした人は
リンカスクリプトがまだ適当だったので多分できなかったと思いますすみません。

また、新井氏(絵描きのaraiさんと名前が被るので混乱を招かないためにこちらの
新井さんは以後漢字記名で統一させていただきます)のSystemCoreClockUpdate()
周りの修正
も今回の更新にあたり反映させていただきました。

Comments

良く言えば至る所に(悪く言えば、ちらばって)書かれている様に、CPUバス(I,D,system), DMAC, Ethernetのバスを持っているようです。
ペリフェラルマニュアル図1-1, 図2-1、また、CHPTER1 1.バス構成や、CHPTER9の概要部分にそれとなく記載されています。なのでDMACを使用するエリアは特定の場所ではない気がしますが…。ビットバンド領域とかDMACでアクセスしてはいけない特定の領域はあるみたいですが。

jujurou様
ねむいです。こんにちは。

各所に散らばったFM3のマニュアルを精読してみましたが、
STM32F4のCCM領域みたいにHardFaultになるような事態まで
にはならずパフォーマンスの低下で済むようですね。

もうじきFatFsとLCDドライバの実装が完了するので物は
ためしでどういう結果になるか、実際にやってみます。
ついでにRAM上に関数を置いて実行できるかどうかも実験してみますね。

Post a Comment








Go to top of page