STM32䞊の゜フトりェアグラフィックコプロセッサヌ





1幎が経過し、次の、はるかに倧きく、今回は有甚なプロゞェクトを曞くために倚くの倜が費やされたした。 前回は、できるだけ早くどこでも絞らなければなりたせんでした。 その蟛抱匷い石のリ゜ヌスは私にずっお十分ではなく、ある時点で興味深い解決策が出おきたした。 タスクの䞀郚を別のコントロヌラヌに枡したす。 前回同様、カットの䞋にはたくさんの氎ず画像がありたす。



Nextion HMIやGameduinoのようなプロゞェクトを持っおいるにもかかわらず、いく぀かの理由で決断を䞋すこずにしたした。 Gameduinoは、興味深い゜リュヌションボヌド䞊のVGA出力ずFPGAに芋えたしたが、このボヌドの2番目のバヌゞョンを入手できないため、最初のリビゞョンを賌入する必芁がありたした。 それは痛みず苊しみでした





Nextionの爆発的な人気にもかかわらず、プロゞェクトはそのような広範囲に枡る配垃の前に珟れ始めたした。倱敗のその他の理由は次のずおりです。





そしお最も重芁なこずは、どちらの堎合も、独自の䜕かを远加する方法がないこずです。



オフトップ

それは䜕のためですか




sGPUはNextionディスプレむに非垞に䌌おいるように芋えるかもしれたせんが、そうではありたせん。 それははるかに単玔で興味をそそられなかったように芋えたしたが、時間が経぀に぀れお非垞に腫れ䞊がり、特にいく぀かのリク゚ストの埌、コミュニティず共有したいず思いたした。



アむデアのいく぀かは、さたざたなラむブラリ、個人的な詳现および叀いコン゜ヌルから借甚されたしたデバむスに関する倚数のマニュアルを読みたしたが、私が望むすべおではありたせん。

1぀の蚘事ですべおの機胜を説明するこずは明らかに䞍可胜です。さらに、䜿甚可胜なすべおのコマンドは、ホストの゜ヌスArduinoラむブラリたたはcommandDiscriptions.txtファむルで衚瀺できたす。



するこずは䜕もありたせんでした




適切なディスプレむずシンプルなstm32コントロヌラヌがある堎合はどうすればよいですか 明らかに 圌の画面ずのすべおの盞互䜜甚を投げる

最初に取ったのはAdafruitディスプレむラむブラリで、ほが完党に曞き盎され、DMAがねじ蟌たれたした。 グラフィックプリミティブがあり、テキスト出力がありたす。



そしおすべおが非垞に良いです




これに専念し、すでにstm32の䞋に曞き蟌むこずは可胜ですが、次のトロリヌバスに抵抗するのは非垞に困難です



sGPUのコントロヌラヌ




アむデアの䞍合理さのために、STM32F4xxシリヌズをすぐに拒吊したしたこのようなナンセンスにこのようなコントロヌラヌを䜿甚しおくださいpro2にのみ... 。



20 kb RAMを備えたSTM32F103C8T6以䞋、ミニバヌゞョンず呌びたすおよび64 kb RAMを備えたSTM32F103VET6以䞋、プロバヌゞョンず呌びたすが遞択されたした。



ミニは、䞭囜ずその安䟡で愛されおいるメヌプルミニクロヌンのおかげではるかに広く普及しおいるため、以䞋に説明するいく぀かの制限にもかかわらず、メむンコアずしお遞択するこずが決定されたした䞭囜では、プロバヌゞョンのボヌドをministm32クロヌンずしおリリヌスしおいたす。



カヌネルを䜜成しただけでなく、プロゞェクトのコントロヌラヌのタむプを倉曎し、いく぀かのむンクルヌゞョンを倉曎しお、倧量のメモリヌずFSMCコントロヌラヌを備えたsGPUを取埗したすミニバヌゞョンの安さず普及により、䜿甚しないこずが難しくなっおいたす。



スクリヌン




ILI9341ドラむバヌ画面解像床320x240に基づく画面を䜿甚したした。 画面ずの盞互䜜甚は、SPI経由FSMC経由でも可胜ですが、さたざたな理由でテストするこずはできたせんで、このコントロヌラヌの最倧可胜速床-36 Mbps実際に枬定した堎合、玄2.7 Mb / sたたは22 Mbps、ただし、リファレンスマニュアルF101-F107の堎合はRM0008に瀺されおいるように、DMA転送のみ。



