2024年11月2日土曜日

STM32とST7735 LCD(2) うごかしたのでsource code

動かし方が判らんかったST7735のLCDが動いたのでsource codeをupします.
↓こんな感じで文字列を表示できます.
縦16行x横21文字
カラー制御はしてなくて白黒表示だけ
やりたかったのは此処までなのでこれでおしまい

以下はST7735というLCD chipの使い方についてのポエム.

結線
ST7735には様々な結線方式がありますが、この基板は4線シリアルになってます.
LEDはLED電源らしくて3.3Vにするらしいのでそうしました.
SCK,MOSI,A0,NSSはSTM32のoutput portへ接続します.
RESETは10kΩでpullup.
VCCは5V.

ピン制御の電気的作法
NSS(CS)はlow activeです.コマンド毎にいちいち上げ下げするのではなく、1画面分を描く毎に上げ下げするぐらいの緩い制御でいいです.

MOSI(DATA)+SCKでシリアル通信します.MOSI→CLK上げ→CLK下げ で1bit転送です.

A0が曲者です.
HIGHでdata、LOWでcommandを意味します.
つまりこういうことです.
 1)ST7735へコマンドを送るとき LOW
 2)ST7735のGRAMへ書くとき  HIGH
 3)ST7735のコマンドオペランドを送る時 HIGH
ヒラ的には3が戸惑いMAXでした.3もコマンドの一部ですよね.なのにコマンドオペランドはdata扱いなんです.

SPIは使わずに、GPIO叩きで実装しました.

制御コマンド
BYTE単位で送ります.
コマンドformatはこんなのがあります.もっと長いのもあります.
 コマンドのみ (1BYTE)
 コマンド+オペランド (2BYTE)
 コマンド+オペランド+オペランド (3BYTE)
 コマンド+オペランド+オペランド+オペランド (4BYTE)
 コマンド+オペランド+オペランド+オペランド+オペランド (5BYTE)

コマンドはこのpdfの104page辺りにあります.

GRAMへ書くのもコマンドでやります.

pixel format
12bit/16bit/18bitからコマンドで選べます.とりあえず16bitで運用しているわたくし.
16bitへのRGBの格納は、こうなっています.
 R[15:11]
 G[10:5]
 B[4:0]

初期化
こんなことをやって事なきを得ています.
void LCD_init(void){
  LCD_NSS_assert();  CS=LOW
  LCD_COMsend_1byte(ST7735_SWRESET); リセット
  HAL_Delay(50);
  LCD_COMsend_1byte(ST7735_SLPOUT); スリープから脱出
  HAL_Delay(255);
  LCD_COMsend_2byte(ST7735_COLMOD,5);  16bit pixel mode
  HAL_Delay(10);
  LCD_COMsend_2byte(ST7735_MADCTL,0b11000000); 画面方向
  LCD_COMsend_1byte(ST7735_NORON); 非partial
  HAL_Delay(10);
  LCD_COMsend_1byte(ST7735_DISPON); 表示オン
  HAL_Delay(255);
  LCD_NSS_deassert();  CS=HIGH
}

pixelを打つには
XY座標を指定するコマンド →GRAM転送コマンド の順でやります.
GRAM転送コマンドのオペランドがpixelデータです.2BYTEで1pixel.
GRAM転送コマンドオペランドは連続して送って良いので連続した任意個のpixelを一括setできます.その際のXY座標は自動インクリメントされます.↓こんなかんじに

1キャラクタを描画する手順
まず、GRAMの矩形エリアを描画対象として指定します.
この例では、(50,60)~(55,67)の6x8bitエリアを描画対象とします.
 LCD_COMsend_5byte(ST7735_CASET, 0, 50, 0, 55);
 LCD_COMsend_5byte(ST7735_RASET, 0, 60, 0, 67);
次にGRAMへ6x8bit fontを描画します.上記エリアにpixel dataを流し込んでやります.
 LCD_COMmode();  A0=0
 LCD_send_byte(ST7735_RAMWR); GRAM転送コマンド
 LCD_DATAmode(); A0=1
 for(i=0; i<6x8; i++){
  pixel転送16bit
 }
6x8bit fontなのでpixel転送を48回やります.
1つのpixel dataは16bitでRGBです.
したがって、6x8bit fontを描画するために送信するBYTE数は、5+5+1+48x2=107BYTES とかなり多いです.RGBですからね.

ーーーー
概念的には以上です.
コマンドはたくさんあってとても全部はわかりません.

sourceをupしておきます.
 コマンドヘッダファイル  LCD.h
 LCD制御関数 LCD.c

bugってたら素直に死んでください.責任はとらぬ.


かしこ






