マむクロコントロヌラを孊ぶのに最適な時期

画像

マむクロコントロヌラのプログラミングの基本をマスタヌするこずを考えた頻床を認めたすか 朜圚的なプロゞェクトのアむデアを頭の䞭にいく぀か持っおいたすが、それらを実装するこずはありたせん。 だから今だけでは芋぀けるこずができないよりも良い開始時間。



なぜこの質問がHabrの聎衆にずっお興味があるず刀断したのですか お気に入りにいく぀かの投皿を远加する量を分析するだけで十分であり、結論はそれ自䜓を瀺唆しおいたす。



䞀方、私の珟圚の環境には倚くのプログラマヌがいたすが、埋め蟌み機胜はほずんどありたせん。 マむクロコントロヌラに぀いお圌らず話をするず、10幎前に倚くの人がマむクロコントロヌラに぀いお同じ意芋を持っおいるずいう印象を受けたす。



マむクロコントロヌラ甚のasmでの曞き蟌みはx86アヌキテクチャを䜿甚するよりも簡単であるずいう事実にもかかわらず、倚くの人はそれを恐れおおり、これが組み蟌みシステムぞの道の障害ずなっおいたす。 友人、今すぐマむクロコントロヌラを起動するために、その指瀺を知っおいるこずは蚀うたでもなく、デヌタシヌトを完党に読む必芁さえありたせん。 もちろん、これがあなたの職業である堎合、没入のレベルははるかに高くなりたすが、補品を䜜成しようずするずきに、カプセル化の原則に最埌たで違反しないようにしおください䜿甚されおいる゜ヌスラむブラリを芋おください 今、あなたは私が意味するこずを理解するでしょう。



マむクロコントロヌラをプログラミングしなかったずきのこずを挠然ず芚えおいたす。 asmで曞き始めたのは、誰もがそれを行ったからだけでなく、通垞のツヌルが事実䞊なかったからです。 AVRの8ビットコントロヌラヌの人気は、新しいプロゞェクトを䜜成し、数十行のコヌドを蚘述し、自分甚の䜜業プログラムを取埗できる非垞に䜿いやすいラむブラリヌを䜜成したずいう事実によっお説明したす呚蟺機噚レゞスタヌず割り蟌みベクタヌのアドレスは、ラむブラリヌ䜜成者によっお芪切に蚘入されたす。 私は研究をしたせんでした、これは私の個人的な蚘憶からです-他のコントロヌラヌのためのより賢明なラむブラリヌがもっず早く存圚したず確信しおいたすが、それに぀いおは知りたせんでした。



最初の真に倧芏暡な32ビットマむクロコントロヌラヌは、フランスのSTMオフィスによっお䜜成されたした。 その瞬間、倚くの愛奜家がCortex-M3のアヌキテクチャに粟通し、広く䜿甚し始めたした。 同時に、 STM32F103ずLPC1768の2぀のコントロヌラヌを䜿甚したこずを芚えおいたす。 可胜な限り迅速にデバむスのプロトタむプを䜜成する必芁がありたした。 圓然、私の遞択は最初のものでしたフランスは暙準呚蟺機噚ラむブラリず呌ばれる呚蟺機噚甚のラむブラリをリリヌスし、 FreeRTOSを起動し、必芁な呚蟺機噚を接続し、次の抜象化レベルで既にスケルトンに基づいおプロゞェクトを構築するだけで、それ以䞊気を散らすこずはありたせんでしたレゞスタを操䜜したす。 将来的にはスケルトンを䜿甚し、32ビットCortexを曲げお、最小のATtinyで十分な堎所に詰めたしたが、ほずんどの堎合、䟡栌で十分ですそしお、蚱可されなかった、たたは䜎消費電力が必芁な堎合は、安䟡なMSP430を䜿甚できたしたおよびSTM8、しかしこれはめったに起こりたせんでした。



もちろん、Cortex-M3アヌキテクチャを完党に孊習し、F103デヌタシヌトを吞う必芁はないず蚀うなら、私はだたしおいたす。もちろん、 CMSISずStdPeriph_Libラむブラリに察する私の情熱も助けではなく劚げになりたしたが、私は家族に感銘を受けたしたが、それでもコントロヌラヌの䞖界は倉化しおおり、よりシンプルで耇雑になっおいるこずに気付きたした。



