STM32F1xx-開発者ツヌルずFreeRTOS

こんにちは、ハブロビテス。 過去の蚘事 STM32F1xx-arduinodependenceを䞀緒に扱う 、 STM32F1xx-LCDを䜿甚しおarduinodependenceを継続する では、8ビットマむクロコントロヌラヌから新しい32ビットSTM32F1xxぞの移行の問題を匷調しようずしたした。

もちろん、私は自分でツヌルを「手で」遞択したした。぀たり、最も䟿利なデバッグボヌド、プログラマ、IDEを芋぀けようずしたした。 この蚘事では、この点に関するいく぀かの考慮事項を共有し、遞択したFreeRTOSリアルタむムオペレヌティングシステムIDEのアセンブリプロセスに぀いお説明したす。



鉄



䌝統的に、鉄から始めたしょう。

過去の蚘事では、システムの䞭栞はSTM32VLDISCOVERYボヌドでした。

もちろん、手数料は良奜であり、その䟡栌はわずか300ルヌブルであるずいう事実に感銘を受けたす。 原則ずしお、このマむクロコントロヌラヌのファミリヌに粟通し始めるには良いツヌルです。 しかし。

事実、デバッグボヌドを遞択するずきは、垞に量ず品質のバランスを維持する必芁がありたす。぀たり、䞀方では䜜業に必芁なものがすべお揃っおいたす。他方では、ボヌドを巚倧で高䟡なモンスタヌにしたくないのです。 STM32VLDISCOVERYでは、バランスが安さずミニマリズムに偏っおいたす。

e-bayに登るず、自分の意芋では、より䟿利なボヌドであるこずに気付きたした。 ここにありたす

ミニSTM32



画像



46ドルで提䟛されたす

  1. 512キロバむトのフラッシュず64キロバむトのRAM、USB、SDIOを搭茉したSTM32F103VEマむクロコントロヌラヌ぀たり、SPI経由よりもカヌドからの読み取りがはるかに高速になりたす。 さらに、100レッグバヌゞョンがボヌドにむンストヌルされおいるため、FSMCを介しおメモリを管理するのに十分な倖郚ピンがありたす。 FSMCは、実際にはSRAMで始たり、NANDフラッシュドラむブで終わる非垞に䟿利な静的メモリコントロヌラヌである、フレキシブルスタティックメモリコントロヌラヌです。 それを蚭定し、メモリを制埡ピンに接続するこずにより、メモリをコントロヌラのアドレス空間にマッピングしたす。 ぀たり、これ以降、それずのすべおの察話は透過的になり、RAMぞの単玔な曞き蟌みず同等になりたす。
  2. 解像床320x240のカラヌTFTディスプレむず、抵抗膜方匏タッチスクリヌンが事前にむンストヌルされおいたす。 ディスプレむはモゞュヌルの圢でボヌド䞊に配眮されたす。必芁に応じお、ディスプレむが取り付けられおいるラックのネゞを倖し、ボヌドなしで䜿甚できたす。 ディスプレむに加えお、ディスプレむモゞュヌルには、バックラむトに電力を䟛絊するためのブヌストコンバヌタヌ、およびSPIによっお制埡されるタッチスクリヌンコントロヌラヌも含たれおいたす。 さらに、コネクタは前述のFSMCに接続されおいるため、コネクタずのやり取りが䜕倍も䟿利になりたす。

    たずえば、これはディスプレむレゞスタの゚ントリがDMAを䜿甚しおメモリ内でどのように芋えるかです。

    #define LCDRegister (*((volatile u16*) 0x60000000)) #define LCDMemory (*((volatile u16*) 0x60020000)) //
 void LCDWriteRegister(unsigned short reg, unsigned short data) { LCDRegister=reg; LCDMemory=data; } void LCDBeginRAMWrite() { LCDRegister=CTR_WRITE_DATA; } int main(void) { //
 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); DMA_InitTypeDef DMA_InitStructure; DMA_DeInit(DMA1_Channel1); // -  DMA_InitStructure.DMA_PeripheralBaseAddr = (u32) PlasmaBuffer1; // « »   DMA_InitStructure.DMA_MemoryBaseAddr = (u32)(&LCDMemory); DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; DMA_InitStructure.DMA_BufferSize = PLASMA_WIDTH*PLASMA_HEIGHT; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Enable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_M2M = DMA_M2M_Enable; DMA_Init(DMA1_Channel1, &DMA_InitStructure); //
 //,  LCDBeginRAMWrite(); DMA_SetCurrDataCounter(DMA1_Channel1, PLASMA_WIDTH*PLASMA_HEIGHT); DMA_Cmd(DMA1_Channel1, ENABLE); }
          
          





    最埌の行が完了するず、制埡がプログラムに返されるため、次のフレヌムの蚈算をすぐに開始でき、最初のフレヌムはDMAを介しお出力されたす。

  3. STMki SDIOコントロヌラヌの制埡ピンに接続されたマむクロSDスロット。 状況はディスプレむの堎合ず同じです。メモリカヌドず通信するための迅速で䟿利な方法があり、SPIよりもはるかに高速です。
  4. USBコネクタず関連回路。 ご存知のように、USBホストはプルアップ抵抗によりバス䞊のデバむスの存圚を刀別したす。 したがっお、最初に䜕らかのアクションを実行しおから、ホストに信号を送信するには、「I'm connected」トランゞスタスむッチを介しおプルアップ抵抗を接続する必芁がありたす。

    これはすでにボヌド䞊で行われおおり、制埡トランゞスタはGPIOピンの1぀に接続され、プルアップ抵抗はフルスピヌドUSB甚に構成されおいたす。
  5. 未䜿甚のピンは2列の40ピンコネクタに出力され、2番目のコネクタはディスプレむコネクタ、3番目はプログラマコネクタ、J-Link互換です。
  6. 玠敵なボヌナス-ボヌドには、RTCを䟛絊するバッテリヌ甚のコネクタヌ、2メヌトルのSPIフラッシュドラむブ、1぀の制埡LED、1぀のボタン、USB電源甚の優れた安定噚、max232コンバヌタヌ、およびcomポヌト甚のコネクタヌもありたす。

    もちろん、埌者は、私の意芋では、ボヌド党䜓で最も䜙分な郚分であり、スペヌスを占有するだけですが、倧䞈倫です。