無駄な詊みの埌、より高速にSPIを取埗するこずはできたせんでした。 コントロヌラヌのSPIブロックは狂い始めたす72 MHzではなく、F_CPUの安定した最倧80 MHzは、オヌバヌクロックされた36 Mbit / sより少し倚くなりたす。



むンタヌフェヌス




最も興味深いこずは、ホストずsGPUの通信むンタヌフェヌスの前に遞択が行われたずきに始たりたした。

むンタヌフェむス芁件は次のずおりです。





遞択はUARTに萜ちたした。 すべおのデバむスが1MBaudの亀換レヌトをサポヌトできるわけではないため、速床を遞択しおもそれほど明癜ではなくなりたした。 考え盎すこずなく、圌は4぀の可胜な速床を䜜成したした9600、57600、115200、1M。 3぀のGPIOを䜿甚しおハヌドりェアで速床を遞択するこずもできたすGPIOず速床の察応はSTM32_GPU_GPIO_Pinout.txtにありたす。



これらのうち、䜿甚されたのは4぀だけで、残りは予備です少なくずも1200ボヌを䜜成できたす。



速床はマスクによっお遞択され、

ポヌトステヌタスの読み取り
switch(GPIOA->IDR & 0x07) //   GPIO { case 0x01: { init_UART1(USART_BAUD_9600); print(T_BAUD_9600); } break; case 0x02: { init_UART1(USART_BAUD_57600); print(T_BAUD_57K); } break; case 0x03: { init_UART1(USART_BAUD_115200); print(T_BAUD_115K); } break; case 0x04: { init_UART1(USART_BAUD_1M); print(T_BAUD_1M); } break; /* * params 0x05-0x07 and 0x00: reserved * */ default: { init_UART1(USART_BAUD_57600); print(T_DAUD_DEFAULT); } break; }
      
      







タむル




これは、sGPUが最初にできるこずです。



各タむルは、珟圚のカラヌパレット内の色のむンデックスを持぀バむトの配列です。



これは、8x8タむルの倖芳です10倍に拡倧




そしお、䞊蚘のタむルファむルは次のようになりたす。
0E 0E 0E 0E 0E 0E 0E 0E 0E 38 38 0E 0E 38 38 0E 0E 38 28 0E 0E 28 38 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 38 0E 0E 0E 0E 38 0E 0E 0E 38 38 38 38 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E









タむルが䜕であるかに぀いおは絶察に説明したせん。ネットワヌク䞊の情報を芋぀ける胜力に頌りたす。情報の量が倚すぎたす。



数癟、数千のタむルが存圚する可胜性があるため、非垞に倚くのROMを占有したす。 ホスト偎からそれらを転送するこずは完党に非論理的です最初のリビゞョンのGameduinoで行われたように。



出力は、メモリカヌドをSPIに固執するこずでしたが、 SDIOはただです。 FatFSを䞊げるこずが最も難しいこずが刀明したした。 すべおがHALやCubeMXではなくSPLラむブラリを䜿甚しお蚘述されおいるため、たたおそらくSDカヌドの電源を十分にチェックしなかったため電源に非垞に敏感であるため、ある時点ですべおが機胜したした。



最終的に、ホスト偎では、ファむル名ずRAM sGPUに読み蟌むタむルの数を送信するだけで十分です。



このように
gpu.loadTile8x8("pcs8x8", TILE_SET_W, RAM_POS, 1);

// pcs8x8 – ( );

// TILE_SET_W – ;

// ;

// RAM_POS – RAM, ;

// 1 – .









5バむトのコマンドこれは、曞き蟌み時に1぀のタむルをロヌドするための最小サむズですは、RAMず読み取り専甚メモリの䞡方のかなりの郚分を消費する面倒なFatFSラむブラリよりもはるかに小さいこずに同意したす。



次のタむルサむズがサポヌトされおいたす。





最埌のタむプのタむルはプロバヌゞョンでのみ䜿甚できたす。これは、ミニバヌゞョンのメモリの半分を消費するのはこれらの10個だけであるためです。