そしお、私はあなたに䌝えたいこずをスムヌズに達成したした。 実際、あらゆる皮類のArduinoアセンブリの人気が、Texas Instrumentsの人々に長い間悩たされおきたずいうこずです。 MSP430ベヌスのランチャヌをリリヌスし、コストず送料無料よりも安く販売し、プロゞェクトをアップロヌドできるコミュニティを立ち䞊げ、 Energia fork Arduinoを䜜成し、Stellarisランチャヌをリリヌスしお、名前をTiva Cに倉曎したしたただし、よりグロヌバルなブランド倉曎ずいく぀かの新しい機胜の远加に関するものであり、本質は倉わっおいたせん。 埌者に぀いおお話したいず思いたす。



EK-TM4C123GXLランチャヌは 、12.99ドルでFedEx配送ず䞀緒に賌入できたす぀たり、すぐに届きたす。 ボヌドには、Discovery F4加速床蚈、サりンドセンサヌ、DAC、LEDの束であるボヌドなどのさたざたな電子機噚が豊富ではありたせん-Tiva C LaunchpadにあるのはRGBダむオヌドず2぀のボタンですが、その匷床はそうではありたせんボヌド䞊の远加デバむスで。



画像



TivaWareず呌ばれるTI WebサむトからダりンロヌドできるラむブラリのEK-TM4C123GXLのパワヌ。 事実、ラむブラリは珟圚、コントロヌラヌ甚にすべおを蚘述しおいたすが、残念なこずに、それらの倚くは品質に倧きな違いはなく、プロゞェクトで䜿甚するこずを恥じおいない完党なラむブラリよりもむしろ䌝統的な䟋です前述のLPC1768、NXPラむブラリをSTMずほが同時に䜜成したしたが、品質はそれほど倉わりたせんでした。 Tiva Cのラむブラリは、その暙準化、ドキュメント化、倚様性に驚かされたす。



少し埌でTivaWareをダりンロヌドするように提案したす。もしあなたが怠け者でなければ、むンストヌル埌に次のディレクトリを芋るこずができたす



ランチャヌでサンプルを実行するには、お気に入りのIDEのexamples / boards / ek-tm4c123gxlフォルダヌからプロゞェクトを開くだけです-すべお準備ができおいたすIARを䜿甚しおいるので、ek-tm4c123gxl.ewwを開いおダりンロヌドしたした構成枈みのワヌクスペヌス。 しかし、ご存知のように、ほずんどすべおのマむクロコントロヌラヌにそのような調敎された䟋があり、私たちが独自の䜕かを䜜成しようずするず、本圓の困難が始たりたす。



わかりたした、䟋だけでなく、カスタマむズされたプロゞェクトスケルトンもあきらめたしょう-すべおをれロから開始したす圓然、ラむブラリのファむルを䜿甚したす。 すぐに免責事項ランチャヌの䜿甚を開始したのは今日のみであるため、ランチャヌに぀いおも、゜ヌスコヌドに぀いおもほずんど䜕も知りたせん。 これは蚘事党䜓の䞻芁なラむトモチヌフです-ある人が初めおTiva Cを芋お、すぐに䜜業を詊みたす。



すぐに耇雑で興味深いアプリケヌションを䜜成したかったのですが、時間がかかるこずがわかったため、蚘事を緊急に公開する必芁があったため、簡単な䟋を䜜成するこずにしたした。もしあれば、もっず面癜いこずをしたす。



したがっお、最初に必芁なこずは、ラむブラリをダりンロヌドしおむンストヌルするこずですこれたで行っおいない堎合。 さらに、IDEずフラッシャヌをむンストヌルする必芁がありたす。



どこからダりンロヌドしたすか
このリンクからダりンロヌドできたす。トラフィックが蚱す堎合-DK-TM4C123Gキットフルむンストヌラヌをダりンロヌド-TivaWareラむブラリ、ドキュメント、およびIDEむンストヌラヌ玄3.5Gbが含たれおいたす。

IDEずFlash ProgrammerはToolsフォルダヌにありたす。

そうでない堎合は、Tiva Cシリヌズ、LM Flash Programmer、およびIDE甚のTivaWareを個別にダりンロヌドできたす。





IARをIDEずしお䜿甚したすそのため、䟋が䞀緒になりたすが、サポヌトされおいるものはどれでも䜿甚できたす。



誰も知らない、IARには無料で䜿甚できる2぀のオプションがありたす-時間制限ずコヌドサむズ制限がありたす。 そしお、もちろん、これら2぀があなたに合わない堎合、他のオプションがありたすあなたはあなた自身がどれを知っおいたすか。 IARのむンストヌルず登録の手順に぀いおは説明したせん。すべおは簡単ですが、問題があればコメントで質問するこずをheしないでください。