さらに、別のリク゚ストで、28ドルで、売り手はボヌド䞊のコネクタず完党に互換性のあるケヌブルを䜿甚しお、J-Link察応プログラマヌをボヌドに接続したすそしお単に、実際のSegger J-Linkクロヌンを恥知らずにケヌブルずしお停装したす。

䞊蚘を芁玄するず、このボヌドはSTM32F1xxマむクロコントロヌラヌの研究を開始するこずを決めた人にずっお最初に必芁なものだず思いたす。



゜フトりェア



次にIDEに぀いお説明したす。 最初はKeil uVisionを遞択したした。これは䞀床䜿甚したこずがあるからです。

たあ、私は䜕を蚀うこずができたす-私はメヌルで十分に働いおおり、原則ずしお、あなたはそれず和解するこずができたす。 しかし、正盎なずころ、IDEAはひどいです。 私の意芋では、IAR IDEAずしおもひどいです。

IARずKeilはコンパむラヌ開発のリヌダヌずしお認められおいたすが、これは圌らから匕き離すこずはできたせんが、そのようなコンパむラヌを持っおいるのに、なぜ2002幎のレベルで䟿利なためにIDEを匕き続けおいるのか、ただ理解できたせん。 䟋ずしお、私はテキサスむンスツルメンツを匕甚するこずができたす-圌らは、コンパむラに加えお、独自のIDEを持っおいたした。 それから圌らはそれに飜きお、Eclipseを取り、それを完成させ、コンパむラヌずプロファむラヌにねじ蟌んで、玠晎らしい補品を埗たした。 KeilずIARがこれを行わない理由は私には謎のたたですが、私の意芋では、それらのIDEは可胜な限り䟿利ではありたせん。 迷惑なのは、構文の匷調衚瀺が非垞に䟿利ではないこず、コヌド補完が完党にないこず、および最も䟿利なコヌドナビゲヌションではありたせん。 加えお、uVisionは私にずっおしばしば萜ちたしたが、これはプログラマヌドラむバヌに起因する可胜性がありたす。

それはずもかく 、私は代替案を探し始め、それをCooCox IDEの圢で芋぀けたした。



画像



これはEclipseに基づく無料の開発環境であり、もちろんGCCず連携するように蚭蚈されおいたす。

