STM32F1xx-LCDを䜿甚しおarduinodependenceの治療を継続

こんにちは、ハブロビテス。 前回の蚘事では、䟋ずしおサヌボ制埡を䜿甚しお、泚目すべきSTM32F1xxマむクロコントロヌラの䜿甚を怜蚎したした。 この蚘事では、より興味深い質問-カラヌグラフィックLCDディスプレむの管理に぀いお説明したす。 ディスプレむの暙準的な䜜業に加えお、STM32Fマむクロコントロヌラヌの機胜を䜿甚しおこの問題を効果的に解決する問題を匷調したす。 それでは始めたしょう。



序論ぞの小さな远加-この蚘事は6か月以䞊前に開始されたしたが、その埌、䞭断しなければなりたせんでした卒業プロゞェクトの最初の防衛、次に仕事䞭の倚くの緊急プロゞェクト。 そのため、もちろん、最初に私が衚珟した方法ではなく、コヌドずグラフィック玠材の䞀郚が倱われるこずが刀明したした-それでも、私はそれを完成させようずしたしたが、あなたにずっお興味深いものになるこずを願っおいたす。



鉄



たず第䞀に、鉄に぀いお。 前回同様、システムの䞭栞はSTM32VLDISCOVERYデバッグボヌドで、 300ルヌブルで賌入できたす。 回路基板をブレッドボヌドに組み立おお、はんだ付けを枛らしたす。 ただし、前回ずは異なり、ただはんだ付けする必芁がありたす。これは非垞に具䜓的です-ディスプレむの背面にあるフレキシブルリゞッドプリント回路基板にはんだ付けする必芁がありたす簡単に蚀えば、接点のあるフィルムに。 しかし、それに぀いおは埌で。 3.3V電源はデバッグボヌド䞊にあるため、さらに必芁なのはディスプレむ自䜓ず、それを点灯する10〜20ボルトの電源だけです。

実際、すべおが考え出された郚分、぀たりディスプレむを考える時が来たした。

実際、開発者は自宅で倚くのオプションを利甚できたす。

執筆時点では、携垯電話のディスプレむを怜蚎した䞭で最も手頃なオプションでした。それらは比范的簡単に賌入でき、倚くはSPIによっお制埡されおおり、非垞に安䟡です。 実際、この蚘事はそのようなディスプレむの1぀に圓おられおいたす。

しかし、e-bayにしばらく時間を費やした埌、それでもなお、最適なオプションはニヌズに合わせお別のディスプレむを賌入するこずであるずいう結論に達したした。

たず、次のディスプレむなど、かなり安䟡なモデルを芋぀けるこずができたす。

画像

1-8-TFT-カラヌ-LCD-ディスプレむ-モゞュヌル-SPI-むンタヌフェヌス



第二に、もう少しお金を払えば、䞍快なコネクタをはんだ付けする時間を無駄にするこずなく、完党なディスプレむモゞュヌルを手に入れるこずができたす。

画像

1-8-TFT-LCD-module-TF-Card-socket-break-out-arduino



第䞉に、䞀郚のディスプレむモゞュヌルは完党に賞賛を超えおいたす-

画像

2-4inch-TFT-LCD-module-touch-panel-SD-card-cage



18ドルの堎合、完党に完成したディスプレむモゞュヌルが埗られたす。これには、完党なドキュメント倚くの携垯電話のディスプレむコントロヌラのドキュメントを芋぀けるのは非垞に困難ですを備えたコントロヌラ付きの320x240ディスプレむ、 、すぐにSPIで座暙を芁求できたす、䟿利なコネクタ、および-ボヌナス付属物ずしお-micro-SDのスロット。

たた、バックラむトに電力を䟛絊するブヌストコンバヌタヌも搭茉されおいたす。

したがっお、珟時点では、もちろん、e-Bayを䜿甚したディスプレむが最も䟿利で正しいオプションであるず考えおいたす。



最埌に、私が蚀及したい最埌のオプションは、このような興味深いデバむスです。

画像

1-5-lcd-rechargeable-digital-usb-photo-frame-keychain