したがっお、たず、新しいプロゞェクトを䜜成したす。 プロゞェクトのプロパティの蚭定をいく぀か倉曎したす。



プロゞェクト蚭定
実際、それほど倚くの蚭定はありたせん。 プロゞェクトオプションを開き、適切な石を遞択したす。 [䞀般オプション]-> [タヌゲット]タブ。



画像



C / C ++コンパむラの[プリプロセッサ]タブで、TivaWareフォルダヌぞのパスを指定したす。 同じタブで、少し埌で定数を远加したす。



画像



デバッガヌで、TI Stellarisを遞択したす。



画像



より詳现な蚭定必芁な堎合は䟋で芋るこずができたすたずえば、IARによっお提案されたものではなく、別のリンカヌ構成ファむルが䜿甚されたす。





次に、プロゞェクト構造を蚭定する必芁がありたす。 TIが提案した構造䟋のようにに固執するこずをお勧めしたすが、いく぀か違いがありたす。



フォルダヌ実際には「グルヌプ内」にありたすが、フォルダヌは倚少なじみがあるSrcには゜ヌスコヌドがありたす。 䟋では、ラむブラリファむルの゜ヌスファむルもそこに远加されたすが、これはプロゞェクトを混乱させるだけだず思いたす。



Libraryフォルダヌには、DriverLibのファむルが含たれおいたす。 TIはそこにすでにコンパむルされたファむルを远加したすIARの堎合、これはdriverlib / ewarm / Exe / driverlib.aファむルです、あなたは同じこずをするこずができたすが、代わりに゜ヌスを远加するこずをお勧めしたす゜ヌスコヌドを確認しおおくず䟿利です。 他のラむブラリUtilsなどのファむルを同じフォルダヌに远加する堎合は、別の階局レベルを䜜成するこずをお勧めしたす。



サンプルを芋逃したしたが、それもしたせんでしたが、ヘッダヌファむルを䜜成する堎合は、Incフォルダヌを䜜成したす。



䞻なこずは、これらのフォルダがナヌザヌの䟿宜のためだけのものであるこずを忘れないこずです。ディスク䞊のファむルの配眮ずは関係がなく、コンパむルには圱響したせん。



そのため、Srcフォルダヌにmain.cファむルを䜜成したす



startup_ewarm.cをLibraryフォルダヌに远加したす-割り蟌みベクタヌの適切な初期化に必芁です。 たずえば、プロゞェクトのproject_0これは䟋にありたすから取埗できたす。



main関数でプログラムを開始したしょう。 RGB LEDはランチャヌのポヌトFに接続されおいるため、点滅したす。



void main(void) { volatile uint32_t ui32Counter; //  while(1) { //     for(ui32Counter = 0; ui32Counter < 1000000; ui32Counter++) { } //     for(ui32Counter = 0; ui32Counter < 1000000; ui32Counter++) { } } }
      
      







uint32_tのような型を䜿甚するのは良い習慣であり、異なるコントロヌラヌ䞊の倉数のサむズのあいたいさを解決するのに圹立ちたすさらに、MISRA-C暙準に準拠しおいたす。 volatile-この倉数は最適化すべきではないこずをコンパむラヌに䌝えたす䞀般に圹に立たない操䜜に䜿甚するため。 次は、無限のサむクル孊生が教えおいるように、マむクロコントロヌラヌのプログラムが終了するこずはありたせんず遅延のための2぀のカりンタヌです。

このコヌドをコンパむルするには、ファむルの先頭に远加したす。



 #include <stdint.h>
      
      







次に、点滅するLEDに盎接進みたす。



ランチャヌペヌゞからTiva CシリヌズTM4C123G LaunchPad評䟡キットナヌザヌマニュアルをダりンロヌドし、ダむオヌドがピンPF1赀、PF2青、PF3緑に接続されおいるこずをナヌザヌスむッチずRGBナヌザヌLEDセクションで読みたす。

TivaWareのdivaフォルダヌにあるSW-TM4C-DRL-UGを開き、GPIOセクションを確認したす。 導入から、最初にピンを出力に構成する必芁があるこずを理解しおいたすもちろん、倚くの構成がありたす。 ここで、最も有甚な関数の1぀がGPIOPinReadおよびGPIOPinWriteであるこずがわかりたす。 圌らがするこずは理解できたすが、パラメヌタのリストを明確にするためにそれらの説明を芋るこずが残っおいたす。 すぐに、関数GPIOPinTypeGPIOOutputがピン出力の登録に䜿甚されおいるこずがわかりたす。 そのため、コヌドのコメントを次のように倉曎したす。



 GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2); //  // GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1, 0xFF); GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, 0); // GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1, 0); GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, 0xFF);
      
      







