FreeTypeをSTM32F2に移植できた。のかもしれない。
かもしれないというのは、読み込めないフォントが多過ぎて果たして成功しているのだろうかという疑問があるからです。(Unsupported Font Formatを返されたり、描画手前でToo Few Argument Errorが発生したり><;)

FreeTypeはTrueTypeフォントやOpenTypeフォントを含め様々なフォントに対応しています。
サイズを変更して表示させたり、アンチエイリアスを掛けてくれたり、ボールド体やイタリック体として表示させたり万能です。日本語などのマルチバイトにも対応してます。
以前PCでコンパイルして調べてみたところ、メモリの消費量がSTM32F2の内蔵メモリでは足りないことがわかり、メモリ1MByteを増設して移植してみました。

FreeTypeのバージョンは2.4.5で、コンパイル後(コードサイズで最適化)のプログラムのテキスト領域は約280KB、メモリの消費量はフォントの種類や文字の大きさにもよりますが最低300KBくらい必要な気がします。

表示にはちょっと時間がかかりますがバッファに溜めてからDMAで描画したり工夫すると十分使えそうな気がします(^ω^)

デカ文字で時計やカレンダーなんかを作るといいかもしれません。

とんすけぶろぐ
みおフォント(ボールド)

とんすけぶろぐ
Opus Text

とんすけぶろぐ
HG行書体

とんすけぶろぐ
HG行書体

とんすけぶろぐ
GenevaCY

そいや昔手芸やってた。
テクノ手芸部が流行ると聞いて処女作のプルート引っ張り出して来た。
$とんすけぶろぐ
コイツにLED貼付けてクレイジーなピカピカドッグに仕立て上げればウケるかなぁ。
うーんダメだろ・・・
SDカードスロットと外付けSRAMメモリを載せて動作確認までできました。
とんすけぶろぐ

とんすけぶろぐ
裏はカオス状態\(^o^)/
ポリウレタン線の線径が太いためか、かなりゴワついちゃってます。
あとはピンヘッダに配線して、USB周りをなんとかすればほぼ完成です。
おやじに頼まれてた気圧計つくった。
おやじは気圧計を持っているのですが校正されていないアナログ気圧計だったので、校正されている絶対気圧が測れるものが欲しかったらしく、ぼくに製作を依頼してきました。
Digi-Keyにちょうど部品を注文する予定があったのでついでに気圧が測れる半導体センサも注文しました。
freescaleという会社のMPL115A2という気圧センサなのですが、なんと1個199円でした。
スペックをみたところ校正値が内部にプリセットしてあり500~1150hPaの検出範囲を持ち精度は±10hPaでI2Cインタフェースのデジタル出力。
問題なのはLGAパッケージとサイズが小さくて製作するのが難しい点です。本当はリフローはんだとかすべきなのでしょうが、裏面のパッドになんとかポリウレタン線を半田づけして信号線を引き出すことができました。

製作して実際に気圧を表示させたところ973ヘクトパスカルという数値が出ました。
973ヘクトパスカルというと台風並みの低気圧ですが、ぼくの家は高地に位置しているため(といっても標高250m程度)1気圧地点と比べると妥当だそうです。


とんすけぶろぐ
スイッチを押すとLCDの右側に気圧(hPa)、左には高度(メートル)を表示します。
10秒経ったらスリープに入り、またスイッチを押すと復帰して上を繰り返します。
ホームセンターに売ってたカードホルダーのケースに組込み裏から白スプレーで塗装しました。

とんすけぶろぐ
右から気圧センサMPL115A2、ATtiny85、P-MOSFETと下は3.3V DC/DCコンバータ(HT7733A)です。
気圧センサはI2Cインターフェースで、LGAパッケージでしたが底面のパッドからポリウレタン線で引き出せました。
LCDはストロベリーリナックスで購入したI2Cタイプの小型液晶です。
同一バス上の2つのデバイスをATtiny85からソフトウェアI2Cで制御してます。

とんすけぶろぐ
単4電池1本駆動としました。
スリープ時はFETで気圧センサとLCDを電気的にオフする仕組みにしているのでとても消費電力が少ないです。
通常動作時約12mA、スリープ状態で約15μAとなりました。(ほとんどがDC/DCコンバータ HT7733Aの消費電流です。スリープ状態だと電池入れっぱなしで5年程度持つ計算)

気圧データの求め方
気圧データを読み出すのはさほど難しくありませんが、校正値から計算して正しく出力するのは少し面倒です。
hPaの読みは以下の式で求まります。

