Top > STM32F >秋月300円液晶

秋月300円液晶

 秋月300円液晶は、解像度400×96、18bit(RGB各6bit)カラーというスペックで、 液晶モジュール単体の値段が300円と非常に安価であることから、 インターネット上でも様々な人がこれを使った作品を公開しています。 現在では、なる研さん を始め多くの方が情報を公開してくださっているので、 かなり敷居が低くなりました。

自分も液晶モジュールを購入したのですが、これといったアプリケーションがなく、 いまさら感が漂っていたので、ずっと放置していました。 しかし、このまま放置しておくのもかわいそうなので、 グラフィック時計にしてあげることにしました。

すでに、多くの方が300円液晶を使って作品をつくられているので、 今回はSTM32Fの勉強をかねて粛々と300円液晶を食べることにします。 とはいえ、一応方針を決めておきます。

itemsubiteminformation
CPUCoreCortex-M3
Freq72MHz
MemoryROM64kB
RAM20kB
TimerGeneral3
Advanced1
RTC1
DMAC7ch×2
PackageLQFP48

 言うまでもありませんが、300円液晶はグラフィックコントローラを持たないので、 同期信号と共に常にピクセルデータを送りつづけなければなりません。 300円液晶をマイコンでそれなりに動かすのであれば、DMA機能は必須です。 ということで、STM32Fを使います。なるべく小さいパッケージのものを使いたかったので、 デバイスはSTM32F103C8Tにしました。STM32F103C8Tのスペックは右に示したとおりです。


コントローラの構成

 STM32F103C8T6を使ったコントローラの構成を見積もって見ます。 画面のリフレッシュレートは60Hzはちょっと厳しいかもしれないので、 30Hzを目標にします。またポートが16bit幅なのでカラーは16bitに収まるよう、 15bit(RGB各5bit)とします。

まず始めに問題点を洗っておきます。スペックに書いたとおり、 STM32F103C8T6にはRAMが20kBも搭載されていますが、これでも1画面分の 400×96×16bit = 76.8kBには届きません。 また、ROMに関しても64kBしかないので足りません。 そこで、画像は256色(パレット)のランレングス圧縮でROMに格納します。 またRAMも足らないので、1ライン分をリアルタイムでROMから展開することで対処します。 CPUの負担はなるべく減らすためにRAMからGPIOへの転送はDMACを使い、 水平・垂直同期信号及びクロックもタイマモジュールで生成します。

なる研さんのホームページを参考に、 おおよその同期信号とディスプレイ表示タイミングを決定しました。 ブランキングを含む画面幅は、きりよく512ドットとしました。

この同期信号のタイミングを基にSTM32Fのタイマモジュールの割り当てを考えます。 右の図に各種信号の生成ツリーを示します。 STM32Fのタイマモジュールは、マスタとなるタイマのイベント出力を スレーブとなるタイマのトリガとして使うことができます。 そこで、ドットクロックの生成にTIM1を用いて、そのオーバーフロー出力を 水平同期信号と垂直同期信号を生成するTIM3及びTIM2に接続します。 これにより、各種同期信号の自動生成が可能となります。 また、TIM1のオーバーフローでDMAリクエストすることで、データ転送も行います。


ハードウェア

 ここまでの話を基にグラフィック時計の回路図と基板パターンを作成します。

ソフトウェア