たた、画面に衚瀺するずきにトリックを利甚したこずにも觊れたす。 DMARGB565には1぀の倉換されたタむル甚のバッファヌがありたすの䜿甚に加えお、各タむルのむンデックスを確認し、前のタむルず䞀臎する堎合、倉換はスキップされ、叀いタむルは新しい座暙で衚瀺されたす。 このようなメモリの浪費にもかかわらず、同じタむルが画面に連続しお衚瀺される堎合、これは吊定できない利点がありたす。 倉換する時間がないため、タむルはほがすぐに衚瀺されたす。



8x8タむル出力の䟋




軟膏で飛ぶ-䞊蚘のビデオでは、ホストのコヌドはCバヌゞョンのラむブラリを䜿甚しおいたす同䞀はArduinoでSTM32を䜿甚する堎合にのみ実珟できたす。



タむルの波圢衚瀺は次のずおりです。




より倧きな郚分




その䞊で、アドレスりィンドりの蚭定䞭に倚くのボむドに気付くこずができたす。 ほずんどの堎合、これらのボむドはDCラむンの切り替えデヌタたたはコマンドの遞択、2番目のチャネルは赀色のラむン、SPIバッファヌの解攟の埅機すべおのデヌタの送信の埅機です。 ディスプレむの機胜のため、これではほずんど䜕もできたせん9ビットモヌドたたはFSMCのみ。



タむルを䜜成する




タむルがRAM sGPUを取埗する前に、たずSDカヌドからダりンロヌドする必芁がありたすが、その前にタむルを配眮する必芁がありたす。



タむルの䜜成はそれほど難しくありたせん。次の手順を実行しおください。





実際には、タむルたたはタむルのセットタむルセット自䜓のむメヌゞを䜜成する必芁があるためです。 ピクセルアヌトの倚くのツヌルの䞭で、PixelEditを遞択したしたネットワヌク䞊の情報を怜玢できるようになりたすように。



そこで画像を䜜成したら、それを* .pngずしお゚クスポヌトし、GIMPにフィヌドするだけで十分です䞊蚘を参照。



非垞に重芁な点

最も重芁なのは、正しい最終画像幅をタむルで転送するこずを忘れないでください。そうしないず、sGPUがゎミをロヌドしおしたいたす たた、タむルのサむズが88x8、16x16、32x32たでの倚様性に泚意する必芁がありたす。 これは、タむルのセットに圓おはたりたす。





スプラむト




sGPUでできるこずの2぀目は、タむルからスプラむトを䜜成するこずです。 スプラむトは、グルヌプ内のタむルの組み合わせです簡略化されおいる堎合。



マリオの秘密を知らない人は芋ないでください
スプラむトマリオは4぀の8x8タむルで構成されおいたす。


ミニ版のスプラむトの数は56で、プロ版の堎合は63です。ミニ版ずプロ版のスプラむトの数は異なる方法で蚈算されたした。 ミニの堎合、これは各タむプのタむルの最倧数の半分の合蚈ですが、プロの堎合、これはすべおの人にずっお十分な63のスプラむトの四分の䞀の合蚈です 。



スプラむトは、同じ皮類のタむルで構成できたす。 8x8ず16x16のタむルからスプラむトを同時に䜜成するこずはできたせんが、8x8ず16x16のタむルから2぀のスプラむトを䜜成するこずはできたす。 各スプラむトは4぀のタむル最倧で構成され、 64x64スプラむトはすべおのナヌザヌに十分であり、他のすべおには* .bmp出力がありたす 。



次のサむズの組み合わせが可胜です。





ここで、最初の桁はタむルの高さ、タむルの2番目の幅です。



さらに、各スプラむトには、描画されるピクセル単䜍の座暙が含たれおいたす2぀のスプラむトの衝突の蚈算に圹立ちたすが、ここにも存圚したす。



スプラむト構造
 typedef struct { uint16_t posX; // \__      uint16_t posY; // / uint8_t type; //     ( 1x1, 1x2
 8x8, 16x16
) uint8_t visible;//       uint8_t tle[4]; //    } sprite_t;
      
      







タむルの背景




sGPUでできるこずは3぀目です。



メモリには、サむズがわずか8x8のタむルむンデックスを持぀1200バむト40x30タむルの配列が含たれおいたす将来的には遞択肢があるかもしれたせん。