Pcomp = ao + (b1 + c11*Padc + c12*Tadc) * Padc + (b2 + c22*Tadc) * Tadc
decPcomp = {(65/1023) * Pcomp + 50} * 10

読み出したデータは下のようになりました。

アドレス0123456789abcdef
データ534080803ACDBADDBB79332800000000

ここからデータシートと照らし合わせて手計算で最終的な気圧データを求めてみます。

Padc(気圧データ アドレス0, 1)
有効ビット数は10ビット。
下位にはゼロがパディングされているので0x5340を6ビット右シフトした値。(1/64倍)
よってPadc = 333

Tadc(温度データ アドレス2, 3)
Padcと同じく有効ビット数は10ビット。
下位にはゼロがパディングされているので0x8080を6ビット右シフトした値。(1/64倍)
よってTadc = 514

a0(係数 アドレス4, 5)
有効ビット数は16。
符号ビット1 整数ビット12 小数ビット3

0x3ACD = 0011 1010 1100 1101

a0 = 11101011001.101 = 1881.625


b1(係数 アドレス6, 7)
有効ビット数は16。
符号ビット1 整数ビット2 小数ビット13

0xBADD = 1011 1010 1101 1101

符号ビットが1なので負数。
2の補数表記なので10進数になおすと、(ビットを反転させて1加える)
1011 1010 1101 1101

0100 0101 0010 0011

b1 = -10.0010100100011 = -2.16052246

b2(係数 アドレス8, 9)
有効ビット数は16。
符号ビット1 整数ビット1 小数ビット14

0xBB79 = 1011 1011 0111 1001

符号ビットが1なので負数。
2の補数表記なので10進数になおすと、(ビットを反転させて1加える)
1011 1011 0111 1001

0100 0100 1000 0111

b2 = -1.00010010000111 = -1.070739746

c12(係数 アドレスa, b)
有効ビット数は14。
符号ビット1 整数ビット0 小数ビット13 小数点ゼロパッド9

0x3328 = 0000 0000 0001 1001 1001 0100 0

c12 = 0.000000000011001100101 = 0.000780582


c11(係数 アドレスc, d)
c11 = 0

c22(係数 アドレスe, f)
c22 = 0

以上のデータからPcompを計算すると、

Pcomp = 1881.625 + (-2.16052246 + 0 * 333 + 0.000780582 * 514) * 333
+ (-1.070739746 + 0 * 514) * 514 ≒ 745

ヘクトパスカル(hPa)の読みになおすと、
decPcomp = {(65/1023) * 745 + 50} * 10 = 973[hPa]

というふうに手計算で求めるのは結構大変ですね(^_^;A

プログラムはアプリケーションノート(http://strawberry-linux.com/pub/AN3785.pdf)からマイコンに組込みました。
アプリケーションノートのプログラム例では浮動小数計算を使用していないので512B SRAMのATtiny85でも十分使えました。
訂正箇所が一カ所あります。プログラムの最後のほうでシフトとキャストの仕方の順番が違ってます。

誤)
// FIXED POINT RESULT WITH ROUNDING:
siPcomp = ((S16)lt3>>13); // goes to no fractional parts since this is an ADC count.

正)
// FIXED POINT RESULT WITH ROUNDING:
siPcomp = (S16)(lt3>>13); // goes to no fractional parts since this is an ADC count.
とんすけぶろぐ

