次はSTM32ボードを積極的に使ていきたい(9) - TVout互換ライブラリ
TVoutライブラリと互換性の高いライブラリ
「次はSTM32ボードを積極的に使ていきたい(7)」で作成した、
「Arduino STM32用 NTSCビデオ出力ラブラリ」の上位層のライブラリを作成しました。
Arduino用のTVoutライブラリと互換性の高いAPIを実装しました。
TVoutのソースの一部を利用しています。
https://github.com/Tamakichi/ArduinoSTM32_TVout
サンプルスケッチの動作の様子です
(だだし、古いバージョンのものです)
回路図(接続図)は次のような感じとなります。
使い方等については、公開ページの説明を参照願います。
ライブラリの実装において、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」カテゴリの記事
- Arduino IDE+Arduino STM32環境で指定と異なるgccが使われてしまう(2025.01.23)
- Zorin OSでArduino Uno互換機(CH340)が認識しない(2025.01.19)
- Arduino IDE 2.3.4でArduino STM32を利用する(2025.01.12)
- Arduino用 SKK日本語変換ライブラリの開発 その1(2024.12.28)
- NeoPixel(WS2812B)の制御 その5(2024.09.15)
「表示器制御関連」カテゴリの記事
- NeoPixel(WS2812B)の制御 その5(2024.09.15)
- Arduino用 美咲フォントライブラリを更新しました(2024.03.21)
- Raspberry Pi Pico(MicroPython)でLEDドットマトリックスを使ってみる(2024.03.14)
- Raspberry Pi Pico MicroPython用のマルチフォントライブラリ(2023.02.09)
- MicroPython(Raspberry Pi pico)で8x8ドットNeoPixcel文字表示(2023.02.08)
「ARM」カテゴリの記事
- Arduino IDE+Arduino STM32環境で指定と異なるgccが使われてしまう(2025.01.23)
- Arduino IDE 2.3.4でArduino STM32を利用する(2025.01.12)
- PocketGoで遊んでみる(1)(2020.03.24)
- Arduino用 MML文演奏ライブラリの作成 その1(2019.04.01)
- BluePillボードで4桁7セグLEDの制御(2019.03.21)
「STM32」カテゴリの記事
- Arduino IDE+Arduino STM32環境で指定と異なるgccが使われてしまう(2025.01.23)
- Arduino IDE 2.3.4でArduino STM32を利用する(2025.01.12)
- 「Arduino STM32 リファレンス 日本語版」が2万アクセス突破!(2021.03.26)
- SPI接続フラッシュメモリモジュールを入手しました(2020.05.13)
- Arduino STM32でキャラクタ液晶ディスプレイを使う(2019.06.01)
コメント
« 次はSTM32ボードを積極的に使ていきたい(8) - PWMで単音演奏 | トップページ | 次はSTM32ボードを積極的に使ていきたい(10) - 128kB利用可能? »
いつもありがたく参考にさせていただいております。
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;に変更すると、ズレは多少ありますが
表示されるようになります。フレームバッファの横の幅が変わるためだと、
思われますがお手数ですが確認の方よろしくお願いいたします。
投稿: | 2018年8月 3日 (金) 17時29分
ご指摘ありがとうございます。
不具合確認しました。
ビットバンドのアドレス計算で、横448ドットを考慮していなかったです。
仮対応として、
TTV.out.hの
#define BITBAND 1 // ビットバンド機能利用
の設定に0を指定してビットバンドの利用を無効で、取りあえず
描画出来ると思います。
検証中、draw_rect、draw_circleで反転塗りつぶし処理が
正しく動作しなくなってしまった不具合を見つけました。
これを含め、修正対応を行うます。対応に少々お時間下さい。
ご迷惑、お掛けしました。
投稿: たま吉さん(管理者) | 2018年8月 3日 (金) 22時10分