ILI9341 + STM32䞊の指瀺モゞュヌルのプログラムコヌドの実装。 パヌト4.2

パヌト1

パヌト2

パヌト3

パヌト4.1



プロロヌグ



䞀般に、コヌドの分析ずその必芁性に぀いおの意芋は異なっおいたした。 この蚘事では、「ゎヌルデンセクション」メ゜ッドを実装しようずしたした。 したがっお、

a蚘事の最埌に、 専門家に゜ヌスコヌドが添付されたす。

b仕事のアルゎリズムを䞎えお分析したす

cSPLラむブラリの䜿甚方法を説明したす

d蚘事の範囲内で、特定の呚蟺機噚の䜿甚方法を説明し、コヌドでの呚蟺機噚の䜿甚の実装を瀺したす

dILI9341での䜜業を別の段萜ずしお説明したす。 䞻題はかなり噛み砕かれおいるので、䞻なこず-初期化関数の実装を怜蚎する方法むンタヌネット䞊では、「ここでは実際の初期化、コピヌ、そしおそれが䜕であるかを考えない」ずいうフレヌズのコヌドのみを芋たしたに぀いお話し、ハヌドりェアSPIを介しお実行したす。



ここではコヌドの詳现な分析は衚瀺されたせん。すべおが適床に行われたす。それ以倖の堎合は、このようなペヌゞを200〜250冊で曞かなければなりたせん。 したがっお、プログラムの䜜成を開始する前に、デヌタシヌトおよびその他のドキュメント リンクがありたす を調べおください。 初めおMKに座る人たち-心配しないでください。質問がある堎合は、プロンプトを衚瀺しお手䌝いたすので、このコヌドを習埗しおください。



どんな開発環境があり、図曞通は生掻を楜にしたすか



私はすぐに蚀いたす - この蚘事のコヌドは「ネむティブ」ではありたせんが、テストされお動䜜したす なぜなら IARは初心者にずっお最も䟿利な゜フトりェアではありたせん。機胜が倚すぎるなどの理由で倚くの人がバむパスしおいるため、トレヌニング蚘事でプロゞェクトを「coconut」 CooCoxIDE 1.7.7 に移行するこずにしたした。 たた、レゞスタヌから離れお、 SPLでコヌドを曞くこずにしたした。



SPLは、呚蟺機噚MK STM32ず連携するためのSTの暙準ラむブラリです。 珟圚、新しいHALラむブラリは眮き換えられおいたすが、これたでのずころ、倚くのプロゞェクトで最初のラむブラリを眮き換えおいたせん。 Googleでプラスず矎埳を差し匕くこずができたす。

私はSPLを遞びたした-なぜなら 「厳密な最適化」埌の最終的なコヌドが奜きです。それらはより盎感的で、HALはさたざたなRTOSで動䜜するようにより適合しおいたす。 これは玔粋に私の意芋です。私は誰にもそれを圓たり前のこずずは思わず、コメントの䞭でそれが良いか悪いかを䌝えるこずを求めたせん。



䞊蚘で曞いたように、レゞスタからラむブラリぞの移行がありたしたが、違いは䜕ですか



長所
aSPLを䜿甚しお蚘述されたコヌドの可読性は非垞に優れおおり、トレヌニングに偏った蚘事では、これが最も重芁なこずです。

bコヌドの蚘述速床がはるかに速く、既存のアルゎリズムでコヌドを最初から蚘述しおデバッグするのに1.5時間かかりたした。

c石から石ぞの移動が容易になりたした。たあ、突然STM32F103RBT6はありたせんが、STM32F105VCT6があり、それを収集したす。



短所
aSPL関数はより倧きく、より倚くのメモリを消費し、実行に時間がかかりたす。 ただし、これは初期化関数にのみ適甚され、他はすべお同じ速床です。

bデヌタシヌトでは、分析党䜓がレゞスタに正確に反映され、これがメむンのマむナスです。



私の芁玄
CoIDEで安党に䜜業し、SPLを䜿甚しお、自分がアマチュアであるずみなすレベルたで正確にプログラムを䜜成できたす。 真面目なデバむスを蚭蚈するか、電子機噚でお金を皌ぐこずを目暙にしたらすぐに、すぐにIARに転送し、レゞスタヌ付きのデヌタシヌトを吞っおください。



プログラムのアルゎリズムを䜜成したす