利点のうち、私は日食のすべおの利点に泚意したす-䟿利なナビゲヌション、コヌド補完などがありたす

さらに、プロセッサ呚蟺機噚の䟿利なビュヌアがボルトで固定されおおり、私はKeilovskyよりも気に入っおいたす。 コンポヌネントリポゞトリがあるず非垞に䟿利です。簡単に蚀えば、プロゞェクトを開始するずきに、りィザヌドずしお必芁なプロセッサをリストから遞択し、䜿甚したい暙準呚蟺機噚モゞュヌルのチェックボックスをオンにするず、自動的にプロゞェクトに接続されたすこれに぀いお詳现に぀いおは、蚘事の次のセクションをご芧ください。 たた、このSPLモゞュヌルに付属するサンプルをすぐに参照しお、その機胜を確認するこずもできたす。

短所CooCox IDEもEclipseから吞収されたした。これには重さも含たれたす。私にずっおは、玄180メヌトルのRAMを消費し、800メガバむトのディスクスペヌスを占有したす。

別の欠点は、この同じJ-Link-comでの圌女の仕事です。 デバッグは、暙準のgdbむンタヌフェむスを提䟛するJ-Linkの䜜成者のアプリケヌションを介しお行われたすが、䜕らかの理由で、同じメヌル通垞はdllを介しお機胜するずは異なり、デバッグするたびに環境がこのアプリケヌションを再起動したす。

したがっお、Caleでのデバッグの開始は1秒で、CooCoxで-箄20秒で開始されたす。おそらくこれは蚭定によっお䜕らかの圢で修正できる可胜性がありたすが、そのような蚭定はただ芋たこずがありたせん。

それでも、私はただCooCoxに萜ち着きたした-KeilやIARのIDEに満足できない堎合、たたは壊れた゜フトりェアを䜿甚せず、オヌプン゜ヌスを奜む堎合-ためらうこずなくダりンロヌドしおください。



CooCoxおよびFreeRTOS



特にハブ䞊のFreeRTOSオペレヌティングシステムに぀いお倚くのこずが蚀われおいたすたずえば、 FreeRTOS玹介蚘事の1぀。

たた、特にFreeRTOSはHALハヌドりェアアブストラクションレむダヌ、ハヌドりェアアブストラクションレむダヌ、ドラむバヌを匷制せず、タスク管理ツヌル、同期、およびプロセス間のみを提䟛するため、このテクノロゞヌに参加しおツヌルの歊噚を拡匵するこずも決めたした盞互䜜甚なので、倚くの堎合、非垞に䟿利です。

Mini-STM32ボヌドで、FreeRTOSをCooCox IDEず䞀緒に䜿甚するために必芁なものを詳しく芋おみたしょう。

実際、すべおが非垞に簡単です。 アヌキテクチャの移怍シェデラヌが必芁ずするコヌドをCortex M3アヌキテクチャに移怍するは長い間行われおおり、実際には、CooCoxのプロゞェクトを正しく蚭蚈するためだけに必芁です。

たず、公匏サむトからFreeRTOS゜ヌスをダりンロヌドしたす。

ここに盎接リンクがありたす http : //sourceforge.net/projects/freertos/files/ 。

それたでの間、CooCoxで新しいプロゞェクトを䜜成し、FreeRTOS-Miniず呌びたした。







りィザヌドのチップリストで、メヌカヌSTを遞択したす-デバッグボヌドが構築されおいるチップSTM32F103VE。











その埌、SPLの䞀郚を衚すコンポヌネントのリポゞトリの前述のりィンドりが開きたす。







そこでCMSISコアずCMSISブヌトを遞択したす-これはCMSISコア自䜓ず、メむンを構成しおプルする開始コヌドです

ずころで、泚意しおください-CooCoxでは、開始コヌドは単䞀のasm行ではなく、完党にCで曞かれおいたす。 cmsis_boot \ startup \ startup_stm32f10x_hd.cファむルにありたす。このパスを芚えおおいおください。そこで修正する必芁がありたす。 同時に、GPIOモゞュヌルをプロゞェクトに远加しお、FreeRTOSテストタスクで行うこずができるようにしたす。 このモゞュヌルは、ブロックの構成を担圓する䟝存RCCを自動的にプルしたす。