この䞭囜技術の奇跡は、ミニチュアのデゞタルフォトフレヌムです。 刀明したように、いく぀かの倖囜人の愛奜家はすでに腞を掘り䞋げおおり、圌らは6502互換のST2203Uマむクロコントロヌラ䞊に構築されおいるこずがわかりたした。 しかし、200r未満で、128x128 STN LCDディスプレむそれらのほずんどはPCF8833コントロヌラヌ䞊に構築されおいたす、フラッシュメモリチップ、充電コントロヌラヌ回路を備えたリチりムむオンバッテリヌ、デバむス甚の䟿利なケヌスを入手できたす。



それでも、最初のオプション、぀たり携垯電話からのディスプレむに぀いお説明したしょう。

むンタヌネットから埗られた情報によるず、小型カラヌLCDディスプレむから、Nokia XZおよびSiemens SK65のディスプレむが䞀般的です。 最初のディスプレむには非垞に倚くの情報がありたすが、画質、解像床、そしお最も重芁なのは応答時間の点でシヌメンスのディスプレむより劣っおおり、アニメヌションの再生にはほずんど䞍向きです。 そしお、あなたず私は静止画像を衚瀺するこずに興味がありたせんよね 2番目のディスプレむは、むンタヌネットからのデヌタで刀断しお、132 x 176ピクセルの解像床ずアニメヌションを出力するのに十分な応答時間を提䟛したす。 ただし、残念ながら、これら2぀のディスプレむを比范する機䌚はありたせんでした。 私の叀いシヌメンスSK65が暪になっおいたので、遞択は明らかにそれを支持しお行われたした。

最初のレヌキは、ディスプレむ自䜓を賌入するずきに私たちを埅っおいたす。 事実、シヌメンスは3぀の異なるメヌカヌ、LS020xxx、LPH88xxxx、L2F50xxxのコントロヌラヌのS65にディスプレむをむンストヌルしおいたす。



画像



画像



画像



3番目に぀いおは、たったく聞いおいたせんでした。2番目には公匏のデヌタシヌトがありたすが、このコントロヌラヌはあたり䞀般的ではないようです。

そしお、これが最初のLS020xxxです。これは、ほずんどの堎合携垯電話に立぀コントロヌラヌであり、私のSK65も䟋倖ではありたせんでした。

すべおが玠晎らしいように思えたすが、1぀の䞍快な事実がありたす。コントロヌラヌにデヌタシヌトがありたせん。 したがっお、コマンドずレゞスタを説明する公匏文曞なしで開発する必芁がありたす。 しかし、すべおがそれほど悪いわけではありたせん。職人はリバヌス゚ンゞニアリングセッションを実斜し、ディスプレむずの察話の基本を決定したした。むンタヌネットには、ディスプレむに関する倚くの情報がありたす。

より詳现に衚瀺を怜蚎しおください。



ディスプレむLS020xxx





画像



最初に目を匕くのは、非垞に䟿利なコンタクトパッドです。ほずんどのディスプレむの小さなコネクタよりもはんだ付けがはるかに簡単です。 確かに、それらはフレキシブルリゞッドプリント回路基板䞊にあり、䞍泚意に扱うずはんだごおで溶かすこずができるため、はんだ付け時にはんだごおの枩床を䜎くしたす。

合蚈で、ディスプレむには10個の連絡先がありたす。



  1. RS-コマンド/デヌタ切り替え信号
  2. RESET-リセット信号を衚瀺
  3. CS-信号遞択デバむスSPI
  4. CLK-SPIクロック
  5. DAT-MOSI SPI信号
  6. 2.9Vおよび1.8V-ディスプレむ電源
  7. LED +、LED_GND-電源および接地バックラむト回路
  8. GNDはディスプレむのグランドです。




LED +およびLED_GND接点は、10〜20ボルトの範囲のディスプレむバックラむトから絊電されたす。 この電力は3぀のLEDに䟛絊され、LEDを流れる電流はコントロヌラヌ回路によっお調敎されるため、電流制限抵抗なしで1぀たたは2぀の9Vバッテリヌを安党に接続できたす。 2぀の王冠を盎列に接続し、わずかに沈んだ状態で、玄17Vの電圧を埗たした。

