STM32およびFreeRTOS。 4. HALへのステップ

HAL 9000:私は完全に動作しており、すべての回路が完全に機能しています。
またはこれが最初の記事であるはずですが、何らかの理由で私はいつも終わり近くにこれを書きます



以前は、 ストリームセマフォキュー についてでした



STM32への切り替えの主な障害の 1つは、コントローラーの操作方法を説明する豊富なテキスト、指示、マニュアルです。 この豊富さの原因はSTMicroelectronics自体であり、最初は体系的にユーザーを混乱させ、その後間違った終了オプションを提示しました。



問題は、生成されたさまざまなコントローラにあり、何らかの理由で同じ周辺機器に対しても異なる初期化手順が必要でした。 そして、あるコントローラーで実行されているコードが別のコントローラーで動作することを拒否しました。 その結果、シャーマニックレシピのコレクションがネットワークを歩き回り、多くの時間とデータシートの書き込みが必要であることがわかります。



しかし、それほど前ではないが、STは自分がどの穴に落ちたかを認識し、そこから激しく抜け出し、新しい勢力を引き付けた。 そしてまさにこのため、開始時間は厄介な小さな値に短縮されました。 実際にはどのように見えますか? 猫へようこそ。



まず、STM32について読んではいけないことをすばやく判断する方法についてアドバイスします。



まず、発行年は2011年から2012年より前です。 「その時」と「今」が大きな違いだと信じてください。 STMの世界でのSPLとHALは、単なる別の略語ではありません。



次に、このようなコードに遭遇した場合(これはADCの初期化の一部であり、誰かが興味を持っている場合)。



RCC->APB2ENR |= RCC_APB2ENR_ADC1EN; ADC1->SMPR2 |= ADC_SMPR2_SMP0 | ADC_SMPR2_SMP1 | ADC_SMPR2_SMP2 | ADC_SMPR2_SMP3 | ADC_SMPR2_SMP4 | ADC_SMPR2_SMP5 | ADC_SMPR2_SMP6 | ADC_SMPR2_SMP7; ADC1->SQR1 |= ADC_SQR1_L_2 | ADC_SQR1_L_1 | ADC_SQR1_L_0; ADC1->SQR2 |= ADC_SQR2_SQ8_2 | ADC_SQR2_SQ8_1 | ADC_SQR2_SQ8_0 | ADC_SQR2_SQ7_2 | ADC_SQR2_SQ7_1;
      
      





その結果、そのような...壮大さを見た後、大多数は「まあ、気にしない、どうにかしてpinModeで生きる、そんな騒ぎをする方法」という言葉で、ボードを机の引き出しの隅に投げ入れた。 私は隠しません、私自身は同じであり、CMSISとSPLの略語の後ろに隠されているものを研究するようになったのは大きなニーズだけでした。 今、私の道を繰り返すことはまったく意味がありません(そして、私が読んだものの大部分を忘れようとしました)。 したがって、ここで私は行く必要がある人々のために語っています。



それで問題は何ですか? 主な唯一の問題は、周辺機器の初期化です。 ビートを伴うこれらのシャーマニズムのダンスは、ゼロからは発生しませんでした。 そして、「私にとってはうまくいかない」という問題の99%は、正確に初期化されていないことにあります。 間違った周波数、他に割り当てられたリソースを使用する試みなど。 特に問題を悪化させるのは、エラーコードがないか、実行されていないことです。 すべてがサッパーのようなものです。何か間違ったことをしました-すべてが死んでいます。



これらはおとぎ話だと思いますか? 以下は、STMF3タイミングスキームの写真です。




間違いを犯す可能性のある場所を数えて、自分でやることを提案します





その結果、STは最初のSPL(Standard Peripheral Library)をリリースしました。これにより、少なくとも状況は改善されましたが、それほどではありませんでした。 そして、次のバージョンが登場し、HALと呼ばれました。 開発者の負担を軽減するため、STM32CubeMXユーティリティが更新され、文字通りマウスを数回クリックするだけで、さまざまなボード、プロセッサ、周辺機器の初期化コードを生成できるようになりました。 そしてその隣に、いわゆるファームウェアを入れました。このファームウェアには、このプロセッサ専用の作業例がたくさん詰め込まれています。



