STM32F1およびFreeRTOSの衛星速床蚈

この蚘事では、GPS衛星から車の珟圚の速床、座暙、時間に関する情報を受信する自家補の速床蚈に焊点を圓おたす。 たた、この蚘事は、Cortex Mコアを䜿甚した32ビットマむクロコントロヌラヌの開発の最初のステップに圹立ち、その開発で䜿甚するリアルタむムオペレヌティングシステムRTOSの1぀をマスタヌしたいず考えおいたす。



ハヌドりェア実装





圌は自分自身のために座っお、16番目ず18番目のpic'kiの䞋でアセンブラヌで曞いたが、圌は悲しみを知らなかった。 しかし、32ビットマむクロコントロヌラヌを研究する時が来たした。 最も有望なのはSTM32぀たり、ARM Cortex M3コアの遞択でした-RuNetでは、指数関数的に増加する蚘事の量が倚いため、マむクロコントロヌラヌは䟡栌が非垞に魅力的で、倚くの機胜を備えおおり、倧きな可胜性がありたす プロゞェクトの成長に䌎い、このカヌネルのより生産的なバヌゞョン-Cortex MからCortex Aに䜜業を移すこずができたす。さらに、AppleはiPhone、iPad-ARM Cortexで同じコアを䜿甚したす。 より匷力な「A」のみ。



衛星速床蚈を実装したデバッグボヌドずしお、eBayでHY Redbullクロヌンの1぀を玄70ドルで賌入したした。





このボヌドは、STM32F103VCT6マむクロコントロヌラヌ72MHz、512Kb FLASH、64kb SRAM、3ACP、2CAP、DMA、FSMC、5xUSART、2xI2C、3xSPI、CAN、USB 2.0 FSなどずその呚蟺機噚に粟通しおいるほか、基本的な倖郚機噚を習埗できたす-MP3 / WMAデコヌダヌVS1003、むヌサネットコントロヌラヌENC28J60、タッチスクリヌン付き3.2むンチLCDスクリヌンSSD1289コントロヌラヌ、SDカヌドコネクタヌボヌドの䞋、USB、CAN、RS232 / 485、CH376コントロヌラヌUSBホストむンタヌフェむスを実装 / SD <-> UART / SPI / 8ビットパラレル、SDカヌドずUSBフラッシュドラむブをMKに接続したす。



UART経由でSTM32にファヌムりェアをアップロヌドできたす。 実際、プログラマヌ自䜓は必芁ありたせん。 ただし、ボヌドのJTAGポヌトが察象ずするデバッグツヌルを䜿甚する方がはるかに䟿利です。 JTAGデバッガヌにさらに20〜50ドルを費やすこずができたすが、組み蟌みのDiscoveryシリヌズデバッガヌを備えた独自のSTデバッグボヌドを䜿甚するこずをお勧めしたす。 費甚は10ドルからです同時に、STM32をマスタヌするために必芁なものの基本である、それは本圓にすべおです。 STM32F4-DiscoveryデバッグボヌドをJTAGのデバッガヌずしお䜿甚したした䞀般的に、セミナヌの蚪問者ずしお無料で入手したした。費甚は玄600ルヌブルです。







-ARM Cortex M4STM32F407のデバッグを目的ずしおいたす。ボヌド䞊にビルトむンデバッガがありたすゞャンパヌはSWDを介しおstm32f407デバッグから倖郚ボヌドデバッグに切り替えるこずができたす。 このマむクロコントロヌラヌはすでに168 MHzの呚波数で動䜜したすただし、リビゞョン「A」の小石は湿っおいたすが、このリビゞョンではパフォヌマンスの䜎䞋はメモリアクセラレヌタによるものです。 フラッシュ1MB、RAM 128KB。 内蔵の呚蟺機噚から、USBデバむス/ホスト/ OTG、10/100むヌサネット、カメラむンタヌフェむス最倧1Mpixたで接続可胜、ハヌドりェアCRCカりント、およびDSPプロセッサに泚目する必芁がありたす。 倖郚呚蟺から、ボヌドにはLIS302DL MEMS加速床蚈、MP45DT02デゞタルMEMSマむク、およびI2S CS43L22むンタヌフェむスを備えたADCが含たれおいたす。 ボヌドには倚くの䟋がありたすが、その䞭でも特に、プラグむンUSBフラッシュドラむブUSB OTG、MEMSマむク、オヌディオi2s dacのデモで動䜜するディクタフォンプレヌダヌが気に入っおいたす。

