フォト
2018年11月
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30  
無料ブログはココログ

ARM

2018年11月15日 (木)

豊四季Tiny BASIC for Arduino STM32で日本語フォント利用対応中(2)

前回からの修正、全角文字列を表示できるコマンドを追加しました。

表示している様子

01

プログラム

02

10 'OLED日本語表示デモ
20 @(0)=8,10,12,14,16,20,24
30 S="吾輩は猫である。名前はまだ無い。どこで生れたかとんと見当がつかぬ。"
40 L=LEN(S)
50 FOR J=0 TO 6
60 SETKANJI @(J):CLS 1:KANJI 0,0,STR$(S):WAIT 500
70 NEXT J
80 GOTO 50

KANJIコマンドで指定した座標に文字列を描画します。
  KANJI x,y,"文字列"
  KANJI x,y,STR$(文字列を格納した変数)

SETKANJIコマンドは、フォントサイズ等の設定を行います。

これで、簡単に全角文字列を描画出来るようになりました。
前回と同じことやってますが、プログラムがかなり短く出来ます。

OLED版では、CONSOLEコマンドにてプログラム編集画面をシリアルターミナルに
切り替えることが出来ます。
この場合でも、OLEDディスプレイへのグラフィック描画を行うことが出来ます。

2018年11月 7日 (水)

豊四季Tiny BASIC for Arduino STM32で日本語フォント利用対応中

先日作成した「Arduino用SJIS漢字フォントライブラリ SDカード版」を
豊四季Tiny BASIC for Arduino STM32に組み込んで日本語表示対応を試みています。