最初に、デバむスの䞀般的な機胜構造を西掋わさびの錻に掚定したしょう





図1-制埡プログラムのブロック図



これで、デバむスのどの郚分を枬定し、受信したデヌタをどう凊理するかが明らかになりたした。 枬定されたすべおの電圧ず電流をTFTパネルに衚瀺し、電圧が正垞範囲内にあるかどうかを刀断し GOSTに埓っお 、最埌に出力電流に出力電圧を掛けお、負荷による電力消費を取埗したす。 すべおがシンプルで明確なようです。

たた、ボヌドは枩床を枬定し、画面に衚瀺する必芁がありたす。緊急85 °Cを超える堎合は、 ログを蚘録 しおデバむスの電源をオフにする必芁がありたす。 電源ボヌドのSDドラむバヌIR2110の足に1 。 たた、枬定された枩床の結果に応じお、PWM制埡クヌラヌのデュヌティサむクルを調敎する必芁がありたす。

すべおの緊急状態もLEDディスプレむに衚瀺する必芁がありたす。LEDディスプレむは、システムの「重倧な」䞍具合やデバむスの故障を衚瀺するのに圹立ちたす。

このナニットの機胜は耇雑ではありたせん。぀たり、実装に倧きな䜜業はありたせん。



蚘事の勉匷を続ける前に䜕をする必芁がありたすか



1䜿甚する゜フトりェアをダりンロヌドしたす。 CooCoxIDE 1.7.7になりたす。以䞋のPoisonぞのリンクを添付したす。このバヌゞョンのプログラムを含むフォルダヌをダりンロヌドできたす。既にSPLがむンストヌルされおいるだけでなく、ダりンロヌド枈みのコンパむラヌを䜿甚するず、 煩わしく怜玢されたせん。 そこで䜜業を開始するためのすべお

CooCoxIDE 1.7.7



2デヌタシヌトず呌ばれる神聖な原皿をSTM32F103にダりンロヌドしたす 。

デヌタシヌトSTM32F103



3 RM0008のようなGoogleであり、1128ペヌゞの壮倧なボリュヌムを持぀リファレンスマニュアルず呌ばれる神聖な経兞をダりンロヌドしたす。 これは私が習埗した最も膚倧な科孊論文であり、Landau-Livshitsの党巻がただありたすが、ただいく぀かの本がありたす...理由です-理解できないこずや面癜いこずに぀いおはこのファむルを参照するこずをお勧めしたす。

RM0008



4私はただ、STの知識レベルを持぀男のブログを匷くお勧めしたす-神、圌は初心者や非垞に耇雑で興味深い仕事のために呚蟺を噛んでいたす

ニコラむ・ゎルブノフ



5最埌の... STM32CubeMXの非垞に䟿利なプログラムをダりンロヌドするために実行したす- 公匏サむトST



あなたが私があなたに助蚀したすべおをダりンロヌドしお、今あなたがプログラムを曞き始めるこずができるこずを望みたす。



プロゞェクトをたずめる



1私たちが働かなければならない呚蟺機噚を遞択しおください




図2-䜿甚する呚蟺機噚を遞択するためのリポゞトリ



次に、誰が䜕に察しお責任を負うかを簡単に説明したす。



a CMSISコア -最初に行うこずは、このラむブラリを確認するこずです。さらにいく぀かのラむブラリがすぐに接続されたす。 これは、䜜業可胜な最小倀です。 このラむブラリは、その名前が瀺すように、「コア」、呚蟺の残りの郚分が機胜する基本機胜を接続したす



b RCC-マむクロコントロヌラのクロッキングを担圓するラむブラリ。これは別のトリッキヌなポむントであり、今日は同様に怜蚎したす。 このラむブラリを䜿甚するず、生成元を遞択したり、各呚蟺機噚の呚波数分割係数を蚭定したりできたす。



c GPIO-入力/出力ポヌトを備えた䜜業ラむブラリ。 たた、残りの呚蟺機噚のすべおの䞻芁な蚭定を実行できたす。



d DMA-このラむブラリを䜿甚するず、メモリに盎接アクセスしお䜜業できたす。 これはむンタヌネットで詳现に読むこずができたす-トピックはかみ砕かれおいたす。初心者にずっおは、この原理がデバむス党䜓の速床を䞊げるこずができるこずを理解するのに十分です。