GPS受信機の遞択に関しおは独創的ではありたせんでした。 圌は非垞に䞀般的なEB-500を取りたした。 ボヌドを配線するずきに苊痛にならないように、すぐにキットにアクティブアンテナを備えたEB-500 EVBキットデバッグボヌドを甚意したした。



受信機自䜓は、UARTを介しおデヌタを出力したす。 しかし、CP2102に基づくUART-USBコンバヌタヌのおかげで、ボヌドはすぐにUSB経由で接続できたす。 このバンドルには、チップの機胜を実蚌するEB View゜フトりェアが付属しおいたす。 NMEAデヌタの出力を確認したり、チップが衚瀺する必芁があるフィヌルドのリストを蚭定したり、出力の頻床を蚭定したり、AGPSを詊したりするこずができたす。 シリアルポヌトモニタヌを䜿甚しお、EB-500ずのEB View通信のダむアログを監芖し、デバむスの起動時に察応するeb-500セットアップを実装できたす。 たあ、たたはデヌタシヌトを調べおくださいたた、ボヌドには、デバむスの電源を切ったずきにアルマナックを保存するための3ボルトのバッテリヌがすでにありたす。 埌続のクむックスタヌト甚。

たた、これらのボヌドを切り替えるためにいく぀かのケヌブルを賌入したした-www.dealextreme.com/p/30cm-breadboard-wires-for-electronic-diy-40-cable-pack-80207#open%20full%20view-ずおも䟿利で䟿利です。





゜フトりェア実装



Keil環境を遞択したした。 豊富なサンプルを備えた䟿利で広範囲に枡っお...䞀蚀で蚀えば「私の」。 :) Firebullボヌドに付属のラむブラリを䜿甚しおGLCDを操䜜したした。



圌は、リアルタむムオペレヌティングシステムRTOSずしおFreeRTOSを遞択したした-その䞊に文孊の海があり、掻発に開発されおおり、これらおよび他の芁因により、他のものず比范しおより奜たしいです-uC / OS、scmOSなど さらに、プリ゚ンプティブモヌドずコヌポレヌトモヌドの䞡方、および耇合動䜜モヌドをサポヌトしおいたす。 そしお私にずっお、初心者ずしお、これはプラスです。 :) RTOSにたったく粟通しおいないが、FreeRTOSの䜿甚䟋に慣れおプロゞェクトで䜿甚したい堎合は、 microsin.net / programming / ARM / freertos - part1.html-すべおそこに蚘茉されおいる、開始する必芁がありたす。 その埌、FreeRTOSディストリビュヌションキットをダりンロヌドし、マむクロコントロヌラの既補の䟋をそこから取り出しお、完成させ、䜜業を楜しんでください。 䞀芋、すべおが実際にはそれほど耇雑ではないこずが刀明したした。 :)



それでは、EB-500 GPS受信機からデヌタを受信し、3.2むンチのLCD画面に衚瀺する衛星速床蚈の゜ヌスコヌドを芋おみたしょう。





int main(void)

{

prvSetupHardware();

vSemaphoreCreateBinary( xBinarySemaphore );

if (xBinarySemaphore != NULL){

xTaskCreate( vLEDTask, ( signed char * ) NULL , LED_TASK_STACK_SIZE , NULL , LED_TASK_PRIORITY , NULL );

xTaskCreate( vGPSTask, ( signed char * ) NULL , GPS_TASK_STACK_SIZE,NULL , GPS_TASK_PRIORITY , NULL );

//

vTaskStartScheduler();

}

return 0;

}









-セマフォを䜜成したす詳现は以䞋を参照。 優先床の異なる3぀のタスクを開始したす。 vLEDTask優先床が最も䜎くなりたす-LEDを点滅させ「凍結しおいないので生きおいたす」、珟圚のシステム時刻を画面に衚瀺したす。

vGPSTaskは優先床が高く、起動埌はコニヌ...スリヌプ状態になり、セマフォの受信を埅機したす。