(現時点の修正案は下記のリンク先にまとめています。
  ttbasic_arduino_stm32のプロジェクトのissues#58にまとめています^^)

日本語表示が出来れば、簡単なアドベンチャーゲームが作成出来ると思います。


日本語表示表示の雰囲気は次のような感じです。

OLED版の表示デモ


プログラムソース

10 'OLED日本語表示デモ
20 @(0)=8,10,12,14,16,20,24
30 S="吾輩は猫である。名前はまだ無い。どこで生れたかとんと見当がつかぬ。"
40 L=LEN(S)
50 FOR J=0 TO 6
60 Z=@(J):X0=0:X=X0:Y=0
70 CLS 1
80 FOR I=1 TO L
90 R=KFONT(MEM,ASC(S,I),Z)
100 BITMAP X,Y,MEM,0,Z,Z,1
110 IF (X+Z*2+1)>(GW-1) X=0:Y=Y+Z ELSE X=X+Z+1
120 IF Y+Z>GH-1 I=L
130 NEXT I
140 WAIT 500
150 NEXT J
160 GOTO 160

プログラムはKFONT関数で1文字ずつフォントデータを取得して表示しています。
フォントをSDカードから逐次参照して表示しているため、表示は遅いです。

表示専用のKANJIコマンドを追加予定です。
これを使えばもう少しプログラムが短くなり、表示も早くなると思います。

OLEDの他に、NTSC画面、TFT画面にも表示出来ます。


NTSCビデオ出力画面での表示デモ

プログラムソース

5 CONSOLE 0
10 CLS
20 S="日本語表示にほんご"
30 L=LEN(S):X0=0:X=X0:Y=30:@(0)=8,10,12,14,16,20,24
35 FOR J=0 TO 6
40 FOR I=1 TO L
50 R=KFONT(MEM,ASC(S,I),@(J))
60 BITMAP X,Y,MEM,0,@(J)/R,@(J),1
70 X=X+@(J)/R+0
80 NEXT I
90 X=X0:Y=Y+@(J)+10
100 NEXT J
110 GOTO 110

プログラムの日本語入力は、NTSC、OLED、TFT画面では入力出来ないため、
シリアル接続したTeraTermにて行います。

01


TFT版ではカラー表示に対応しています。

Dscn8965

2018年10月11日 (木)

Beginning STM32という電子書籍を楽天で購入したのですが..

("楽天kobo糞過ぎ"というお話です^^)

少し前に、「Beginning STM32 Developing with FreeRTOS, libopencm3 and GCC」という
書籍を見つけ、出版元から直接、PDF版を買わずに楽天からkobo版を買ったところ大失敗でした。

出版元の販売ページ
apress Beginning STM32 Developing with FreeRTOS, libopencm3 and GCC

  https://www.apress.com/la/book/9781484236239

02

Windows上で「Rakuten Kobo Desktop」を使って閲覧しているのですが、
PDFみたいな感覚での利用が全くできません(当然ですが)。

書籍記載のサンプルソースをエディターにコピーしたり、図(ピンレイアウト図)を印刷したり等
一切できません。これは技術書・リファレンスマニュアルとして使うにはちょっと辛い。
コピペしてグーグル翻訳が出来ないのも辛い。
kobo糞過ぎる。

スクリーンショットを取り、利用すればと思いやってみると、

表示内容が真っ黒になり画像化出来ません。

01

引用の手段として出来るのは、ディスプレイに映った内容をデジカメで撮影するくらいです。

Dscn8911

こんな面倒なことをするくらいなら、
新たにapress サイトからPDF版を買った方を購入した方がましですね。

技術書で一切の引用禁止は無茶苦茶使いにくいです。

楽天 kobo版の技術書買わない方が良さそうです。

楽天ポイントを使って割引購入したのですが、大失敗でした。

購入レビューにkoboの不満を書いたらいつの間にか、非公開にされていたので、
先ほど書き直しました。また非公開にされるかもしれません。

今回は勉強代として、apress サイトからPDF版を買いなおすかなぁ..
書籍自体は、BluePillボードをターゲットとした内容で良い感じなのですが..

2018年9月26日 (水)

豊四季Tiny BASIC for Arduino STM32 での単音演奏

豊四季Tiny BASIC for Arduino STM32 のV0.86で追加した、
PLAYコマンドで「ハレ晴レユカイ」を演奏してみました。

Dscn8878

演奏の様子


MML文で使用ているデータは「主体性の無いページ」さん公開が公開しているものを利用しました。
・主体性の無いページ(http://astr.me.land.to/
    MML(http://astr.me.land.to/tool/mabi/)
     ハレ晴レユカイ!(http://astr.me.land.to/tool/mabi/mml/hareyukai.htm)


この曲はアニメ 「涼宮ハルヒの憂鬱」のエンディング曲です。
勝手に使わせて頂き申し訳ないので、宣伝を入れておきます。
(バナーをクリックすると、各サイトにジャンプします)

Banner_sp_haruhi

Fanclub

Banner_kyoani_haruhi

Banner_kyoani_haruhimov

MML文はマビノギMMLに対応しています(ただし同時に1音しか出せません)。
MML文中の頭に"?"を付けると音を出す都度MML文を表示するようにしました。

01


豊四季Tiny BASIC for Arduino STM32では、NTSC、OLED、TFT等色々とサポートしていますが、
今回は最小構成+圧電スピーカーのシリアルコンソール画面の構成を使っています。

Serialconsole

MML文の音の大きさ指定のV(ボリューム)命令は、PWMのパルス幅の大きさで簡易的に対応しました。
引数の0~15のうち、0~5くらいは強弱が聞いて分かるのですが、
6~15は違いが判りません。まあ、おまけ機能的なものということで勘弁して下さい。


ちなみに、V0.86では、シリアルコンソール画面上で全角文字(シフトJIS)に対応しました。

02

2018年9月17日 (月)

豊四季Tiny BASIC for Arduino STM32 を更新しました

豊四季Tiny BASIC for Arduino STM32 をV0.86に更新しました。

注意:豊四季Tiny BASICのオリジナル版開発は私ではなく、鈴木氏です
オリジナル版 https://github.com/vintagechips/ttbasic_arduino
私は、オリジナル版からSTM32対応と機能拡張をしています。

V0.86の主な追加機能
・音楽演奏機能:PLAYコマンドの追加(MMLはマビノギMMLの文法をまねています)
・シリアルコンソール画面での全角文字対応(シフトJIS)
・TFT画面でのテキスト表示速度の改善(描画速度2倍、スクロール速度10倍)

V0.86からはプロジェクト管理サイトを
・Tamakichi/ttbasic_arduino_stm32
  https://github.com/Tamakichi/ttbasic_arduino_stm32

に変更しました。

01
マニュアル類は整備中です。AsciiDocを使ってリニューアル中です。
定数・コマンド関連のリファレンスマニュアル
https://tamakichi.github.io/ttbasic_arduino_stm32/manual.html

豊四季Tiny BASIC for Arduino STM32 コンパイル環境の構築
https://tamakichi.github.io/ttbasic_arduino_stm32/install.html


今回の修正ですが、
TFT(ILI9341)のフォント描画処理において、LI9341のウィンドウ機能とSTM32の
DMA転送の組合わせ技の効果が絶大で、いい感じに高速化出来ました。
DMA転送処理はオーバーヘッドが大きく、一回当たりのデータ送信量が少ないと、
効果で出ません。

通常、16ビットカラーで1文字(横6x縦8ドットx2バイト =  96バイト)を描画するにおいて、
1ライン目、2ライン目 ... 8ライン目とTFTへの転送アドレスは離散しており、
12バイト単位で8回発生します。オーバーヘッドの大きい、DMA転送において
これは効率が悪いです。

ところが、ウィンドウ機能を使って横6x縦8ドットの領域をウィンドウとして指定すると、
このウィンドウ内のドットは連続したシーケンシャルなデータ(連続したアドレス)とし
扱うことができます。

96バイトバイトを1回のDMA転送で行うことができます。
オーバヘッドが大きい処理が1回で済みます。
これは効果絶大でした。

また、TFT画面のスクロール処理や画面全体の再描画も
ウィンドウ機能を使うことで、DMA転送の一回当たりのデータ送信量を増やし、
DMA転送の回数を減らすことでオーバヘッドの大きい処理回数を減らすことで、
スクロール処理は10倍程度早くなりました。

このテクニックは、DMAを使わなくてもSPIのAPI呼び出し回数の削減にもなるので、
Arduino Unoでの高速化が期待できそうです。

2018年8月25日 (土)

中華製ST-LINKをBluePillボード専用に改造

使い勝手が悪いなぁと思っていた、この中華製ST-LINK、

Dscn8739


「そうだ、Blue Pillボード専用に加工しよう」


とのアイデアが浮かび、やってみました。

このピンヘッダ上にユニバーサル基板を乗せて変換し、左側にメスピンソケットを
取り付けて、Blue Pillボードを直結出来るようしたら便利かもというアイデアです。

01_3


当初、上記パーツをメスピンヘッダで脱着出来るように考えていたのですが、
高さがあり、直接はんだ付けすることにしました。

中略

取りあえず、完成です。
(製作に夢中になり、実物基板の写真を取り忘れてしまいました^^; )

Dscn8741

ショート防止に熱収縮チューブ、布テープを装着しました。
こんな感じで、直結出来ます。

Dscn8742

パソコンに接続し、STM32 ST-LINK Utilityにて問題なく接続出来ました。

Dscn8743

接続した様子

02

これは、結構便利で良さそうです。
ジャンパワイヤの接続は意外と面倒でしたが、ちょっと楽になりました。

2018年8月20日 (月)

Arduino STM32のUSB HIDインタフェースの新しいブートローダー (2)

記事「Arduino STM32のUSB HIDインタフェースの新しいブートローダー」を書いた時点では
Arduino IDEのメニューにてHIDブートローダ経由書き込み指定が出来なかったのですが、
先日の更新後のArduino STM32パッケージをインストールして確認したところ、
メニューに組み込まれていました。

そこで、実際にHID経由でのスケッチ書き込みを試してみました。

09_2


試してみたボード
  ・Blue Pillボード(写真 左)
  ・Bkack Pillボード(写真 中)
  ・RobotDym Blue Pill互換ボード(写真 右)

  Dscn8723

まずはHID用のブートローダを書き込む必要があります。
HID用ブートローダは、本来は下記のサイトが公式サイトになるのですが、
rogerclarkmelbourne/STM32_HID_Bootloader
まだ、Blue Pill用のものしか置いていないようです。若干古い可能性があります。

当面は、オリジナル版開発者の下記のサイトから入手した方が良さそうです。
https://github.com/Serasidis/STM32_HID_Bootloader

ダウンロードして解凍します。
HIDブートローダは、
  STM32_HID_Bootloader\bootloader_F1\bootloader_only_binaries\の中のファイルを利用します。

  ・Blue Pillボード、RobotDym Blue Pill互換ボード
    hid_generic_pc13.bin を利用
  ・Bkack Pillボード
    hid_generic_pb12.bin を利用

ST-Linkを使ってHIDブートローダを書き込みます。

  Dscn8724

ツールは、ST-LINK Utilityを使いました。   

  14

  HIDブートローダのファイルをロードして書き込みます。
  15


  書き込み後、パソコンにUSB経由で接続します。 
  この時、ボードマイコン(ここではBlue Pill)のBOOT1を1に設定してから、
  パソコンに接続します。  LEDが激しく点滅します。
  (この手順が分からす、なかなか書込み出来ませんでた。試行錯誤のため、
    手順としては間違っている可能性があります。)


  Dscn8725

  つなげると、パソコン(Windows 10)でSTM32F HID Bootlooader が認識されました。
  10

デバイスを調べてみると、次のような感じで登録されています。

11

試しに、Lチカスケッチを書き込んでみます。

17

問題無く書き込めました。
マイコンボードのBOOT1を0側にして、リセットボタンを押します。
これで、書き込んだスケッチが実行されます。

再度スケッチを書き込むには、 マイコンボードのUSB接続を抜き、
BOOT1を1にして、パソコンに接続します。
なぜか、USBの接続を一旦抜いてからでないとダメでした。
このあたりは、ちょっと面倒です。
もしたら、手順として間違っている可能性があるため、もう少し試してみます。

HIDブートローダのメリットとしては、
ブートローダが8Kバイトから4Kバイトに小さくなり、利用出来るフラッシュメモリの領域が
4kバイト増えた点と、ドライバーのインストールが不要な点です。

手順(もし、今回のやり方が正しいとすれば)的には、HIDブートローダ経由は、
BOOTピンの設定変更とボートの抜き差しがちょっと面倒です。

USBはCDC(シリアル通信)としても使うので、
HIDブートローダを有効にするために、BOOT1の設定が必要みたいです。

現時点では、HIDブートローダの書込みはWindowsしか対応していないようです。

関連記事
Arduino STM32のUSB HIDインタフェースの新しいブートローダー

2018年8月19日 (日)

TV出力ライブラリ更新を豊四季Tiny BASIC for Arduino STM32に適用する

先日、修正したArduino STM32用のTV出力ライブラリ
豊四季Tiny BASIC for Arduino STM32に適用し、コマンドにてNTSC信号の
横位置と縦位置を補正出来るようにしました。

以前入手した3.5インチのTFT LCDモジュール(下記の製品)を使った場合、 
  Podofo 3.5" TFT LCD Display RGB LCD Display Module Kit
  01

デフォルトでは、表示画像の上部が欠けてしまい、どうすることも出来ませんでした。

Dscn8698

Dscn8701

修正ライブラリを組み込み、コマンドにて補正出来るようにしました。
  コマンド
    CONFIG 0,垂直同期補正,横位置補正, 縦位置補正


補正後の画面

Dscn8705

補正した値は、SAVECONFIG コマンドにて内部フラッシュメモリに保存することで
再起動しても状態を保ちます。

補正の様子

ついでに、以前試したブラウン管テレビでの補正も試してみました。

補正前は、左側が欠けてしまっていました。

Dscn8709

補正して、ちょうどよいポジションで表示出来るようになりました。

Dscn8716

ブラウン管テレビでの表示は、次のような感じです。
試したのは、パナソニック 2001年製造の14インチのテレビです。


文字等の表示は、綺麗とは言えませんが、実用的レベルです。
思っていたよりも、まともに表示出来ています。
久しぶりにブラウン管テレビで映像を見ましたが、これはこれで良いですね。

この更新分は、もう少しテストを行ってから公開したいと思います。

2018年7月14日 (土)

Arduino用漢字フォントライブラリ SPI フラッシュメモリ版の更新

先日の「Arduino用漢字フォントライブラリ SDカード版のSdfat対応」繋がりで、
「Arduino用漢字フォントライブラリ SPI フラッシュメモリ版」を更新しました。
ベースとなっている「Arduino用 SPI接続フラッシュメモリW25Q64ライブラリ」も更新しました。

 

更新ライブラリ
    ・Arduino用漢字フォントライブラリ SPI フラッシュメモリ版
      https://github.com/Tamakichi/Arduino_exfonts

      修正点
          - SPIバスの共有対応
          - Arduino STM32環境での複数のSPIポート利用に対応
          - SPIクロック速度の任意設定対応

    ・Arduino用 SPI接続フラッシュメモリW25Q64ライブラリ
      https://github.com/Tamakichi/Arduino-W25Q64    
          - SPIバスの共有対応
          - Arduino STM32環境での複数のSPIポート利用に対応
          - SPIクロック速度の任意設定対応

    上記2つのライブラリはArduino(Atmega328)、Arduino STM32で利用可能です。

早速、先日の「吾輩は猫である」の漢字フォントを
SDカードからSPI接続フラッシュメモリ(W25Q64)に置き換えてみました。

置き換後の様子

 

スクロールが発生しない文字サイズでは、SDカード版よりもかなり早くなっています。
(表示速度の違いについては、追って追記します^^; )

今回の動作チェックでは、BluePillボードの代わりにRobotDyn製の互換ボードを利用しました。

Dscn8422

BluePillボード(右)と比べるとRobotDyn製互換ボードは、幅が狭いので、
ブレッドボードを有効活用出来ます。

SPIバスの共有動作チェックする際、BluePillボードでは片側が1列しか確保出来ないため、
仕方なく置き換えました。

Dscn8421

RobotDyn製互換ボードは、BluePillボードよりも品質が良く、
ブートローダ付きの製品もあります。
ただし、お値段がBluePillボードよりもちょっと高いです。
(単品購入だと、送料込みでBluePillボードの3倍!!)

STM32F103C8T6, STM32 bootloader compatible for Arduino IDE or STM firmware,
ARM Cortex-M3 Minimum System Development Board

02

送料がかかるので、RobotDyn製の他のパーツとセットで購入が良いと思います。

 

2018年7月 9日 (月)

次はSTM32ボードを積極的に使ていきたい(26) グラフィック液晶(7)

フォント描画処理の改善

SPI接続のグラフィック液晶モジュール(コントローラー ILI9341)利用の調査を継続中です。

Dscn8386

利用しているAdafruit_ILI9341_STMライブラリのフォント表示、ビットマップ表示の
描画処理の遅さが気になり何とかならないかと試行錯誤してみました。

特に横向きに利用した場合、ハードウェア的にスクロール機能が無いため、
表示内容を上にスクロールするには、全画面再表示をする必要があり、
描画速度が遅いのは致命的です。

遅さの原因を調べるためライブラリのソースを見ると、
文字表示、ビットマップ表示は1点毎にdrawPixel()関数で描画しているようです。
これはかなり効率の悪い処理です。1点毎にグラフィック液晶モジュールに
コマンドとデータの送信を行っています。

そこで処理を前回の画像表示で高速化に貢献したDMAを利用する方式を適用してみました。
なるべくコマンド送信回数を減らす作戦です。


実装する画面構成

  ・グラフィック画面解像度 320x240ドット
  ・文字表示 53x30文字
  ・フォントサイズ 6x8ドット(半角256文字、自作IchigoJam互換コード採用フォント )

動作テストとしては、画面いっぱいに文字を表示し(53x30文字)、その表示処理時間の
改善を図ります。

この処理が高速化されれば、スクロール表示処理も当然改善されます。
実際に、改善を施したビフォー&アフターは次のような感じです。
前半が改善前、後半が改善後です。


かなり改善出来た雰囲気が伝わると思います。
数値的には、53x30文字表示全表示に かかる時間は、

  改善前 808.099 ms
  改善後 35.149 ms
と大幅に処理速度が改善出来ました。
方式的には、1ライン(320ドット)用のバッファを用意し、1ライン毎にDMA転送を行いまいた。
1280バイト(320ドットx16ビットx2)ほどバッファ用のメモリを消費しますが、効果は絶大です。

さて、理論的に最大何処まで改善可能なのか見積もってみると、
今回のSPIの転送速度はクロックが36MHzなので、データ送信能力は
    36,000,000ビット/秒 
です。

一方、グラフィック画面の1画面のデータは、
    320x240x16ビット= 1,228,800 ビット
です。

1画面の更新に必要とする時間は、
   1,228,800 ビット ÷   36,000,000ビット/秒   = 0.034133333 秒 = 34.13 ms

理論的な最大パフォーマンスに近い値が出せていることが分かります。


検証用スケッチ
//
// BluePill(Arduino STM32) グラフィック液晶(ILI9341) フォント表示改善デモ
// 2018/07/09 by たま吉さん

#include <Adafruit_GFX_AS.h>      // Core graphics library
#include <Adafruit_ILI9341_STM.h> // Hardware-specific library
#include <font6x8tt.h>            // 6x8ドットフォント

// TFT制御用ピン
#define TFT_CS  PA0
#define TFT_RST PA1
#define TFT_DC  PA2

// TFT制御用
Adafruit_ILI9341_STM tft = Adafruit_ILI9341_STM(TFT_CS, TFT_DC, TFT_RST);

// フォント管理用
uint8_t* fontTop;
#define CH_W     6            // フォント横サイズ
#define CH_H     8            // フォント縦サイズ

// スクリーン管理用
#define SC_W     53           // キャラクタスクリーン横サイズ
#define SC_H     30           // キャラクタスクリーン縦サイズ
#define SCSIZE   (SC_W*SC_H)  // スクリーンサイズ
uint8_t screen[SCSIZE];       // スクリーンバッファ

// 指定座標に文字の表示
void drawChar(uint16_t x, uint16_t y, uint8_t c) {
  uint8_t* ptr = &fontTop[c*8];       // フォントデータ先頭アドレス
  for (uint8_t i=0; i <8; i++) {
    for (uint8_t j=0; j < 6; j++) {
      if ( (*ptr) & (0x80>>j)) {
        tft.drawPixel(x+j,y+i,ILI9341_WHITE);
      } else {
        tft.drawPixel(x+j,y+i,ILI9341_BLACK);
      }
    }
    ptr++;
  }
}

// 従来の画面更新表示
void sc_updateOld() {
  for (uint16_t y=0; y < SC_H; y++) {
    for (uint16_t x=0; x < SC_W; x++) {
      uint8_t c = screen[SC_W*y+x];  // キャラクタの取得
      drawChar(x*CH_W, y*CH_H, c);
    }
  }
}

// 指定位置の文字の更新表示
void sc_updateChar(uint16_t x, uint16_t y) {
  uint8_t c    = screen[SC_W*y+x];    // キャラクタの取得
  uint8_t* ptr = &fontTop[c*8];       // フォントデータ先頭アドレス
  tft.setAddrWindow(x*CH_W, y*CH_H, x*CH_W+CH_W-1, y*CH_H+CH_H-1);
  for (uint8_t i=0; i <8; i++) {
    for (uint8_t j=0; j < 6; j++) {
      if ( (*ptr) & (0x80>>j)) {
        tft.pushColor(ILI9341_WHITE);
        //SPI.write(ILI9341_WHITE);
      } else {
        tft.pushColor(ILI9341_BLACK);
        //SPI.write(ILI9341_BLACK);
      }
    }
    ptr++;
  }
}


// 指定行をTFT画面に反映
// 引数
//  ln:行番号(0~29)
void sc_updateLine(uint16_t ln) {
  uint8_t c;
  uint8_t dt;
  uint16_t buf[2][SC_W*CH_W];
  uint16_t index;

  for (uint16_t i=0; i < CH_H; i++) { // 1文字高さ分ループ
    index = 0;
    for (uint16_t clm = 0; clm < SC_W; clm++) { // 横文字数分ループ
      c  = screen[SC_W*ln+clm]; // キャラクタの取得
      dt = fontTop[c*8+i];      // 文字内i行データの取得
      for (uint16_t j=0; j < 6; j++) {
        if ( dt & (0x80>>j)) {
          buf[i&1][index] = ILI9341_WHITE;
        } else {
          buf[i&1][index] = ILI9341_BLACK;
        }
        index++;
      }
    }
    tft.pushColors(buf[i&1], SC_W*CH_W, 1);
  }
}

void setup() {
  Serial.begin(115200);
  delay(1000);

  // TFTの初期化
  tft.begin();
  tft.setRotation(3);
  tft.fillScreen(ILI9341_BLACK);
  fontTop = (uint8_t*)font6x8tt+3;
  memset(screen, 0, SCSIZE);

  // ダミーデータのセット
  for (uint16_t i=0; i < SCSIZE; i++)
    screen[i] = i % 256;
}

void loop() {
  Serial.print("Hit any key to start");
  while(Serial.read() <0);
  Serial.println();

  // 従来方式
  uint32_t t1, t2;
  uint8_t c = 0;
  for (uint16_t i=0; i < 15; i++) {
    t1 = micros();
    sc_updateOld();
    t2 = micros();
    Serial.print("update Time =");
    Serial.println(t2-t1,DEC);
    memmove(&screen[0], &screen[SC_W*1], SCSIZE-SC_W);
    for(uint8_t j=0;j < SC_W; j++)
      screen[SC_W*29+j] = c++;
    //delay(10);
  }

  delay(3000);

  // 高速対応
  for (uint16_t i=0; i < 300; i++) {
    t1 = micros();
    tft.setAddrWindow(0, 0, SC_W*CH_W-1, 29*CH_H+CH_H-1);
    for (uint8_t y=0; y < 30; y++) {
       sc_updateLine(y);
    }    
    t2 = micros();
    Serial.print("update Time =");
    Serial.println(t2-t1,DEC);
    memmove(&screen[0], &screen[SC_W*1], SCSIZE-SC_W);
    for(uint8_t j=0;j < SC_W; j++)
      screen[SC_W*29+j] = c++;
    //delay(10);
  }
}

pushColors()関数の利用が今回の改善の立役者です。
内部的にDMA転送をバックグランドで行ってくれます。
setAddrWindow()、pushColors()、pushColor()関数は使い方によってかなり描画処理の
改善を行うことが出来ます。

いずれは、豊四季Tiny BASIC for Arduino STM32にこのテキスト描画を採用しようと思います。

より以前の記事一覧