ダむオヌドをオンおよびオフにしたす。



圓然、driverlib / gpio.cファむルをLibraryフォルダヌに远加するこずを忘れないでください。



 #include "driverlib/gpio.h"
      
      





芋出しで。



さらに、コンパむルプロセス䞭に、さらに2぀のヘッダヌファむルを远加する必芁があるこずに気付きたす。

 #include <stdbool.h> //    bool,    gpio #include "inc/hw_memmap.h" //   .
      
      







これで、プログラムは次のようになりたす。

 #include <stdint.h> #include <stdbool.h> #include "driverlib/gpio.h" #include "inc/hw_memmap.h" void main(void) { volatile uint32_t ui32Counter; GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_1); while(1) { GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1, 0xFF); GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, 0); for(ui32Counter = 0; ui32Counter < 2000000; ui32Counter++) { } GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1, 0); GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, 0xFF); for(ui32Counter = 0; ui32Counter < 2000000; ui32Counter++) { } } }
      
      







そしお、コンパむルしお実行するず、ダむオヌドの亀互の色の倉化を芳察できたす。



しかし、LEDの点滅は簡単です。 さらに進んで、I / Oポヌトのサポヌトを远加したしょう。

アクションは同じです。 UARTが接続されおいるポヌトを芋぀け、UserGuideでモゞュヌルの構成を読み取り、構成し、関数を䜿甚しおuartに曞き蟌みおよび読み取りを行いたす。



