気分転換に、PSP液晶で遊んでみました。
型番はATM0430D5というモノで、HsyncやVsyncが不要なタイプです。こいつはディスコンになって現在は別のものが出てるみたいですね(未確認)。
バックライトの点灯にはストリナのLEDドライバを使っています。5Vを突っ込めば最大38Vまで昇圧して0mAから20mAまで32段階(33段階?)で任意の電流を設定して定電流駆動できるスグレモノです。
さすがに32ステップとかあっても人間の目には変化はわからないですし、そもそもリニアに変化させても、ということで、対数(2.2)で4段階に変化させてみました。
いい感じに輝度変化がわかると思います。
裏面はこんな感じです。
ピンアサインは変換テーブルを使うので、ある程度自由に設定できます。もっとも、8bitバスをGPIOをまたいで設定すると面倒なので、RedをGPIOB[0-7]、GreenをGPIOB[8-16]、BlueをGPIOC[0-7]、というふうにしてあります。が、Red0がGPIOB0に、といった関係ではなく、配線しやすいようにバラバラになっています。
STBee F4miniのメモリを持ってしても、480x272x3byteの保持は不可能で、8bppIndexでも不可能でした。ということで、横解像度を240pxに落としていますが、これでもかなりギリギリです。
GPIOの変換テーブルはFlashに入れて256x3バイト、カラーパレットはRAMに入れて256x3バイト、画像データはRAMに入れて240x272バイト、他にピクセルバッファが525px x 24line x 2本 x 2バイト(16bit)あります。24ライン分を確保しているのは、可能な限り大きな範囲を一括して変換するためです。2本あるのはGPIOBとGPIOCの分です。
ブロック図はこんな感じです。
RAMからGPIOに対してDMAで転送する場合、DMA2を使用する必要があるので、駆動するTIMは1か8になります。今回は1を使いました。
LEDドライバの輝度の指定にはパルス数を送りますが、タイミング要求が厳しく、遅くても100usec以内を目安にトグルを続ける必要があります。が、10パルスを送るなら2msecほどかかり、この間にDMAからの割り込みが発生するため、ソフトウェアでは転送できません。そのため、今回はパルスの生成にTIM2を使い、TIM2を特定のパルス数(&位相)で停止させるためにTIM3を使用しました。
TIM2は0分周8400カウントで駆動し、1周期100usecのパルスを作ります。
TIM3は2100分周0xFFFFカウントで駆動し、CH1に1を指定すればTIM2はLowを出すだけ、7を指定すれば1個目の立ち上がりエッジで確定、15を指定すれば2個目の立ち上がりエッジで確定、というふうに駆動できます。
輝度の指定(0で消灯、1が一番暗く、32が一番明るい)から直接CH1のパルス長にすることはできないため、ここは変換テーブルを使いました。
TIM2のスレーブモードはGatedを使用しています。
ただ、TIM3を駆動する際にTIM2のプリスケーラやカウンタをリセットする必要があり、ここはソフトウェアで実装する必要があるので、タイミングクリティカルになります。なぜか今回は問題ありませんでしたが、TIM2に対するUpdateの生成からTIM3の開始まではクリティカルに指定したほうがいいかもしれません。
DISPは基本的に触ることがないので、ソフトウェアで制御しています。
DEはピクセルデータに同期する必要があるので、ピクセルデータと一緒にパラレルデータに埋め込んでいます。
GPIOCはLSEの接続があり、STBee F4miniでは外に引き出されていません。そのため、GPIOCを16bitバスとして使うことはできません。そのため、GPIOBを16bitバスとして使用し、残りの8+1bitをGPIOCに割り当てています。
ということで、ようやく液晶の制御と相成りました。
***
とはいえ、今回は解像度を落とした静止画1枚を表示するのがやっとで、UARTから画像を受け取る、といった基本機能ですら動作しません。
実用性は皆無です。
ま、複数のGPIOで、16bitを超える幅のパラレルバスを駆動できるのがわかっただけ収穫、ということで。
前にTIMでクロック出してGPIOからデータ出したときはうまく動かなかったんだよなー。なんで今回はうまく動いたんだろうか? クロック周波数が低かったから遅延の影響が少なかったのかな?
0 件のコメント:
コメントを投稿