フォト
2025年4月
    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      
無料ブログはココログ

« 次はSTM32ボードを積極的に使ていきたい(8) - PWMで単音演奏 | トップページ | 次はSTM32ボードを積極的に使ていきたい(10) - 128kB利用可能? »

2017年3月14日 (火)

次はSTM32ボードを積極的に使ていきたい(9) - TVout互換ライブラリ

TVoutライブラリと互換性の高いライブラリ

「次はSTM32ボードを積極的に使ていきたい(7)」で作成した、
「Arduino STM32用 NTSCビデオ出力ラブラリ」の上位層のライブラリを作成しました。

Arduino用のTVoutライブラリと互換性の高いAPIを実装しました。
TVoutのソースの一部を利用しています。

02

GitHubの方に登録&公開しました。
  ・Arduino STM32 TVoutライブラリ - TTVout
   https://github.com/Tamakichi/ArduinoSTM32_TVout


サンプルスケッチの動作の様子です
(だだし、古いバージョンのものです)




回路図(接続図)は次のような感じとなります。

01
使い方等については、公開ページの説明を参照願います。


ライブラリの実装において、ARM cortex-M3のビットバンド機能を使ってみました。
メモリ上のデータをビット単位で効率よく操作する仕組みです。

具体的には、1ビット毎にワードアドレス(32ビット)を割り付け、
そのアドレスへの読み書きでビット単位の読み書きが出来る仕組みです。

ビット操作を行うドット描画部分関数sp()に適用しました。
このsp()は、直線や円等の描画にも利用しています。
以下がその関数の実装部分です。

//
// ドット描画
// 引数
//  x:横座標
//  y:縦座標
//  c:色 0:黒 1:白 それ以外:反転
//
static void inline sp(uint16_t x, uint16_t y, uint8_t c) {
#if BITBAND==1
  if (c==1)
    _adr[_width*y+ (x&0xf8) +7 -(x&7)] = 1;
  else if (c==0)
    _adr[_width*y+ (x&0xf8) +7 -(x&7)] = 0;
  else 
    _adr[_width*y+ (x&0xf8) +7 -(x&7)] ^= 1;
#else
  if (c==1)
    _screen[(x/8) + (y*_hres)] |= 0x80 >> (x&7);
  else if (c==0)
    _screen[(x/8) + (y*_hres)] &= ~0x80 >> (x&7);
  else
    _screen[(x/8) + (y*_hres)] ^= 0x80 >> (x&7);
#endif
}

BITBANDが1の場合、ビットバンドを利用してフレームバッファのビットを操作します。
BITBANDが1でない場合は、ビットバンドを利用しません。かわりにビットシフト等にて
ビット操作を行います。

上記ソースでビットバンドを利用している場合と利用していない場合で
フレームバッファのアドレスが_adr、_screenといった具合に異なるのは、ビットバンドでの
アドレス操作が32バイト単位のため、型変換とアドレス変換を行っているためです。
    _adr = (volatile uint32_t*)(BB_SRAM_BASE + ((uint32_t)_screen - BB_SRAM_REF) * 32);

画面224x216ドットを1点ずつ点を描画して全面白色処理を行った場合、
ビットバンド機能を利用すると、全体で10%くらいパフォーマンスが向上しました。
10%は大きいです。

このビットバンド機能、ARMでもCortex-M3、Cortex-M4しかないようです。

« 次はSTM32ボードを積極的に使ていきたい(8) - PWMで単音演奏 | トップページ | 次はSTM32ボードを積極的に使ていきたい(10) - 128kB利用可能? »

arduino」カテゴリの記事

表示器制御関連」カテゴリの記事

ARM」カテゴリの記事

STM32」カテゴリの記事

コメント

いつもありがたく参考にさせていただいております。
SC_448x216の設定の際に、draw_line及び、draw_rectが正常に表示されません。
TTV.out.hの
_adr[_width*y+ (x&0xf8) +7 -(x&7)] = 1;を
_adr[_width*y+ (x&0x1f8) +7 -(x&7)] = 1;に変更すると、ズレは多少ありますが
表示されるようになります。フレームバッファの横の幅が変わるためだと、
思われますがお手数ですが確認の方よろしくお願いいたします。

ご指摘ありがとうございます。
不具合確認しました。

ビットバンドのアドレス計算で、横448ドットを考慮していなかったです。
仮対応として、
TTV.out.hの
#define BITBAND 1 // ビットバンド機能利用
の設定に0を指定してビットバンドの利用を無効で、取りあえず
描画出来ると思います。

検証中、draw_rect、draw_circleで反転塗りつぶし処理が
正しく動作しなくなってしまった不具合を見つけました。
これを含め、修正対応を行うます。対応に少々お時間下さい。
ご迷惑、お掛けしました。

コメントを書く

(ウェブ上には掲載しません)

トラックバック

« 次はSTM32ボードを積極的に使ていきたい(8) - PWMで単音演奏 | トップページ | 次はSTM32ボードを積極的に使ていきたい(10) - 128kB利用可能? »