ユニバーサル基板に前回のSTM32F217ZGT6を載せた変換基板をハンダ付けし、とりあえず正常に動作するか確認するために最小限の部品をくっつけてJTAGとUSARTの信号線をコネクタまで引出しました。
早まる気持ちを抑えながら配線ミスがないか2重3重とチェックし、電源を入れてみる。
チップから白煙があがったりしてないし、触診しても熱がないようなのでとりあえず配線ミスはしてない模様。(いい加減)
JTAGケーブルを挿してOpenOCDで試してみる。
gitで入手できる最新(0.5.0)のOpenOCDはSTM32F2に対応しているようで、コンフィグファイルの中身を書換える(http://www.mail-archive.com/openocd-development@lists.berlios.de/msg16724.html)とJTAGデバッグができるそうなので早速試してみた。
P.S. 最新のOpenOCDをインストールするとSTM32F2用のコンフィグファイル(stm32f2xxx.cfg)も一緒に付属されておりました。

反応がない・・・・(^ω^;)

まあこういうモノは一発でうまくいった試しがないので慣れっこです。
原因はどこかなーと基板に穴が開くんじゃないかってくらい(ユニバーサル基板だからもう穴だらけ)凝視しながら接触不良を疑ったり、部品の値を変えてトライアンドエラー的なことを繰り返しましたが一向に反応がない。。
あーこれは完全にハマったパターンかなぁーっと途方に暮れかけながらも評価ボードの回路図を眺めているとアナログ電源のVDDAを放置していたことを思い出し、とりあえず3.3Vにつないでみる。
電源を入れてチップを触ふれると熱くなったのでビビリながらもOpenOCDで反応をみる。

反応がない・・・・(^ω^#)

やばい。。壊しちゃったかも><;と生きた心地がしない悲壮感を味わうことに。さすがに3.3V直づけはまずかったらしく、回路図にある通り手持ちのマイクロインダクタ(47μH)を挿入してみた。
結果。

反応した!!!!!(^ω^*)

おおー、やっぱり端折ったらダメな部分だったんだ。こういう失敗は今回で何度目だ(汗

$とんすけぶろぐ
↑TAPのIDは0x4ba00477と表示されてます。


さっそくtelnetでローカルホストにログインしてFLASHの内容を読んでみた。
$とんすけぶろぐ
↑フラッシュ全容量1MByteでリファレンスマニュアルのとおり12個のセクタに分かれてました。

次はちゃんとプログラムが動作するか検証すべく、STM32F2のUSARTからお決まりのHello World!を出力させることにしました。
STM32F2用のペリフェラルライブラリをSTmicroの公式サイトから入手し、ライブラリをコンパイルしました。

STM32F2xx_StdPeriph_Lib_V1.0.0
http://www.st.com/stonline/stappl/resourceSelector/app?page=resourceSelector&doctype=FIRMWARE&ClassID=1734

スタートアップコードは./CMSIS/CM3/DeviceSupport/ST/STM32F2xx/startup/gcc_ride7にあるstartup_stm32f2xx.sを使いました。
ここからsystem_stm32f2xx.cのSystemInit()関数を呼び、外部クロック25MHzをPLLで逓倍してCPUのクロック周波数120MHzで動作させているようです。

リンカスクリプトは./Project/STM32F2xx_StdPeriph_Examples/NVIC/VectorTable_Relocation/linker/RIDEのstm32f2xx_flash_offset.ldを使いました。
フラッシュメモリの0番セクタをブートローダとして使うためか、0x4000だけオフセットされて記述されているので下のようにフラッシュの先頭から配置するように修正しました。

MEMORY
{
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K
/* FLASH (rx) : ORIGIN = 0x8004000, LENGTH = 1024K-0x4000 */
FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 1024K
FLASHB1 (rx) : ORIGIN = 0x00000000, LENGTH = 0
EXTMEMB0 (rx) : ORIGIN = 0x00000000, LENGTH = 0
EXTMEMB1 (rx) : ORIGIN = 0x00000000, LENGTH = 0
EXTMEMB2 (rx) : ORIGIN = 0x00000000, LENGTH = 0
EXTMEMB3 (rx) : ORIGIN = 0x00000000, LENGTH = 0
}


これでライブラリの準備は完了。
USARTでHello World!を出力するプログラムをつくってみたけど、GPIOピンの記述等が若干変更されている箇所がありました。
たとえばGPIOをAF(オルタネートファンクション)として使う場合、マルチプレクスされたファンクションのどれを使うか最初に明示する必要があります。
例)PG14ピンをUSART6_TXとして使う場合、

GPIO_PinAFConfig(GPIOG, GPIO_PinSource14, GPIO_AF_USART6);

というように記述してPG14ピンをUSART6に接続させます。
リマップに似てますが、1ピン毎にAFを切り替えられるあたりが斬新です。

それとGPIO_InitTypeDefの構造体も少し変更されてます。
下記のようにGPIO_OType(出力タイプ)とGPIO_PuPd(プルアップ/プルダウン)が追加されています。

typedef struct
{
uint32_t GPIO_Pin;

GPIOMode_TypeDef GPIO_Mode;

GPIOSpeed_TypeDef GPIO_Speed;

GPIOOType_TypeDef GPIO_OType;

GPIOPuPd_TypeDef GPIO_PuPd;

}GPIO_InitTypeDef;

$とんすけぶろぐ
いくつかの修正を経てようやくHello World!が表示できました(^ω^)

これでSTM32F2の開発環境が一応整いました。いろいろと堪能できそうです。
まだボードは半分も完成してないけど楽しみ(´^ω^`)