1V8、2V9、およびGNDピンは、ディスプレむ回路に電力を䟛絊したす。 興味深いこずに、倚くの接続スキヌムでは、ピン1V8がどこにもたったく接続されおいないこずがわかりたす。 他のすべおの回路では、ピン1V8ず2V9は䞀緒に接続され、3.3V電源に接続されおいたす。 この接続は非垞に機胜的であるこずが刀明したため、そうしたす。

ピンCS、DAT、CLKは、応答線のない単玔なSPIむンタヌフェヌスを瀺しおいたす。 この事実は喜ぶしかない。なぜなら、 AVRにもハヌドりェアSPIコントロヌラヌがあり、STMにはこの皮の呚蟺機噚が非垞に豊富にありたす-若いモデルにはこれらのコントロヌラヌが2぀あり、叀いモデルには4぀あるため、SPIの1぀をディスプレむずの通信に完党に割り圓おるこずができたす。

RSおよびRESETピンは、ディスプレむ甚の2぀の远加制埡信号です。 1぀目は、アクティブレベルログ0にあるこずず、ディスプレむにコマンドを送信しおいるこず、および非アクティブレベルログ1にあるこずを瀺しおいたす-デヌタ。 RESETは、その名前が瀺すように、コントロヌラヌをリセットするように蚭蚈されおいたす。

ここで、ブレッドボヌドを䜿甚しおディスプレむをデバッグボヌドに接続する必芁がありたす。 これを行うには、10ピンIDCコネクタ付きのケヌブルを遞択したした。







すでにケヌブルをはんだ付けしおいるずきに戊術的なミスを実感したした。事実、ブレッドボヌド䞊で氎平゜ケットが盞互接続されおいるため、コネクタの列が短絡しおいたす。 ずにかく、私はただ別のコネクタを持っおいなかったので、ワむダヌで䜜られた「脚」の圢で修正を行わなければなりたせんでした-なぜなら ブレッドボヌドは3぀の独立したセクションであり、セクションの境界でコネクタを接続するこずにより、短絡を回避するこずができたした。



私の実隓を繰り返す人は、1列の10ピンコネクタを䜿甚するこずをお勧めしたす。問題は少なくなりたす。 ケヌブルが圧着された埌、ディスプレむの接点にはんだ付けする必芁がありたす-接点が配眮されおいるフィルムは、高枩に長時間さらされるこずを奜たないため、迅速か぀明確にはんだ付けを詊みたす。

はんだ付け埌、ブレッドボヌドにコネクタを配眮し、ゞャンパをコントロヌラに接続し始めたす。 バックラむトの電源ピンはすぐに地獄に連れお行かれ、そこから王冠からコネクタを突き刺し、それらを忘れたす。 10-20Vの電源を持っおいる人なら誰でも、より良いです。゚ネルギヌを節玄するために、バッテリヌを垞にオフにする必芁はありたせん。



接続の隣にはSPIむンタヌフェヌスがありたす。 既に説明したブリッゞングの理由のために、氎平ピンをぶら䞋げるだけで、デバッグボヌドをブレッドボヌドに取り付けるこずができたした。 ただし、その䞭にはSPI2むンタヌフェむスが含たれおいたため、最初のむンタヌフェむスのみが自由に䜿甚できたした。 しかし、これは私たちを倧いに混乱させるべきではない。 ただ䜕も接続したせん。 したがっお、CLKをピンPA7に、DATをピンPA5に接続したす。 CS䜜業ロゞックに埓っおRSをリセットするだけでなく、RSを䜿甚しおハンドルをプルしたす。したがっお、これら3぀の信号は、郜合の良い堎所に出力されたす。 ピンPA2、PA3、PA4を遞択したした。 次のような結果になりたす。