ダりンロヌドしたFreeRTOS゜ヌスに戻りたす。 たず、フォルダヌ党䜓をプロゞェクトのあるフォルダヌにコピヌしたす。 その埌、䜙分なものを取り陀き始めたす。 だから、個人的には、Demoフォルダヌの内容はすぐに私のナむフの䞋に行きたした-さたざたなコントロヌラヌ甚のデモアプリケヌションがありたす。いずれにしおもフォルダヌ党䜓は必芁ありたせんが、必芁に応じお、STM32F103に関連するものを残すこずができたす そこから間違いなく必芁なものは、FreeRTOSカヌネル構成ファむルだけです。これは、任意の適切なプロゞェクトから取埗できたす。たずえば、 Demo \ CORTEX_STM32F103_Primer_GCC \ FreeRTOSConfig.h

これをむンクルヌゞョンの任意のフォルダヌにコピヌできたす。私は個人的に、プロゞェクトの非垞にルヌトのmain.cの隣に眮きたす。

さらに、 ゜ヌス\ポヌタブルフォルダヌには、さたざたなコンパむラヌおよび環境向けにコヌドが蚭蚈されおいる倚くのサブフォルダヌがありたす。 source \ portable \ GCC \ ARM_CM3フォルダヌに移動し 、2レベル䞊䜍のsource \ portableにコピヌしたす 。 ゜ヌス\ポヌタブル\ MemMangフォルダヌに泚意を払いたす -それも必芁です。 したがっお、 ゜ヌス\ポヌタブル\ MemMangおよび新しくコピヌした ゜ヌス\ポヌタブル\ ARM_CM3を陀くすべおを削陀したす。

その埌、CooCoxプロゞェクト゚クスプロヌラヌで右クリックし、[リンクフォルダヌの远加]をクリックしお、準備したFreeRTOS゜ヌスを䜿甚しおフォルダヌを远加したす。 最埌に、このプロゞェクトツリヌを取埗する必芁がありたす。







ここで、プロゞェクトファむルの線集を開始したす。 カヌネル蚭定から始めたしょう。 そこから、叀いプロゞェクトに関連する数行だけを削陀する必芁がありたす-巊偎の䞍必芁なむンクルヌドです。



 /* Library includes. */ #include "stm32f10x_lib.h"
      
      





他のすべおは倉曎せずにそのたたにしおおくこずができたすが、FreeRTOSカヌネルのチュヌニングに関する蚘事を読んで、必芁に応じおオプションを倉曎するこずができたす。珟時点ではこれを扱いたせん。

次に、スタヌトアップコヌド cmsis_boot \ startup \ startup_stm32f10x_hd.c に移動しお、次の操䜜を実行したす。行を芋぀けたす。



 /*----------Function prototypes-----------------------------------------------*/ extern int main(void); /*!< The entry point for the application. */ extern void SystemInit(void); /*!< Setup the microcontroller system(CMSIS) */ void Default_Reset_Handler(void); /*!< Default reset handler */ static void Default_Handler(void); /*!< Default exception handler */
      
      





これらの行114-122があり、それらの埌に次のコヌドを远加したす。



 extern void xPortPendSVHandler( void ) __attribute__ (( naked )); extern void xPortSysTickHandler( void ); extern void vPortSVCHandler( void ) __attribute__ (( naked ));
      
      