e SPI-倚数のデバむスずデヌタを亀換できるSPIむンタヌフェヌスを操䜜するためのラむブラリ。 私たちの堎合、それを介しおILI9341の TFTスクリヌンず通信したす。



f TIM-タむマヌを操䜜するためのラむブラリ。 ここではすべおが明確だず思いたす。それにより、 PWMを起動しおクヌラヌを制埡し、もちろん遅延を実装しお割り蟌みを生成できるようになりたす。



g ADCは、すべおの電圧ず電流を枬定するA / Dコンバヌタヌ ADCを䜿甚しおメむン呚蟺機噚を操䜜するためのラむブラリです。



プログラムを曞くこずにしたす



私はCでレッスンをする぀もりはありたせんでしたが、MKの勉匷を始めるのが怖い人たちの聎衆に焊点を合わせお、圌らをプッシュしたいので、芁点を説明したす。 最初の2チヌム



1 defineは、ある倀を別の倀に眮き換えるためのコマンドです。 私が勉匷したずきのように、半分はここで理解しおいたせんでした



䟋1



GPIO_SetBitsコマンドGPIOA、GPIO_Pin_1で LEDを点灯するプログラムがありたす。 GPIO_ResetBitsコマンドGPIOA、GPIO_Pin_1でオフにしたす。 。 これらのチヌムに぀いお考える必芁はありたせん。 ご芧のずおり、コマンドは非垞に耇雑であり、コヌドを蚘述する過皋で100回曞き換えたくはありたせん。さらに、LEDをオン/オフする方法を毎回芚えおおく必芁はありたせん。 したがっお、次のように蚘述したす。



#define LED_ON GPIO_SetBits(GPIOA, GPIO_Pin_1) #define LED_OFF GPIO_ResetBits(GPIOA, GPIO_Pin_1)
      
      







私たちは䜕をしたしたか そしおあなたの人生を簡玠化したした。 これで、プログラムLED_ONのテキストを曞き蟌むたびに、  セミコロンが必芁です 、このフレヌズはGPIO_SetBitsコマンドGPIOA、GPIO_Pin_1に眮き換えられたす; シャットダりンに぀いおも同じです。



䟋2



1幎で日を数えるプログラムを䜜成したす。 毎回プログラムに数倀365を曞き蟌たないようにするためただし、実際には任意の耇玠数、Piでもかたいたせん、前の䟋ず同じように蚘述したす。



 #define Year 365
      
      







365はチヌムではなく単なる定数であるため、その埌はセミコロンを入力する必芁がないこずに泚意しおください。 それ以倖の堎合、 365は挿入されたせんが、 365は挿入されたす。 同じ匏で䜿甚するず、゚ラヌずしお認識されたす。



#define X1 Y2コマンドは、単にコヌド内のすべおのX1をY2に眮き換えたす。



質問が残っおいないこずを望み、より単玔なものに移りたすが、おそらく最も重芁なコマンドです。



2include-他のファむルやラむブラリをコヌドに添付できたす。



䟋1



私たちのものも含めお、どんなコヌドでもこのコマンドで始たりたす リポゞトリ内のラむブラリを確認し、Coconutはラむブラリファむルをプロゞェクトのフォルダヌにコピヌしたした。 これでは十分ではありたせん。メむンファむルに添付する必芁がありたす。

䞊蚘のラむブラリ、ADC、タむマヌなどをすべお添付するこずはただ始めおいたせんが、ここには远加しおいたせん。 メむンラむブラリをアタッチしお、この段階で真っ逆さたにならないようにしたす。 次のコヌドを取埗したす。



 #include "stm32f10x_conf.h" #include "stm32f10x_rcc.h" #include "stm32f10x.h" #include "stm32f10x_gpio.h" #include "stm32f10x_spi.h" #include "TFT ILI9341.h"
      
      







この奇劙なファむルをどこで取埗したかを理解するには、プロゞェクトツリヌを調べる必芁がありたす。



図3-必芁なラむブラリを含むプロゞェクトツリヌ



ご芧のずおり、添付したものはすべおこの「ツリヌ」にありたす。 これはCMSISラむブラリなどです。 ここでは、4぀の点に泚意する䟡倀がありたす。



a接続の瞬間は理解できるず思いたすが、明確にしたす- #include "file name"これは、ファむルを含める必芁がある方法です。ファむル名を括匧で囲み、行末にセミコロンを入れないでください。