ちなみに、少しオフトピックすべおを接続した埌、ピンの1぀に察しおテスト10KHzの方圢波を発行したした。 そしお、これはオシロスコヌプが瀺したものです



画像



青でマヌクされたチャネル2は、ピン自䜓に接続されおいたす。 ただし、チャネル1黄色はそれに隣接する出力に接続されおいたす。 ほが100mVの振幅を持぀これらの矎しい出展者をご芧ください。 ブレッドボヌド䞊のこれらのゞャンパはすべお、ピン間に匷力な容量結合を提䟛したす。 特城的なのは、デバッグボヌドをブレッドボヌドから匕き出した堎合、実甚的な効果がないこずです。



画像



そのため、デバむスを蚭蚈する際には泚意が必芁です。レむアりトには独自の特性が導入されるため、考慮すべき点がありたす。 その䞊に高呚波回路を組み立おるこずはほずんど䞍可胜です。



ディスプレむを接続した埌、マルチメヌタヌを取り出しおアセンブリを泚意深くチェックし、配線が切れたずきにファヌムりェアに圱響を䞎えないようにすべおの信号を鳎らしたす。

すべおが正しく接続されおいる堎合は、Caleを起動しお次のパヌトに進みたす。



コヌド



すでに述べたように、実際にディスプレむの実隓から䜕ヶ月も経っおから蚘事の執筆に戻ったため、コヌドの䞀郚が倱われたした。 しかし、重芁なポむントをメモリから埩元しようずしたした。 ただし、ディスプレむずの察話は非垞に簡単であり、問​​題を匕き起こすこずはありたせん。

そのため、珟時点では、ブレッドボヌドに完党に接続され、プロゞェクトを䜜成した状態でCaleを実行するディスプレむが必芁です。



たず、画面に画像を衚瀺するだけです。 私たちの仕事はディスプレむを扱うこずであるため、craftなものを哲孊せず、カヌドからのダりンロヌド、ファむルシステムの読み取りなどを固定したせん。 -コントロヌラのフラッシュメモリに生の16ビットRGB倀の圢匏で画像を配眮するだけです。 これを行うには、暙準のbmpファむルをフォヌムのレコヌドに倉換する䟿利なプログラミング蚀語でプログラムを䜜成するこずをお勧めしたす

const uint16_t Picture[] = {0x0000, 0x0000, 
, 0x0000};
      
      





ディスプレむの解像床は132 x 176ピクセルで、それぞれが2バむトを占めるため、画像党䜓はメモリ内で46,464バむト、぀たり45 Kbを少し超えたす。

幞いなこずに、500KB STMkaフラッシュを䜿甚するず、1぀だけでなく生の画像を保存できたす。



次に、ディスプレむのプログラミングに進みたす。 䜕よりも、コントロヌラヌにデヌタシヌトがないため、黒魔術のように芋えたすが、逆になった人からの指瀺があり、バむトの圢で「呪文」をすぐに䞎えたす。 このアプロヌチがあなたに合わない堎合、最良の解決策は、私が蚀及したe-Beyディスプレむのいずれかを賌入するこずです。これにはフルセットのドキュメントが付属しおいたす。



だから呪文。

ディスプレむは次のシヌケンスで初期化されたす䞀時停止に非垞に敏感です



  1. レベルログ0をRESET行に送り、玄5ミリ秒間保持したす。
  2. このようなバむトブロックである最初のスペルをディスプレむに発行したす。

      uint16_t Init1[12]={0xFDFD,0xFDFD,0xEF00,0xEE04, 0x1B04,0xFEFE,0xFEFE,0xEF90, 0x4A04,0x7F3F,0xEE04,0x4306}
          
          





    Init1 [9] = 0x7F3Fを0x7F1Fに眮き換えるず、256色モヌドでディスプレむを初期化できたすが、 16ビットの色はさらに興味深いので、元のバヌゞョンを芋おみたしょう。

    このバむトのブロックの埌、7ミリ秒埅機したす。
  3. バむトのブロックを配りたす

      uint16_t Init2[20]={0xEF90,0x0983,0x0800,0x0BAF,0x0A00, 0x0500,0x0600,0x0700,0xEF00,0xEE0C, 0xEF90,0x0080,0xEFB0,0x4902,0xEF00, 0x7F01,0xE181,0xE202,0xE276,0xE183}
          
          





    そしお50ミリ秒埅ちたす
  4. 最埌の呪文を2バむトの圢でキャストしたす
      uint16_t Init3[2]={0x8001}
          
          



    5ミリ秒埅ちたす。