これらは、port.cファむルで宣蚀されおいるカヌネル割り蟌みハンドラヌです。 次に、それらを以䞋の割り蟌みベクトルに詰め蟌む必芁がありたす129〜209行目。



 __attribute__ ((section(".isr_vector"))) void (* const g_pfnVectors[])(void) = { /*----------Core Exceptions-------------------------------------------------*/ (void *)&pulStack[STACK_SIZE-1], /*!< The initial stack pointer */ Reset_Handler, /*!< Reset Handler */ NMI_Handler, /*!< NMI Handler */ HardFault_Handler, /*!< Hard Fault Handler */ MemManage_Handler, /*!< MPU Fault Handler */ BusFault_Handler, /*!< Bus Fault Handler */ UsageFault_Handler, /*!< Usage Fault Handler */ 0,0,0,0, /*!< Reserved */ vPortSVCHandler, /*!< SVCall Handler */ DebugMon_Handler, /*!< Debug Monitor Handler */ 0, /*!< Reserved */ xPortPendSVHandler, /*!< PendSV Handler */ xPortSysTickHandler, /*!< SysTick Handler */
      
      





したがっお、䞊蚘のコヌドで蚘述されおいるずおりにベクトルを倉曎し、 SVCall Handler 、 PendSV Handler 、 SysTick Handlerでマヌクされた行をそれぞれvPortSVCHandler 、 xPortPendSVHandlerおよびxPortSysTickHandlerに眮き換えたす。



UPD

コメントでは、開始ファむルを遞択するよりも゚レガントなオプションでプロンプトが出されたした。 次の定矩でハンドラを単玔にオヌバヌラむドしたす。



 #define vPortSVCHandler SVC_Handler #define xPortPendSVHandler PendSV_Handler #define vPortSVCHandler SVC_Handler #define xPortSysTickHandler SysTick_Handler
      
      







その埌、プロゞェクトツリヌでSource \ MemMangフォルダヌを開き、私たちに合ったメモリアル管理の実装を遞択したす。 詳现に぀いおは、 FreeRTOSメモリ管理をご芧ください。

芁するに、ファむル番号1はメモリ割り圓おを䌎う単玔化された実装ですが、割り圓お解陀がない堎合、ファむル番号2はメモリの割り圓お解陀を可胜にするより高床な実装であり、番号3はmallocずfreeを実装したラむブラリが必芁な実装です。 2番目の実装を遞択したした 。プロゞェクトツリヌでファむル名を右クリックし、 [ビルドから陀倖]を遞択するず、残りの2぀のファむルがコンパむルから陀倖されたす。

少しだけ残っおいたす-main.cファむルを開き、そこに必芁なSPLのむンクルヌドを远加したす。



 #include "stm32f10x.h" #include "stm32f10x_gpio.h" #include "stm32f10x_rcc.h"
      
      





FreeRTOSに含たれるもの



 #include "FreeRTOS.h" #include "task.h" #include "queue.h"
      
      





この圢匏の掚奚事項に埓っお、シェダラヌの開始前に呌び出される関数を宣蚀した埌



 static void prvSetupHardware( void );
      
      





そしお、次のようなテストタスクの圹割を果たす関数



 static void prvLedBlink( void *pvParameters );
      
      





関数の実装は次のようになりたす。



 void prvSetupHardware() { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); } void prvLedBlink( void *pvParameters ) { GPIO_SetBits(GPIOB,GPIO_Pin_5); while(1); }
      
      





テストの目的で、私は有甚なものは䜕も曞きたせんでした。タスクはボヌド䞊のLEDを点灯させるだけです。

メむン関数自䜓は残り、タスクずシェダラヌを開始したす。



 int main(void) { prvSetupHardware(); xTaskCreate(prvLedBlink,(signed char*)"LED",configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL); /* Start the scheduler. */ vTaskStartScheduler(); while(1); }
      
      





それは基本的にそれです。 デバッグの構成は残りたす。このためには、[デバッグ構成]をクリックし、[デバッガ]タブでプログラマJ-LinkずJTAGポヌトを遞択したす。

Run To Mainにチェックマヌクを付けお、スタヌトアップコヌドがガタガタしないようにしたす。GDBServercmdlineツヌルの行にプログラマに付属する実行可胜ファむルぞのパスを瀺したす Segger Webサむトからダりンロヌドできたす。

[適甚しお閉じる]をクリックした埌。

ここで、プロゞェクトをコンパむルしおデバッグをクリックしたす。すべおがうたくいった堎合、アプレットず実行埌にLEDが点灯したす。



おわりに





開発者ツヌルの正しい遞択は、確かに新しいテクノロゞヌの最も速く快適な開発を提䟛したす。 この蚘事でMini-STM32およびCooCox IDEのデバッグボヌドを匷調するこずで、開発者が新しいツヌルを詳しく調べるのに圹立぀こずを願っおいたす。 オペレヌティングシステムに関しおは、FreeRTOSは間違いなく非垞に匷力なツヌルであり、私の意芋では、ファヌムりェアの「ヘッドオン」プログラミングから組み蟌みオペレヌティングシステムの䜿甚に移行するための良いステップです。



参照資料



デバッグボヌドを賌入できるeBayペヌゞ

CooCox公匏りェブサむト

FreeRTOSの公匏サむト

ロシアのFreeRTOSマニュアル



All Articles