そして、2つのボタンを押すことで100%を得ることができるという事実(私は反対に会ったことがありません)、実際のコードは「最適化と最適化」という考えを絶対に押しつぶします...



プログラム自体は、「マウスで必要なものを選択してボタンを押す」という通常の原則に従って構築されます。 クロックスキームを1つ選択しました。プログラムはすぐに周波数を表示し、そのような周波数では動作できない場所を赤色で強調表示しました。 特定の条件下では不可能な機能を使用しようとしました(たとえば、足がすでに他のもので占められているなど)-エラーが再び強調表示されます。



ここ左側の図では、片足で掛けることができる機能のリストを示しました。 数えた後、通常、AVRschiki(1脚あたり4つの機能が最大)は長時間笑い、心の中で何かを数えます。 そして、私は彼らに160以上のそのような足があるかもしれないと言うとき、彼らは一般に沈殿します。



しかし、私が最も幸せなのは、HALのおかげで、周辺機器を操作するためにコードを書き直す必要がないという事実です。 どこかに書かれている場合



 AL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_RESET);
      
      





次に、現在利用可能なすべてのプロセッサで、このコードがPA2レッグを「ゼロ」に変換することを知っています。 また、目的のADCチャネルの平均値を取得する記述された関数でさえ、L1からF4に切り替えても抵抗しません



 int GetADCValue(uint32_t Channel,uint32_t Count) { int val = 0; ADC_ChannelConfTypeDef sConfig; sConfig.Channel=Channel; sConfig.Rank=1; sConfig.SamplingTime=10; HAL_ADC_ConfigChannel(&hadc,&sConfig); for(int i = 0; i < Count; i++) { HAL_ADC_Start(&hadc); HAL_ADC_PollForConversion(&hadc,1); val += HAL_ADC_GetValue(&hadc); } return val / Count; }
      
      





そして今、STM32の規範に小さな魔法がかけられました



STM32F3からusbでcom-portを取得するために努力する必要がありますが、送信されたものを単純に返すでしょうか? ここで計算-12回のマウスクリック(USBのオン、CDCの選択、生成)および関数CDC_Receive_FSの6行のコード(ファイルusbd_cdc_if.c)



 for (int i = 0; i < *Len; i++) UserTxBufferFS[i] = UserRxBufferFS[i]; USBD_CDC_SetTxBuffer(&hUsbDeviceFS, &UserTxBufferFS[0], *Len); USBD_CDC_TransmitPacket(&hUsbDeviceFS); USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &UserRxBufferFS[0]); USBD_CDC_ReceivePacket(&hUsbDeviceFS);
      
      





また、ほぼ同じ方法で、同じ複雑さで、「サウンドカード」、「フラッシュドライブ」、またはHIDが実装されます。 はい、初期化コードのみを提供します。ロジックを自分で記述する必要がありますが、これも素晴らしいヘルプです。



プロジェクトをアップロードすることもしません。コンピューターに既に持っているものをドラッグする価値があるからです。結果を表示します。







「サンプルの入手先」という質問に対する答えは簡単です。生成中にダウンロードされた「ファームウェア」には多くのサンプルがあります。 また、他のプロセッサモデルの「メニュー」に「ファームウェア」をダウンロードすることをお勧めします。多くの場合、例は重複せず、同じ「DMA via ADC」は1か所にしかありません。



別の段落で、STM32Cubeはプログラマーのクイックスタートを支援しますが、構成されているものと、このように構成されている理由を理解する必要があります。 たとえば、デフォルトではUSARTの割り込みとDMAは無効になっているため、一部の機能は動作しません。 一般に、プログラムを使用するとプロジェクトを再生成できるため、すでに記述されている内容を保持したまま、タブを注意深く見てください。



ここのどこかで、プログラマーは通常「食べ」て「そのようなもの」を生成し、記述子、バッファーサイズを変更し、タスクマネージャーの表示名を「スーパークールデバイス」に変更します。 さて、これであなたを残します



仕上げとメリット



All Articles