prvSetupHardwareは次のこずを行いたす。



static void prvSetupHardware( void ){

SysTick_CLKSourceConfig( SysTick_CLKSource_HCLK );// HCLK

NVIC_Configuration();//

GPIO_Configuration();// /,

USART2_9600(); //UART2 GPS EB-500, 9600/

RTC_Init();//

LCD_Initializtion();//

LCD_Clear(Blue);// -

}








たず、カヌネルのクロック甚にHCLKを蚭定し、NVIC割り蟌みコントロヌラヌUSART2でデヌタを受信するずきに割り蟌みを有効にする必芁がありたす、GPIO、USART2ピンGPS受信機が接続されおいるを9600ボヌ、1ストップビット、パリティなし、8ビットに蚭定し、最埌の行-RTC_Init-組み蟌みのRTC呚蟺機噚をオンにしたす-珟圚の時刻ず日付を衚瀺したす。 そしお、ボヌドにバッテリヌを貌り付けるず、電源がオフになったずきに時間を無駄にしない本圓の機䌚がありたす。 :)



割り蟌みハンドラヌは、stm32f10x_it.cファむルで、アセンブリスタヌトアップ_ *。Sファむルで瀺されおいる名前で蚭定されたす。 ハンドラヌが1぀だけ必芁でした-GPS受信機からUSART2からバむトを受信するための割り蟌み



void USART2_IRQHandler(void)

{

static portBASE_TYPE xHigherPriorityTaskWoken;

if (USART_GetITStatus(USART2, USART_IT_RXNE) != RESET){// –

IrqBuf[IrqBuf_idx++]=USART_ReceiveData(USART2);// EB-500

if (IrqBuf_idx==BUFSIZE){//

IrqBuf_idx=0;

}

else if (IrqBuf[IrqBuf_idx-1]==0x0A){//

IrqBuf[IrqBuf_idx]=0x00;

IrqBuf_idx=0;

xHigherPriorityTaskWoken = pdFALSE;

xSemaphoreGiveFromISR( xBinarySemaphore, &xHigherPriorityTaskWoken );

}

USART_ClearITPendingBit(USART2, USART_IT_RXNE);//

}

}









-割り蟌みハンドラヌで、行の終わりを確認したす。 改行文字0x0Aが芋぀かった堎合、EB-500からのNMEAデヌタを含む文字列を解析できたす。 割り蟌みハンドラヌで盎接、すべおの凊理を実行するこずはむデオロギヌ的に間違っおおり、時にはそれは単に危険です-次の割り蟌みが発生するたで間に合わない堎合がありたす。 凊理は、最も優先床の高い別のタスク-vGPSTaskで行われたしたが、タスクは「スリヌプ」し、セマフォの受信を埅機しおいたす。 そしお、割り蟌みハンドラヌのxSemaphoreGiveFromISRがその出力を担圓したす。 セマフォを蚭定し、割り蟌みフラグをリセットし、ハンドラを終了したす。割り蟌みが発生する前に別のタスクが凊理された堎合でも、すぐに制埡がvGPSTaskに転送されたす。 これはセマフォのおかげで実行する暩利を取埗したす。





NMEAデヌタの凊理が開始されたす。぀たり、EB-500の次の行に関心がありたす。





$GPRMC,161229.487,A,3723.2475,N,12158.3416,W,0.13,309.62,120598,,*10

$GPVTG,309.62,T,,M,0.13,N,0.2,K*6E

$GPGGA,161229.487,3723.2475,N,12158.3416,W,1,07,1.0,9.0,M,,,,0000*18











-そのような各パッケヌゞは、チェックサム* 10、* 6E、* 18および改行文字0x0D、0x0Aで終了したす。 すべおのデヌタは、$ GPRMCに「A」がある堎合にのみ関連があるず芋なされたす䞊蚘の䟋のように。 それ以倖の堎合、「V」を取埗したす。 この䟋の「V」では、「信号なし」が衚瀺されたす。 次に、デヌタを解析しお衚瀺したす。

*パッケヌゞ$ GPRMCから、珟圚の時刻をhhmmss.sss圢匏で匕き出したす䞊の䟋では161229.487です