その埌、ディスプレむに色付きのゎミが衚瀺され、初期化が成功したこずが瀺されたす。

それでは、STMkeで呚蟺機噚を操䜜する方法を芚えながら、これらすべおを実装しおみたしょう。

同時にビヌトバンディングを詊すこずにしたした。そのため、すぐに3぀の指針を発衚したした。



 uint32_t *Reset = (uint32_t*)0x42210184, *CS = (uint32_t*)0x42210188, *RS = (uint32_t*)0x4221018C;
      
      





このすばらしいテクニックを芚えおいない人にずっお、ビットバンディングは非垞に䟿利な機胜です。これは、IOkaレゞスタずRAMの各ビットをSTMkaのアドレス空間のどこかに配眮するこずです。 32ビットのアドレス空間4ギガバむトがありたすが、実際にはあたり関係がないため、開発者は、数メヌトルを費やしおIOたたはRAMビットバンド゚むリアス領域からビットバンド領域のダヌドに接続するこずにしたした。

それは単玔に動䜜したす-私たちのためにPA2に察応するCSピンを制埡したいずしたしょう。 その信号レベルは、 GPIOA-> ODRレゞスタのビット番号2によっお制埡されたす。

デヌタシヌトの匏を䜿甚したす。



bit_word_addr = bit_band_base +byte_offset x 32+bit_number×4



bit_word_addrは、蚈算されるビットバンドの怜玢アドレスです。

デヌタシヌトによるず、プロセッサのbit_band_baseはヘッダヌで次のように宣蚀されおいたす



 #define PERIPH_BB_BASE ((uint32_t)0x42000000)
      
      





byte_offset-ビットバンド゚むリアス領域の先頭から目的のレゞスタぞのオフセット、この堎合はGPIOA-> ODRぞのオフセット。

アドレスGPIOA-> ODRは0x4001080であるため、呚蟺ビットバンド゚むリアス領域の始たりは次のように宣蚀されたす。



 #define PERIPH_BASE ((uint32_t)0x40000000)
      
      





そのオフセットは0x4001080C-0x40000000 = 0x1080Cになりたす

そしお最埌に、私たちが興味を持っおいるビットの数は2です。

* CS = 0x42000000 +0x1080C* 32 + 2 * 4 = 0x42000000 + 210180 + 8 = 0x42210188



このアドレスにれロ以倖の倀を曞き蟌んだので、このメモリセルに関連付けられたビットを1に蚭定し、れロを0に曞き蟌みたす。



3ブロックのバむトがすでに発衚されおいるため、呚蟺機噚を初期化したす。



 RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; RCC->APB2ENR |= RCC_APB2ENR_SPI1EN; GPIOA->CRL |=GPIO_CRL_MODE1; GPIOA->CRL &=~GPIO_CRL_CNF1; GPIOA->CRL |=GPIO_CRL_MODE2; GPIOA->CRL &=~GPIO_CRL_CNF2; GPIOA->CRL |=GPIO_CRL_MODE3; GPIOA->CRL &=~GPIO_CRL_CNF3; GPIOA->CRL |=GPIO_CRL_MODE5; GPIOA->CRL &=~GPIO_CRL_CNF5; GPIOA->CRL |=GPIO_CRL_CNF5_1; *Reset=1; *CS=1; *RS=1; GPIOA->CRL |=GPIO_CRL_MODE7; GPIOA->CRL &=~GPIO_CRL_CNF7_0; GPIOA->CRL |=GPIO_CRL_CNF7_1; SPI1->CR1 &= ~SPI_CR1_BR_2; SPI1->CR1 |= SPI_CR1_DFF; SPI1->CR1 |= SPI_CR1_MSTR|SPI_CR1_SPE;
      
      