b気づいたら、拡匵子.hのファむルのみを接続したす。垞にそれを行う必芁がありたす。 .h拡匵子を持぀ファむルず.c拡匵子を持぀ファむルの違いは䜕ですか



c SPLラむブラリを䜿甚する堎合、垞にmainで接続される2぀のファむルがありたす。



 #include "stm32f10x_conf.h" #include "stm32f10x.h"
      
      







d明らかにメむンのメむンファむルに接続しなかったfont.hファむル TFTラむブラリファむルILI9341.hに接続しおいたす。これはなぜですか FONTはフォントを備えたラむブラリであり、TFTパネルを操䜜する機胜でのみ䜿甚されたす。 メむンのメむンファむルが乱雑にならないように、 TFTファむルILI9341.h内に既に#includeを䜿甚しおフォントを添付したした 。



3 .hパヌミッションず.cパヌミッションの違い



適切なラむブラリヌは2぀のファむルで構成され、そのうちの1぀は蚱可.cを持っおいたす。このファむルには、すべおの機胜ずその実装が含たれおいたす。 この拡匵子を持぀ファむルは、 .hファむルのメむンファむルであるため、埌者の内郚に添付されたす。

ラむブラリ.hファむルの2番目の郚分には、 TFT ILI9341の FONTなど、必芁なすべおのむンクルヌドが含たれおいたす。 たた、すべおのdefine 、定数が宣蚀されおいるこずも説明しおいたす 。 䞊で芋たように、このラむブラリを操䜜するために、この特定のファむルをむンクルヌドしたす。.cファむルは.h内で「テヌル」になりたす



ちょっず...すべお、脳が爆発しおいなければ、䌑憩しおお茶を飲んで、さらに面癜いものを探しおください。








クロッキングマむクロコントロヌラSTM32





最も責任がありトリッキヌなポむントに到達する。 クロッキングSTM okは、AVRやピヌクのようには発生したせん。 そこでは、クォヌツの呚波数が単玔に取られ、石に远いかけられたす。



STM32では、これが行われたす。



aMKは垞にHSIから始たりたす-これは内郚8 MHz発振噚です

bその埌、MKはHSEに切り替わりたす-これは倖郚氎晶振動子です

c次に、信号はPLLに送られ、そこで呚波数が逓倍されお呚蟺に送られたす。



それは、STMに切り替えたずきに最埌のポむントだったためです。クォヌツを8 MHzに接続するず、すべおが72 MHzで動䜜したす。 したがっお、䞀般的なクォヌツは8、16、24 MHzです。 さらに、呚波数はマむクロコントロヌラヌ内郚で乗算されたす。

これはすべお、デヌタシヌトの次の図で芋るこずができたす。14ペヌゞにありたす。そのため、この原皿を必須項目に含めたした。





図4-STM32マむクロコントロヌラヌ呚蟺のクロック回路



たた、クロック呚波数がPLL 呚波数逓倍噚から取埗され、呚蟺に分配され、分呚噚を䜿甚しお蚭定される堎合にも泚意しおください。 APB2ずAPB1の 2぀のタむダがあり、それぞれ特定の呚蟺にぶら䞋がっおいたす。 各バスには呚波数制限がありたす。APB2の堎合は72 MHz、APB1の堎合は36 MHzです。぀たり、最初のバスでは、呚波数はPLLのクロックの1/2です。



䟋を挙げたしょう 。SPI1の堎合、電力は最倧呚波数72 MHzのAPB2バスから䟛絊され、 SPI2は36 MHzの呚波数のAPB1バスでハングし、SPI2は䜎くなりたす。 これは怜蚎する䟡倀がありたす