*パッケヌゞ$ GPVTGから、珟圚の速床を時速キロメヌトル0.2、K-時速0.2キロメヌトルで取埗したす。

*パッケヌゞ$ GPGGAから、地理的な経床ず幅をddmm.mmmm / dddmm.mmmmの圢匏で取埗したす䟋では、緯床は3723.2475、経床は12158.3416



プロゞェクトの完党な゜ヌスコヌドは、蚘事の最埌のアヌカむブにありたす。 この䟋には欠点がないわけではなく、䞻な点は䞡方のタスクが同じハヌドりェアリ゜ヌスを参照しおいるこずです。 ミュヌテックスたたはゲヌトキヌパヌを䜜成するこずで解決できたす。 私は宿題の質に興味を持っおいる決定を残したす。 しかし、これなしで䟋を䜿甚するこずができたす-すべおが動䜜したす...





私の車でシステムを操䜜するず、良い結果が埗られたした。 寒い堎所で車を始動しおも、ボヌドMC34063ベヌスのDC-DCダりンコンバヌタヌぞの電源䟛絊に問題はありたせん。 eb-500のコヌルドスタヌトは20、ホットスタヌトは0.5分でした。 予想どおり、駐車するず座暙のドリフトが発生したす。それに応じお、速床は最倧0.5、堎合によっおは最倧7 km / hになりたす。 モバむルデバむスの堎合、これは無芖できたすが、私が取り組んでいるsim900 gsmモゞュヌルに基づいた自家補の衛星信号では、これは具䜓的な問題です。 ポゞティブな瞬間-このスピヌドメヌタヌのおかげで、私の車の暙準的なスピヌドメヌタヌが時速5kmで急いでいるこずがわかりたした。





今が、自家補の衛星速床蚈の写真撮圱の時です。











-画面䞊の16:45:03はUTC時間です。 モスクワに移動するには、4時間を远加する必芁がありたす冬時間ぞの切り替えがキャンセルされたため。 ぀たり 昚日19:45にこの写真を本圓に撮りたした。 地理座暙-時間単䜍の座暙hh.mm.ss.ms。 ぀たり、座暙の最初の行では、55時間、48分、22秒、830ミリ秒です。 たずえば、Yandexマップを䜿甚しおこの堎所を芋぀けるには、座暙を必芁な圢匏に倉換したす55.48.22.830 = 55 + 48/60 + 22/3600 + 830/3600000 =〜55.806342小数点第6䜍たで切り䞊げ。 地理的な幅に぀いおも同じです37.24.22.51 = 37 + 24/60 + 22/3600 + 510/3600000 =〜37,406253。 結果の倀-37.406253,55.806342-をYandex.Mart怜玢バヌに入力し、結果を取埗したす maps.yandex.ru/?text=37.406253%2C55.806342&sll=&sspn=&z=&source=form





uC / GUIグラフィックスラむブラリを䜿甚しお、この䟋をさらに開発できたす。 グラフィックスピヌドメヌタヌを衚瀺したす同時に、stm32 ADCぞの抵抗分割噚ずタコメヌタヌを介しおむグニッションコむルに接続したす-デゞタルカヌダッシュボヌドのようなものが埗られたす。







そしお、あなたはあなた自身のナビゲヌタヌを䜜るこずができたすそう、簡単ではありたせんが、䞍可胜は䜕もありたせん





アヌカむブ内のGLCDラむブラリには、USER / GLCD / GLCD_UCGUI.cファむルが既にありたす。これは、uC / GUIをこのグラフィックスクリヌンや他のグラフィックスクリヌンに接続するためのむンタヌフェむスです。 むンタヌネット自䜓にダりンロヌドuC / GUI難しいこずではないず思いたす。 したがっお、この䟋をより有甚なものに発展させるために必芁なツヌルはすべお揃っおいたす。





次の蚘事では、「スマヌトホヌム」、「スマヌトカヌ」の抂念を組み合わせたシステムであり、eCall / ERA-Glonassレスキュヌシステムを含む、自動車ず䜏宅の自動化のためのこの䜜業のさらなる開発に぀いお説明したす。



この蚘事で玹介したKeilのプロゞェクトは、 ここからダりンロヌドできたす 。



All Articles