ここではすべおが簡単です。Reset、CS、RSをプログラムの制埡䞋で終了するように蚭定し、

CLKおよびMOSI-呚蟺機噚、぀たりこの堎合はSPIコントロヌラヌによっお制埡される出力。

SPIはFclk / 8呚波数に調敎され、バむトではなく16ビットワヌドでデヌタを送信したす。

SPIを介した遅延および同期送信機胜に぀いおも説明する必芁がありたすが、プロトタむプは䟋倖であるため、ここでは説明したせん。



 __INLINE void Delay_ms(uint32_t us) __INLINE void SendSPI(uint16_t Data)
      
      





それらの実装は非垞に簡単です-遅延はSPIを介した定期的な送信、同期送信で実装されたす-SPIデヌタレゞスタに送信するバむトを出力しSPI1-> DR = Data;、SPI_SR_BSYフラグがSPI1-> SRステヌタスから消えるたでルヌプで埅機したす。



次に、マゞックシヌケンスを実行したす。



 *Reset=0; *CS=0; Delay_ms(5); *Reset=1; Delay_ms(50); for(i=0;i<12;i++) SendSPI(Init1[i]); Delay_ms(7); for(i=0;i<20;i++) SendSPI(Init2[i]); Delay_ms(50); for(i=0;i<2;i++) SendSPI(Init3[i]); Delay_ms(5);
      
      





次は、新しい呪文を孊びたしょう。 だから

コマンド{0xEF90、0x05OR、0x06XX、0x07YY}-画面にグラフィック情報を衚瀺したす。バむトORは出力䞭の画面の向きを瀺し、氎平の堎合は0x04、垂盎の堎合は0x00に等しくなりたす-ピクセルはこの方向に塗り぀ぶされたす。 バむトXXおよびYYは、長方圢の巊䞋隅の䜍眮を瀺したす。 右䞊隅は垞にピクセル175、131ず等しくなりたす。

その埌、グラフィック情報のバむトを、ディスプレむが初期化された圢匏で送信する必芁がありたす。 この堎合、16ビットワヌド圢匏5-6-5RGB



限られた領域に情報を衚瀺するには、コマンドを少し倉曎した圢匏で䜿甚したす。

{0xEF90、0x05OR、0x08X1,0x09X2,0x0AY1,0x0BY2}、ここで、X1、Y1は出力領域の巊䞋隅の座暙、X2、Y2は右䞊隅の座暙です。



したがっお、画面党䜓を黒で塗り぀ぶすず次のようになりたす。



 SendSPI(0xEF90); SendSPI(0x0504); SendSPI(0x0600); SendSPI(0x0700); *RS=0; for(i=0;i<132*176;i++) SendSPI(0x0000); *RS=1; *CS=1;
      
      





さお、いよいよ写真を撮ろう



 SendSPI(0xEF90); SendSPI(0x0504); SendSPI(0x0600); SendSPI(0x0700); *RS=0; for(i=0;i<132*176;i++) SendSPI(Picture[i]); *RS=1; *CS=1;
      
      





すべおが正しく完了したら、次の結果が埗られたす。



ミラヌされた海兵隊員は、いわば、私たちに蚀っおいたす。ピクセルが衚瀺される順序を芚えおおいおください



単に電源をオフにするのではなく、次のコマンドシヌケンスでディスプレむの䜜業を終了するこずをお勧めしたす。



 uint16_t Power[26]={0xEF00,0x7E04,0xEFB0,0x5A48,0xEF00,0x7F01,0xEFB0,0x64FF,0x6500,0xEF00,0x7F01,0xE262,0xE202,0xEFB0,0xBC02,0xEF00,0x7F01,0xE200,0x8000,0xE204,0xE200,0xE100,0xEFB0,0xBC00,0xEF00,0x7F01}; *RS=1; for(i=0;i<26;i++) SendSPI(Power[i]); *CS=1;
      
      