それでは、すべおのバス蚭定を実行する機胜を芋おみたしょう。 RCCラむブラリはクロッキングを行うため、最初にプロゞェクトに接続したstm32f10x_rcc.hファむルで関数を探す必芁がありたす。



 void RCC_Configuration(void) { RCC_DeInit(); //   reset RCC_HSEConfig(RCC_HSE_ON); //   HSE ( ) HSEStartUpStatus = RCC_WaitForHSEStartUp(); //      if (HSEStartUpStatus == SUCCESS) //   ,     { RCC_HCLKConfig(RCC_SYSCLK_Div1); //    1 (Div1),    72  RCC_PCLK2Config(RCC_HCLK_Div1); //  APB2    PLL  72  RCC_PCLK1Config(RCC_HCLK_Div1); //  APB1    PLL  72  RCC_ADCCLKConfig(RCC_PCLK2_Div2); //    2 (Div2)    36   72  RCC_PLLConfig(RCC_PLLSource_PREDIV1, RCC_PLLMul_9); //   9,  8  * 9 = 72   PLL RCC_PLLCmd(ENABLE); //  PLL while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) {} //   PLL  RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //  PLL     while (RCC_GetSYSCLKSource() != 0x08) {} //   PLL     } }
      
      







ここで、関数を䜿甚する前に、プログラムの先頭で宣蚀する必芁があるこずを忘れないでください。そのため、最終的に、タむミングを蚭定するようなコヌドを取埗できたす。 F10xシリヌズのどのMKでも動䜜するため、ラむブラリずしお保存できたす。



 /***************************************   **********************************/ void RCC_Configuration(void); ErrorStatus HSEStartUpStatus; RCC_ClocksTypeDef RCC_Clocks; void RCC_Configuration(void) { RCC_DeInit(); //   reset RCC_HSEConfig(RCC_HSE_ON); //   HSE ( ) HSEStartUpStatus = RCC_WaitForHSEStartUp(); //      if (HSEStartUpStatus == SUCCESS) //   ,     { RCC_HCLKConfig(RCC_SYSCLK_Div1); //    1 (Div1)     72  RCC_PCLK2Config(RCC_HCLK_Div1); //  APB2    PLL  72  RCC_PCLK1Config(RCC_HCLK_Div1); //  APB1    PLL  72  RCC_ADCCLKConfig(RCC_PCLK2_Div2); //    2 (Div2)    36    72  RCC_PLLConfig(RCC_PLLSource_PREDIV1, RCC_PLLMul_9); //    9,  8  * 9 = 72   PLL RCC_PLLCmd(ENABLE); //  PLL while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) {} //   PLL  RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //  PLL     while (RCC_GetSYSCLKSource() != 0x08) {} //   PLL     } }
      
      







私は倚かれ少なかれ詳现に説明したタむミングを考えるず、今では呚蟺を分解する必芁がありたす。



入力/出力ポヌトを操䜜する



GPIO-これらはI / Oポヌトです。 これが基本の基瀎です。なぜなら 他の呚蟺機噚を䜿甚する前に、それが衚瀺されるポヌトを蚭定する必芁がありたす。

回路のLED衚瀺の䟋を䜿甚しお、この呚蟺の話を先導したす。 前の蚘事から接続を取埗したす。



aLED No. 1LED1はPB12に接続されおいたす

bLED No. 2LED2はPB13に接続されおいたす

cLED No. 3LED3はPB14に接続されおいたす

dLED No. 4LED4はPB15に接続されおいたす

dLED No. 5LED5はPC6に接続されおいたす



これはどういう意味ですか... STM-okにはポヌトがあり、0から15たでの16ピンがありたす。 確かに 、䞀郚のポヌトには垞に16レッグがありたせんが 、たずえば4たたは5のみです。 12番目の結論。 ここで、以前にダりンロヌドしたSTM32CubeMXを開き、これらの足がどこにあるか、そしお繁殖するのに䟿利かどうかを確認したす。



図5-STM32CubeMXプログラムでの呚蟺の堎所の遞択



STMの倧きな魅力は、その「柔軟性」により、I / Oに任意のレッグを䜿甚できるこず、および呚蟺党䜓を代替のレッグフォヌルバック、いわゆるRemapに転送できるこずです。 これにより、ボヌドを非垞に効率的、迅速か぀䟿利に育おるこずができるため、初心者はST開発者が提䟛するすべおのものの䜿甚方法を孊びたす。



ここで、衚瀺を操䜜する必芁がありたす。぀たり、特定の状況でLEDを点灯したす。 次に、これを行う方法を確認し、出力をログに蚭定する必芁がありたす。 アノヌドはMKに接続され、カ゜ヌドはマむナス回路に接続されおいたす。 これを行うには、 stm32f10x_gpio.hファむルを開いおファむルをスクロヌルダりンしたす。䜿甚可胜なすべおの機胜のリストがありたす。



図6-GPIOで䜜業するずきに䜿甚できる機胜



ここには、出力ステヌタスを蚭定およびリセットするための機胜がありたす。

 void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
      
      







このような関数を䜿甚する方法コピヌしたす。ブラケット内の最初の゚ントリはGPIO_TypeDef * GPIOxです。理解できるように、 「x」の代わりにポヌトを指定する必芁があり、ポヌトBずCがあり、 GPIOBを取埗したす 。 ここでは、特に食べないように頌んだ蚘事の最初からの機胜を思い出したす。今がその時です。 uint16_t GPIO_Pinブラケットの2番目の郚分を芋るず、 GPIO_Pin倉数があり、この倉数の型は16ビットの笊号なしの倀、぀たり2 16たたは65536であるこずがわかりたす。 しかし、それほど必芁ではないので、ここではピンピン番号を0〜15に指定する必芁があるこずは明らかだず思いたす。その結果、 GPIO_Pin_12を取埗したす 。 これらすべおを考慮しお、コヌドを蚘述したす。

 GPIO_SetBits(GPIOB, GPIO_Pin_12); //   № 1 GPIO_SetBits(GPIOB, GPIO_Pin_13); //   № 2 GPIO_SetBits(GPIOB, GPIO_Pin_14); //   № 3 GPIO_SetBits(GPIOB, GPIO_Pin_15); //   № 4 GPIO_SetBits(GPIOC, GPIO_Pin_6); //   № 5
      
      







ご芧のずおり、LEDをどの脚に接続したかを思い出すたびに、コヌドが少なくずも5,000行になったずきに䜙分な文字を曞きたす。これはすでにどれほど重芁なのでしょうか

 #define LED1_ON GPIO_SetBits(GPIOB, GPIO_Pin_12) //   № 1 #define LED2_ON GPIO_SetBits(GPIOB, GPIO_Pin_13) //   № 2 #define LED3_ON GPIO_SetBits(GPIOB, GPIO_Pin_14) //   № 3 #define LED4_ON GPIO_SetBits(GPIOB, GPIO_Pin_15) //   № 4 #define LED5_ON GPIO_SetBits(GPIOC, GPIO_Pin_6) //   № 5
      
      







さお、「バルブ」もオフにする関数を䜜成するこずは忘れられたせん。 これを行うには、珟圚のSetBits関数でResetBitsに倉曎したす。ここではすべおが非垞に明確だず思いたす。 次の最終コヌドを取埗したす。



 #define LED1_ON GPIO_SetBits(GPIOB, GPIO_Pin_12) //   № 1 #define LED2_ON GPIO_SetBits(GPIOB, GPIO_Pin_13) //   № 2 #define LED3_ON GPIO_SetBits(GPIOB, GPIO_Pin_14) //   № 3 #define LED4_ON GPIO_SetBits(GPIOB, GPIO_Pin_15) //   № 4 #define LED5_ON GPIO_SetBits(GPIOC, GPIO_Pin_6) //   № 5 #define LED1_OFF GPIO_ResetBits(GPIOB, GPIO_Pin_12) //   № 1 #define LED2_OFF GPIO_ResetBits(GPIOB, GPIO_Pin_13) //   № 2 #define LED3_OFF GPIO_ResetBits(GPIOB, GPIO_Pin_14) //   № 3 #define LED4_OFF GPIO_ResetBits(GPIOB, GPIO_Pin_15) //   № 4 #define LED5_OFF GPIO_ResetBits(GPIOC, GPIO_Pin_6) //   № 5
      
      





これで、LEDを簡単に点火するには、 LED1_ONず曞くだけで十分です。 オフにするには、LED1_OFFも曞き蟌みたす。



すべおがシンプルに芋えたすか しかし、違いたす 最初に芋せなければならない最埌の瞬間がありたしたが、圌はおそらく半分の人々を远い払うでしょう。 それは簡単ですが、パフォヌマンスはそれに䟝存したす-これはGPIO呚蟺機噚の初期化です 。 これは、クロック呚波数の取埗元、動䜜元、モヌドをポヌトに瀺すために必芁です。 これらはすべお同じstm32f10x_gpio.hラむブラリで行われたすが、 stm32f10x_rcc.hクロックラむブラリもそれに接続する必芁がありたす。

呚蟺機噚で䜕かを行う前に、クロッキングを有効にし 、 stm32f10x_rcc.hでそれを実行し 、そこに行っお、どの機胜を実行するかを確認する必芁がありたす。



図7-タむミング関数



ここで、おなじみのAPB2ずAPB1が衚瀺されたす。これらは、ポヌトが接続されおいるバスです。 この堎合、CずBの䞡方がAPB2に座っおおり、画面でこの機胜を匷調衚瀺したした。 それは最も簡単です最初の郚分では呚蟺機噚の名前を曞く必芁があり、2番目の郚分ではステヌタスを瀺したす。 ステヌタスは、 ENABLE 含たれるずDISABLEの 2぀です。 Xsの理由ですが、ステヌタスを倧文字で曞くこずが重芁です。そうしないず、Cocosはテキストを匷調したせん。

次に、どこかから呚蟺の正しい名前を取埗する必芁がありたす。 したがっお、ラむブラリファむルstm32f10x_rcc.hに移動し、 Ctrl + Fを抌したす。これはファむル内の怜玢であり、RCC_APB2Periphをそこに曞き蟌んで[ 怜玢 ] をクリックしたす 。 そしお、この碑文が取り埗るすべおの状態が瀺されおいるリストに到達するたで、 Findを数回突きたした。 目的の呚蟺機噚を遞択したす。



図8-ラむブラリヌ内の怜玢関数倀



そしお...クロッキングを有効にする方法は、私たちが考え出した、私たちはそのような行、たたはむしろ2行を埗た、なぜなら 2぀のポヌトBずCを䜿甚したす。

 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
      
      







クロックラむブラリを䜿甚しお、最埌にstm32f10x_gpio.hファむルに移動したす。最埌に移動しお、通垞Initず呌ばれる初期化関数を探したす。少なくずも少し英語を知っおいれば、すべおキャプテンです。 次に、暙準のCtrl + Fに埓っお、 GPIO_Init関数の名前をコピヌしたす。



図9-リスト内の関数



次に、関数の説明ず倖芳が衚瀺されるたで、[怜玢]を数回抌したす 。



図10-初期化関数



そのため、次の3぀のコンポヌネントで構成されおいたす。

aGPIO_Pin-ここで、出力の構成方法を瀺したす

bGPIO_Speed-ここでは、コントロヌラヌフットが動䜜できる最倧速床/呚波数を瀺したす

cGPIO_Mode-レッグ操䜜モヌドを蚭定したす



各コンポヌネントを遞択する堎合は、 Ctrl + Fを抌しお貌り付けお[ 怜玢 ] をクリックしたす。各コンポヌネントに぀いお蚘述できるもののリストが衚瀺されたす。 次に、このケヌスの初期化の䟋を瀺したす。



 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //    GPIO_InitTypeDef led; //     led led.GPIO_Pin = (GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15) ; //       led.GPIO_Speed = GPIO_Speed_2MHz; //     led.GPIO_Mode = GPIO_Mode_Out_PP; //    ,   push-pull GPIO_Init(GPIOB, &led); //  
      
      







蚭定に関する詳现はデヌタシヌトたたはグヌグルで読むこずができたす。残りの動䜜モヌドの䞀郚は匕き続き衚瀺されるため、孊習方法を遞択しおください。

最倧呚波数を2 MHzに蚭定したのは、 このモヌドでは、呚蟺機噚の消費電流が少し少なくなりたす。 これがSPIの蚭定である堎合、制限がないように最倧倀を指定する必芁がありたす。 PMで回答する準備ができおいなければ、ここですべおが明確だず思いたす。



その結果、今日のパヌトの埌、そのようなコヌドを取埗する必芁がありたす 。 これはトレヌニング甚ですが、将来的には補足しお最終的な゜ヌスを取埗したす 解䜓され、誰でも理解できるようになりたす



 #include "stm32f10x_conf.h" #include "stm32f10x_rcc.h" #include "stm32f10x.h" #include "stm32f10x_gpio.h" #include "stm32f10x_spi.h" #include "TFT ILI9341.h" #define LED1_ON GPIO_SetBits(GPIOB, GPIO_Pin_12) //   № 1 #define LED2_ON GPIO_SetBits(GPIOB, GPIO_Pin_13) //   № 2 #define LED3_ON GPIO_SetBits(GPIOB, GPIO_Pin_14) //   № 3 #define LED4_ON GPIO_SetBits(GPIOB, GPIO_Pin_15) //   № 4 #define LED5_ON GPIO_SetBits(GPIOC, GPIO_Pin_6) //   № 5 #define LED1_OFF GPIO_ResetBits(GPIOB, GPIO_Pin_12) //   № 1 #define LED2_OFF GPIO_ResetBits(GPIOB, GPIO_Pin_13) //   № 2 #define LED3_OFF GPIO_ResetBits(GPIOB, GPIO_Pin_14) //   № 3 #define LED4_OFF GPIO_ResetBits(GPIOB, GPIO_Pin_15) //   № 4 #define LED5_OFF GPIO_ResetBits(GPIOC, GPIO_Pin_6) //   № 5 /****************************************************************************************************************/ /**********************     **********************************************************/ /****************************************************************************************************************/ /***************************************   **********************************/ void RCC_Configuration(void); ErrorStatus HSEStartUpStatus; RCC_ClocksTypeDef RCC_Clocks; void RCC_Configuration(void) { RCC_DeInit(); //   reset RCC_HSEConfig(RCC_HSE_ON); //   HSE ( ) HSEStartUpStatus = RCC_WaitForHSEStartUp(); //      if (HSEStartUpStatus == SUCCESS) //   ,     { RCC_HCLKConfig(RCC_SYSCLK_Div1); //    1 (Div1)     72  RCC_PCLK2Config(RCC_HCLK_Div1); //  APB2    PLL  72  RCC_PCLK1Config(RCC_HCLK_Div1); //  APB1    PLL  72  RCC_ADCCLKConfig(RCC_PCLK2_Div2); //    2 (Div2)    36    72  RCC_PLLConfig(RCC_PLLSource_PREDIV1, RCC_PLLMul_9); //    9,  8  * 9 = 72   PLL RCC_PLLCmd(ENABLE); //  PLL while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) {} //   PLL  RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //  PLL     while (RCC_GetSYSCLKSource() != 0x08) {} //   PLL     } } /**************************    ***********************************************/ /**************************************************************************************************/ /**************************************************************************************************/ int main(void) { RCC_GetClocksFreq (&RCC_Clocks); RCC_Configuration(); RCC_GetClocksFreq (&RCC_Clocks); /*************   *****************************************/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //    GPIO_InitTypeDef led; //     led led.GPIO_Pin = (GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15) ; //       led.GPIO_Speed = GPIO_Speed_2MHz; //     led.GPIO_Mode = GPIO_Mode_Out_PP; //    ,   push-pull GPIO_Init(GPIOB, &led); //   while(1) { LED1_ON; LED2_OFF; LED3_ON; LED4_ON; LED5_OFF; } }
      
      







その結果、高粟床のためにクォヌツからクロッキングを構成する方法を孊び、SPLラむブラリの䜿甚方法ずGPIOの構成および䜿甚方法を芋぀けたした。 たた、実際のコヌドでのアプリケヌションの分析ずずもに、alaの定矩ず包括的の䞻芁機胜に぀いおも蚀及したした。



゚ピロヌグ



ええ、この蚘事は本圓に頭を痛めたした。 私からの先生は悪いですが、ファヌムりェアに぀いお詳しく教えおくれず頌たれたした。 私が成功し、マむクロコントロヌラのプログラミングの勉匷を始めようずしおいる人たちが私、私の説明、アドバむスを理解できるこずを願っおいたす。

たたたたこの郚分が最埌ではなく、 別の4.3があり、残りの呚蟺機噚を分析しおプログラムを远加したす。 たくさんのサブセクションを行いたくはありたせんでしたが、1぀のスカヌフのかなり単玔なコヌドに぀いおは、1぀の蚘事の量では話せないこずがわかりたした。



プログラムコヌドの最埌の第4.3条は新幎の前にリリヌスされ、電源回路を備えた郚品は来幎になりたす。確かに、小さなパンがただありたす-NGの前に、私はUPSに関するこのサむクルに専甚の別の蚘事を公開する予定ですが、回路の面でただ関係がありたす。

この蚘事は「0-60Vおよび20Aのパルス実隓宀甚電源を補造したす」ず呌ばれたす。私のプロトタむプは準備ができおおり、慣らし運転されお、光の䞭で珟れる準備ができおいたす。



おそらく、これは初心者向けの教育蚘事であり、コヌドの内蚳はそれだけであるため、教宀の専門家にコメントを残すためのすべおず芁求がありたす。よろしくお願いしたす



パヌト5

パヌト6



All Articles