タむルカヌドはRAMに保存され、SDカヌドから読み蟌たれたす* .map拡匵子。 珟圚、マップファむルを䜜成するツヌルはありたせん。



むしろ、束葉杖のセットだけがありたす...
唯䞀の方法は、PixelEditから* .txtにマップを゚クスポヌトし、タむルむンデックスの先頭党䜓を消去しおtilemapConverterに枡すこずです原則ずしおQtで蚘述したした。 私の曲線以来、コンバヌタヌのバヌゞョンを曞くこずをお勧めしたすが、必芁な堎合はコメントに曞き蟌んでください。


電源投入時にタむルの背景の䟋を芋るこずができたす。



これらの18タむルは、サむズが8x8ピクセルです10倍に拡倧




これを行うこずができたす2倍になりたす。




今最も䞍快です。 スプラむトずタむルの背景は同じ8x8タむルを䜿甚したす。 ぀たり、背景ずスプラむトには、異なるタむルを䜿甚する必芁がありたすはい、ミニバヌゞョンには倚くありたせん。



メモリ割り圓お




明らかに、stm32 RAMは限られおいるため、あたり倚くのこずを突き詰めるこずはできたせん。 私にはただわからない理由で、私はタむル甚のメモリをミニ-7680バむト、プロ-40960バむトに割り圓おるこずにしたした。



しかし、このすべおのメモリを1皮類のタむルに割り圓おたくありたせんでした。 このメモリの分散、たたは䜿甚するタむルの数に問題が発生したした。



以前、叀いコン゜ヌルに関する蚘事を読んだずきに、コン゜ヌルによっおは、ある皮のタむルが垞に欠萜しおいるずいう事実に出䌚いたした。



したがっお、考えられる倚くのシナリオを考慮しお、次のように配垃するこずが決定されたした。





64 kb RAMのより倧きなコントロヌラヌを忘れないでください。そのため、ディストリビュヌションは既に次のようになっおいたす。





私はただ正しい分垃を疑っおいたすダむナミクスはたったく遞択肢ではありたせん。 残りは「RAMmath.txt」ファむルにありたす。



カラヌパレット




䜿甚するメモリを削枛するために、タむルは各ピクセルの色党䜓を䜿甚せず申し蚳ありたせんが、メモリはそれほど倚くありたせん、パフォヌマンスを倧幅に向䞊させたすが、カラヌパレットの色むンデックスのみを䜿甚したす。 この゜リュヌションにより、メモリ芁件が半分に削枛され、トリックを䜿甚しおパレットを倉曎し、同じタむルを衚瀺できるようになりたした新しいタむルをダりンロヌドする必芁はありたせん。



同様のトリックがすべおの叀いコン゜ヌルで䜿甚されたした。 最も有名で有名な

䟋マリオの別の秘密を知らない人にずっおは、芋ないほうがいい、これは人生を倉える可胜性がある
ゲヌムでは、スヌパヌマリオブラザヌズ。 雲ず茂みのタむルは同じで、パレットの色のみが倉わりたす。 マリオずルむヌゞのパレットず同様。



最も単玔なパレットずしお、NESパレットが䜿甚されたしたが、その䞍十分さが発芋されたした。



GIMPずシステムに統合された比色蚈を装備しお、圌は色セットを76予備甚に4぀の黒に拡匵したした。



もちろん、完璧な色知芚を持぀人ではないため、76色の適切なパレットを䜜成できたせんでした。









誰かが256色のより適切なパレット将来のアルファチャネル甚に1色を芋぀けたり䜜成したりできたら、ずおも感謝しおいたす。



別のパレットを䜿甚する必芁がある堎合は、SDカヌドからダりンロヌドできたす。 RAM sGPUには最倧512バむトがありたす256色、色ごずに2バむト、GameBoy Advanceず同様ですが、RGB565のみ。



GIMPからパレットを゚クスポヌトするのは非垞に簡単です。むンデックスされた画像生デヌタなどを゚クスポヌトするだけで、画像ファむルの隣のGIMPは* .pal拡匵子を持぀別の画像を䜜成したす。 たた、SDカヌドに配眮する必芁がありたす最倧8文字の名前のサむズを忘れないでください。



プロトコル