12 件のコメント:

  1. >SPIは使わずに、GPIO叩きで実装しました
    なんか、最近のプログラミングの傾向を見てると、こんな感じで、
    ・シリアルなんだけど、ハード使わずに、「ソフトシリアル」にしてる実装
    が、多い気がしますね。(なんか、「先祖返り」してる気がする)
    ※その昔は、
    ・「ハードウエアのSIO(勿論「CPU内蔵」とかじゃ無いので、外付け別チップ)」
    が「結構値段が高い」ので、「スピードをあまり気にしない用途」は、こういう、
    ・ソフトシリアル
    でやってましたね。で、今は、
    ・送るコマンドがややこしくて、SIO の制御がめんどい
    とか、
    ・GPIO にしておけば、「使用端子の変更が楽」(上手く作れば、「別種類のCPUでも動く」「汎用性が上がる」)
    ・イマドキは、CPU Speed が、「数百MHz」なんて、「あたりまえ体操(笑)」なので、「スピードを気にせずに書ける」
    とか言う理由で、「ソフトシリアル」が多用されてる気がします。
    ※クロックも、「数MHz」くらいまでなら、「どんな書き方」しても多分OK。
    なんか、恐ろしい時代だな。。。。

    返信削除
    返信
    1. SPIを使うならDMAと組み合わせたいものですが、DMAってバースト転送には向くけど、制御が複雑になると細切れになっちゃってDMAの意味が薄くなっちゃって
      そんなら融通利くport叩きでいいか、みたいな

      とくにADCがSPIといいつつ面倒な仕様が多いのにはfuckなのだなぁ

      削除
    2. >SPIを使うならDMAと組み合わせたいもの
      ここまで「CPUの性能」が上がってくると、やはり、
      ・マルチタスク/マルチスレッド
      を、使わないと、「見通しが良いプログラム」は、書けなくなって来ますね・・・・
      ※私なら、「SPI 通信部分だけ」別タスクにして「常時裏で動かして」おいて、
      必要な時だけ、「パラメータセットして、後は放置プレイ」みたいな書き方するだろうな・・・・
      (ふつーのOS(Windows とか Linux とか)は、基本こういうやり方になってます。そういう意味では、もうこのレベルだと、
      ・組込みLinunx
      とかを、登場させるレベルかも知れません・・・・)
      ※多分、「汎用メモリ」が使えるようになってるというのは、「そういうこと」なんだと思います。SPI メモリって、「メチャクチャ遅い」ので、Linux とか動かすには辛そうだし。(それでやってる人も居ますが・・・・)

      削除
    3. なんかもう、
      ・Raspberry Pi (Linux が動く方。Zero 以上)でいいよ。。。。
      って感じです。

      削除
    4. ※いつも思うのですが、「Linux が動くRaspberry Pi」を、
      ・Linux 以外
      で、動かしてる人、見たこと無いんだよなー
      ※Linux は、なんだかんだ言って、「リアルタイム性能」に、不安は残る。
      自分で「ソースレベル」で、全部理解してるわけじゃ無いし。
      まぁ、「プレーンなプログラムを動かすこと」は「やって出来ないこと」は、無い筈ですが、あんまりそういう開発環境って見たこと無いな。
      (GPIO部分が、若干(権利の関係で)「BlackBox」になってるらしいので、ちょっと厳しいかもですが。)

      削除
    5. STM32のhighendは2core/600MHzとかですが、今後1.5GHzになるとは思えず、マルチコア化してゆくんでしょう

      削除
    6. そもそも、Raspberry Pi の、「SOC」は、
      ・Broadcom の BCMなんとか
      という奴で、実は、
      ・仕様書非公開(NDA が結ばれている?一般公開はされてない?)
      ので、イロイロと「BlackBox」になってます。(完全な回路図は、非公開だったような。)
      ※部分的には、公開されてるらしいが、私は直接見たこと無いです。
      → なんか、検索したら出て来た。以前は「仕様非公開」って聞いたんだけどな。
      グラフィックアクセラレータとかあるから、その辺の仕様は「非公開」なのかも知れないです・・・・

      削除
    7. スマホ向けSOCの派生みたいなもんでしょと思ってるあれ
      なんでbroadcomなんだろとは当初から思ってます

      削除
  2. 読者 文字は1ドットずつ書くのか
    天才プログラマーだ 尊敬

    返信削除
    返信
    1. わざわざdot絵です
      しかも1dotが16bitという無駄

      削除
  3. 若かりし頃、始めて平坂氏の家に遊びに行って時に確か6809だったかと思うのですが、ユニバーサル基板に配線てんこ盛りのボードがあってモニターかテレビにつながっていて、ちゃんと文字が出ていてスゲーと思ったの思い出しました。
    おぼろげな記憶ではグラフィックコントローラーみたいなのは載ってなかったような気がしました。当時もっと簡単な09のシリアルターミナルで動かす基板でてこずっていた自分には、こういうのをちゃんと形にして作りきってしまう人がいてなんかショック受けてました。

    返信削除