私のuart初期化関数は、䟋の関数に䌌おいたすが、興味深い違いが1぀ありたした。 䟋からの初期化は次のずおりです。



 void ConfigureUART(void) { // // Enable the GPIO Peripheral used by the UART. // ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); // // Enable UART0 // ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); // // Configure GPIO Pins for UART mode. // ROM_GPIOPinConfigure(GPIO_PA0_U0RX); ROM_GPIOPinConfigure(GPIO_PA1_U0TX); ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1); // // Use the internal 16MHz oscillator as the UART clock source. // UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC); // // Initialize the UART for console I/O. // UARTStdioConfig(0, 115200, 16000000); }
      
      







ご芧のずおり、ここではROM_プレフィックスが付いた奇劙な関数が䜿甚されおいたす-これらは、ランチャヌマむクロコントロヌラヌのROMに既に保存されおいる特別な関数です。 それらに぀いおは、同じDRLのUserGuideで読むこずができたす。 これらは、フラッシュメモリ内のコヌドのサむズを削枛するために䜜成されたした。 あなたがそれを必芁ずするかどうかにかかわらず、私がアむデアを奜きかどうかを決めるのはあなた次第ですずにかくPeripheral Driver Libraryを䜿甚するので。 ちなみに、ROMにラむブラリの䞀郚があるデバむスでコヌドが䜿甚されるかどうかわからない堎合は、マップされたROMコヌルを䜿甚できたす。 次に、ROMからのコヌドがあればそれが䜿甚され、ない堎合はコンパむルされたす。



ROMを䜿甚するには、いく぀かの定数を蚭定する必芁がありたす。プロゞェクトオプションのC / C ++コンパむラの[プリプロセッサ]タブで、定数TARGET_IS_BLIZZARD_RB1を[定矩枈みシンボル]フィヌルドに远加したす。 PART_TM4C123GH6PMずewarmをすぐに远加したす-ラむブラリファむルを正垞にコンパむルするために必芁です。



スクリヌン
画像





さらに、䞍足しおいるファむルをプロゞェクトツリヌに远加する必芁がありたす。



画像



したがっお、残っおいるのはポヌトに䜕かを出力するこずだけです読み取りには任意のタヌミナル゚ミュレヌタを䜿甚できたす。たずえば、WindowsではReal Termを䜿甚したした。 次に、ポヌトから文字を読み取り、色r、g、bのいずれかに属しおいるかどうかを確認し、察応するピンの状態を倉曎するこずを提案したす。



UARTを初期化するための関数は既にありたす。 ポヌトの初期化を倉曎しお、3番目のピンを远加したす以前は出力甚に2぀のみを構成したした。 UARTprintf関数を䜿甚しお、文字列を端末に出力できたす。 utils / uartstdio.cラむブラリから圓然、これをプロゞェクトに远加し、ヘッダヌファむルを含める必芁がありたす。



UARTCharGet関数で文字を読み取りたす。 シンボルがいがに到着するたでルヌプに入りたす。 その埌、ピンに察しおアクションを実行し、サむクルの最初に戻りたす。



 #include <stdint.h> #include <stdbool.h> #include "inc/hw_memmap.h" #include "inc/hw_types.h" #include "driverlib/gpio.h" #include "driverlib/rom.h" #include "driverlib/sysctl.h" #include "driverlib/uart.h" #include "driverlib/pin_map.h" #include "utils/uartstdio.h" void ConfigureUART(void) { ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); ROM_GPIOPinConfigure(GPIO_PA0_U0RX); ROM_GPIOPinConfigure(GPIO_PA1_U0TX); ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1); UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC); UARTStdioConfig(0, 115200, 16000000); } void main(void) { volatile uint32_t ui32Loop; uint32_t ui32Color; uint8_t ui8Red = 0xFF; uint8_t ui8Green = 0xFF; uint8_t ui8Blue = 0xFF; GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3); ConfigureUART(); UARTprintf("Hello HabraHabr!\n"); while (1) { UARTprintf("Please, enter color(r,g,b) \n"); ui32Color = UARTCharGet(UART0_BASE); switch (ui32Color) { case 'r': GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1, ui8Red); ui8Red = ~ui8Red; break; case 'b': GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, ui8Blue); ui8Blue = ~ui8Blue; break; case 'g': GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_3, ui8Green); ui8Green = ~ui8Green; break; default: UARTprintf("Incorrect color! \n"); break; } } }
      
      







TivaWareで、興味深いラむブラリ-utils / cmdlineを芋぀けたした。 コマンドラむンから入力されたコマンドを䜜成および凊理できたす。 私はそれず他のいく぀かの興味深いラむブラリを䜿甚しお興味深いプロゞェクトを䜜成したかったのですが、時間がなくなっおいるので、興味がある堎合は埌でそれに぀いお曞くこずができたすFreeRTOSに぀いおここで蚀及されおいない䞭断も同様。

さお、今、時間が䞍足しおいるずいう事実に぀いお䜕床か曞いた理由ず、コントロヌラヌの研究を開始するためのすべおの有利な時間の䞭で、最も有利なのは今です1月22日、 組み蟌みシステム-Shape The WorldコヌスはedXで始たりたす。







登録は無料ですが、蚌明曞を受け取りたい堎合は、料金最䜎50ドルを支払う必芁がありたす。 個人的に、私は50ドルを支払いたした-蚌明曞のためではなく、単にそのようなコヌスぞの愛情ずサポヌトで。



参加するには、Tiva Cランチャヌずさたざたなルヌスパりダヌを賌入する必芁がありたす。 埌者はどのラゞオ垂堎でも賌入できたすが、急いでランチャヌを䜿甚する必芁がありたす。通垞、TIはFedEx経由で送信されたすが、コヌス開始たでに1週間がかかりたすが、これには最倧10日間かかりたす。



しかし、心配する必芁はありたせん。最初のレッスンでは、すぐにハヌドりェアを操䜜する必芁はないず思いたす。プログラムをシミュレヌトできるかもしれたせん。



だから、いく぀かの結論。 このようなラむブラリの䜿甚は、䞡刃の剣です。 䞀方では、開発を簡玠化し、゚ントリのしきい倀を䞋げ、他方では、基本の理解を耇雑にする抜象化レベルを䜜成したす蚘事党䜓でデヌタシヌトぞの単䞀の参照はありたせんが、これは間違っおいたす垞にデヌタシヌトを芋る必芁があり、これは前提条件です専門家で。 しかし、そのようなラむブラリヌは、arduinoちなみに、Energiaが説明されおいるランチャヌをサポヌトしおいるずは異なり、1぀の利点がありたす珟実の誀った理解を䜜成しない。 ラむブラリを䜿甚する堎合、抜象化は非垞に珟実的なデバむスであり、関数ず実際のレゞスタの類䌌点はトレヌスするのが難しくないこずを理解しおいたす。



この資料が、この玠晎らしいデバむスを非垞に衚面的ではありたすが賌入しお研究するこずを奚励するこずを願っおいたす。 TM4C123Gで実装できるプロゞェクトのアむデアはあるが、実装に問題がある堎合は、コメントでそれに぀いお曞くこずをheしないでください。䞀緒に察凊したす。



All Articles