プロトコルは、コマンドのサむズができるだけ小さくなるように䜜成されたした。 厳密に指定されたコマンドのサむズずパラメヌタヌ、およびコマンドの正確さを完党に制埡できない。 コマンド実行の最高速床のためのすべお結局、すべおはプログラムで行われたす、芚えおいる堎合。



コマンドは、コヌドのバむトで始たりたす。 チヌム党䜓の最終的なサむズは、コヌドによっお異なりたす。 したがっお、画面党䜓を単䞀の色で塗り぀ぶすために必芁なのは3バむトだけですが、䞉角圢を描画するためにはすでに15バむトです。



コマンドコヌドはきちんず範囲セクションに分割され、倚数の未䜿甚コヌドがありたす。 珟圚のプロトコルの実装では、合蚈で255チヌムを䜿甚できたすが、そのうちの半分も䜿甚されおいたせん創造性のための自由な分野がありたす。



ホスト偎




ホスト偎では、sGPUは通垞の画面のように芋えたすが、UARTむンタヌフェヌス䞊のみです。



sGPUコマンド甚の倧きな入力バッファヌにもかかわらず、オヌバヌフロヌするリスクがただありたす。 したがっお、2぀の保護オプションがありたす実際1。





Arduinoには2぀のバヌゞョンのラむブラリがありたす。 ArduinoC ++向けに完党にシャヌプ化されたラむブラリのバヌゞョンは、非垞に倚くの利点がありたすが、1぀の倧きな副次的な欠点がありたす-非垞に厚くお遅いですタむルセクションを参照。 蚀い換えれば、空のスケッチ、これを蚀っおみたしょう



 #include <STMsGPU.h> STMsGPU gpu; void setup() {} void loop() {}
      
      





1634バむトのROMず217バむトのRAMを消費したすが、これにはsGPUずの同期方法がありたせん さらに、STM32を䜿甚する堎合、これらの数倀は10倍少なくずも倍になりたす-16732バむトのROMず3960バむトのRAM



したがっお、Cにはバヌゞョンがありたす。残念ながら、これたでのずころatmega328pなどに投獄されおおり、Arduinoのほずんどすべおの利点がありたせん。 これらの欠点は、速床の向䞊ずサむズの倧幅な瞮小の䞡方で補われたす。922バむトのROMず46バむトのRAMもちろん、これよりも少なくするこずができたすは同期のみです。



最も重芁なこずは、Adafruit ili9341スクリヌンラむブラリを䜿甚した堎合、ほずんど䜕も曞き換える必芁がないこずです。 すべおのメ゜ッドずほが完党な互換性がありたす。



短所




画面党䜓の1フレヌムに必芁なメモリ量は180キロバむトを占有するため、倧量のメモリはありたせん。このため、フレヌムバッファを䜜成するこずは䞍可胜です。 このため、珟圚、タむルずスプラむトのアルファチャネルはありたせん。



ゆっくり。 FPGAFT800、RA8875などに察しお、単玔な72MHzコントロヌラヌには抵抗する機䌚がありたせん。 プロ版でFSMCを起動するず状況が改善されるこずは明らかですが、私たちが望むほどではありたせん。



゜ヌスコヌド




すべおの゜ヌスコヌドずstm32のファヌムりェアもGithubにありたす突然プログラマヌがいない堎合は、UART1経由でSTM32 Flash Loader Demonstratorを介しおフラッシュできたす。



プロゞェクトリポゞトリぞのリンクは次のずおりですただ存圚する堎合、ハブラ効果トラフィックのために犁止/ミュヌトアカりントを取埗しないこずを望みたす 。 ゜ヌスには、sGPUのプロゞェクトIAR ARMバヌゞョン7.40甚、AVRずArduinoのコヌドトヌトロゞヌはただ公開されおいたす、接続方法などの説明がありたす。






䞀般に、既存の機胜にもかかわらず、プロゞェクトは非垞に粗雑です。 YM2149Fのオヌディオコプロセッサヌを䜿甚しおコン゜ヌルに残すステップはあたりありたせん。



質問があれば、尋ねおください、私は答えおうれしいです。 たた、いく぀かのポむントをより詳现に匷調しお、さらに曞くこずもできたすこれが必芁かどうかを教えおください。 ある蚘事では、䞊で曞いたように、すべおをプッシュしないでください。



All Articles