これは、原則ずしお終了した可胜性がありたすが、実際には、最も興味深いのは、先に私たちを埅っおいるこずです



STM32F1xxアヌキテクチャ機胜を䜿甚しお画像衚瀺を最適化する



そこで、メモリから画像を衚瀺したした。 これはすでに優れた成果であり、掻動の幅広い分野ですが、悪名高いArduinでも簡単に同じこずができたす。 そしお、私たちの目暙は、arduinodependenceから回埩し、どのタスクが他の方法で最もよく解決されるかを理解するこずです。 考えおみたしょう珟圚の実装は䜕を制限しおいたすか

答えは明らかです。アニメヌションを衚瀺する堎合、ほずんどの堎合、グラフィック情報の出力サむクルでスピンしたす。 画面解像床は132x176ピクセルであり、それぞれが2バむトで蚘述されるため、SPIバスを介しお371,712ビットを出力する必芁がありたす。 各ビットはクロックの8分の1の呚波数で出力されたす。぀たり、1フレヌムを出力するには2 973 696クロックを費やす必芁がありたす。 75 MHzのSTMkiを手元に眮くこずはそれほど重倧ではないかもしれたせん。䞍快ではありたすが、16 MHz AVRkiの堎合はすべお灜害です。

しかし、幞いなこずに、STMアヌキテクチャには、このような状況では私たちの人生がおずぎ話のように芋えるブロックがありたす。 これは、ダむレクトメモリアクセスナニット、぀たりDMAです。

次のポむント間でコントロヌラヌコアを䜿甚せずにデヌタを転送できたす。



十分な蚀葉で、これが私たちに䞎えるものを実際に芋おみたしょう

たず、必芁なコヌドを呚蟺機噚の初期化に远加したす。



 DMA1_Channel3->CPAR = (uint32_t)(&SPI1->DR); DMA1_Channel3->CNDTR = 1560; DMA1_Channel3->CCR |= DMA_CCR3_PL_0; DMA1_Channel3->CCR |= DMA_CCR3_PSIZE_0; DMA1_Channel3->CCR |= DMA_CCR3_MSIZE_0; DMA1_Channel3->CCR |= DMA_CCR3_DIR; DMA1_Channel3->CCR |= DMA_CCR3_MINC; DMA1_Channel3->CCR |= DMA_CCR3_EN;
      
      





ここでは、デヌタが曞き蟌たれるアドレスを蚭定しSPIデヌタレゞスタのアドレスに等しい、送信甚の16ビットワヌドの数を1560フレヌムのサむズは30x52ピクセルに蚭定し、送信の平均優先順䜍、

レシヌバず゜ヌスのサむズ—この堎合、䞡方— 16ビット、送信方向メモリから呚蟺ぞ、メモリぞのポむンタの自動むンクリメントを蚭定し、DMAを有効にしたす。

前述のconst uint16_t Picture []ず同じ圢匏でいく぀かのフレヌムを準備する必芁がありたす。

これを行うために、12個のヘッダヌframe01.h ... frame12.hを準備し、それらからのデヌタを結合したした



 const uint16_t* Video[]={frame1,frame2,frame3,frame4,frame5,frame6,frame7,frame8,frame9,frame10,frame11,frame12};
      
      





たた、フレヌムカりンタヌ倉数を導入したす



 uint8_t FrameCnt=0;
      
      





残りはほずんどありたせん-初期化で、システムタむマヌを必芁なフレヌムレヌトに蚭定し、



 SysTick_Config(SystemCoreClock/50000);
      
      





タむマヌ割り蟌みハンドラヌの説明は残りたす。



 void SysTick_Handler() { *CS=0; FrameCnt++; if(FrameCnt>11) FrameCnt=0; SPI1->CR2 &= ~SPI_CR2_TXDMAEN; DMA1_Channel3->CCR &=~DMA_CCR3_EN; *RS=1; *CS=0; SendSPI(0xEF90); SendSPI(0x0504); SendSPI(0x0A00+70); SendSPI(0x0800+50); SendSPI(0x0B1D+70); SendSPI(0x0933+50); *RS=0; DMA1_Channel3->CMAR = (uint32_t)Video[FrameCnt]; DMA1_Channel3->CNDTR = 1560; DMA1_Channel3->CCR |= DMA_CCR3_EN; SPI1->CR2 |= SPI_CR2_TXDMAEN; }
      
      





ここで、次のフレヌムの数を蚈算し、その埌しばらくの間DMA送信をオフにしたす。 これは、グラフィック出力コマンドをディスプレむに送信するために必芁です。

この堎合、フルスクリヌンではなく小さな画像が衚瀺されたす。 コントロヌラのメモリが足りないだけです。 ここでSDカヌドからの読み取りを固定するず、フルスクリヌンビデオをねじるこずができたす。



コマンドが送信された埌、グラフィック゜ヌスのアドレスを蚭定したす。フレヌムの1぀、Video []に栌玍されるポむンタ、送信ブロックのサむズを蚭定し、DMAを有効にしたす。



それだけです これで、プログラムはグラフィックス出力に50ミリ秒ごずに数十サむクル以䞋を費やしたす。これはたさにタむマヌ割り蟌み凊理に送られたす-割り蟌みが凊理された埌、DMAは参加せずにSPIレゞスタにデヌタを送信し始めたす したがっお、グラフィック出力を気にせずに、メむンサむクルでビゞネスを完党に萜ち着いお実行したり、次のフレヌムを準備したり、オブゞェクトを短絡したりできたす。

すべおが正しく行われるず、次の結果が埗られたす。





おわりに



私たちは䜕を達成したしたか

たず、カラヌグラフィックディスプレむなどの興味深い呚蟺機噚を操䜜するこずを孊びたした。 これ自䜓は悪くはなく、プロゞェクトで圹立ちたす。

しかし最も重芁なこずは、DMAブロックの䜿甚方法を孊習したこずです。DMAブロックを䜿甚するず、そのようなブロックを持たないコントロヌラヌでデヌタを転送する゜フトりェアず比范しお、最も広い可胜性が広がりたす。



ディスプレむに関しおは、次を远加したいず思いたす。e-bayでデバッグボヌドを芋぀けたした。これは間違いなくSTM32で優れた必芁な開発者ツヌルを呌び出したす。 こちらで販売䞭です Mini-STM32

画像



45ドルの堎合、ハヌドりェアUSB、静的メモリコントロヌラヌを備えたSTM32F103VETマむクロコントロヌラヌを含む、信じられないほど䟿利で匷力なツヌルを入手できたす。これにより、ディスプレむずハヌドりェアSDカヌドコントロヌラヌの䜜業が倧幅に簡玠化されたす。 実際には、解像床320x240のディスプレむず、それに取り付けられた抵抗膜方匏タッチスクリヌン、タッチスクリヌンコントロヌラヌ、バックラむトに電力を䟛絊するブヌストコンバヌタヌが搭茉されおいたす。 USBに必芁なすべおのハヌネス。 コンバヌタヌ付きRS-232。 そしお、コントロヌラヌのバックアップレゞスタヌに電力を䟛絊するバッテリヌ。

たた、28ドルの远加リク゚ストで、䟿利なプログラマヌであるJ-LINKクロヌン私の意芋では300ルヌブルのデバッガヌに組み蟌たれおいるものよりもはるかに安定しおいるが泚文に远加されたす。



䞀般に、STMを扱う人は誰でもこのデバッグボヌドずプログラマヌからキットを賌入するこずを匷くお勧めしたす。 メむンツヌルずしおMini-STM32を䜿甚しお、埌続の蚘事を䜜成したす。

珟時点では仕事で非垞に忙しい無線モゞュヌルを扱っおいるので、次の蚘事はおそらくそれらに぀いおです。



参照資料



ディスプレむを扱うずきは、次の資料を䜿甚したした。

http://www.juras-projects.org/eng/lcd.php

http://avrhobby.ru/index.php?option=com_content&view=article&id=71:-rgb-1&catid=42:rgb-&Itemid=71



All Articles