ARMアーキテクチャ用のSTM32およびmikroCコンパイラの最初のステップ-パート1

学生として、私はマイクロコントローラを非常に厳密に一般化する必要があり、それらは8ビット8051とAVRでした。 今、この職業に戻りたいと、彼はSTM32コントローラーの非常に幅広いファミリーに目を向けました。 それらについてはWeb上で多くのことが書かれていますが、それでもSTMの操作に関する短いシリーズの記事を書きたいと思いました。 彼らが言うように、彼らは完全な0から知り合いを始めたいと思います。実験のために、シンプルで安価な($ 3)デバッグカードMaple Miniを購入しました。 その中で使用されるSTM32F103CBコントローラーには、非常に印象的な機能がたくさんあります。 (特に価格カテゴリのソリューションと比較して)。 ネットワーク上、そしてもちろんデータシートで詳細を読むことができます 。 ネイティブのArduinのような開発環境はすぐには私を味わいませんでした(彼らが言うように... 多様な開発環境の豊富さから、私はmikroelektronikaのARM用mikroCに注意を向けました。 彼らのコンパイラに出くわすと(8081用)、私はそれが本当に好きでした。 ジャムなしではないが、試してみることにした。







ボードは次のようになります。すべてが非常にシンプルで簡潔です。







画像







ボードの回路図も簡単ですが、必要なものはすべてここにあります。







画像







プログラマーは中国のクローンST-LINK2($ 3)を選択しましたが、mikroでうまく機能します







画像







mikroCデモへのリンク。 デモバージョンの制限:最大4 KBのバイナリコード。 大したことではありませんが、慣れるには十分です。 アプリケーションのインストールに問題はないはずです。必要なのは、mikroCインストーラーを起動する前にST-LINK2ドライバーをインストールすることだけです。







プロジェクトを開始して作成すると、アプリケーションウィンドウが表示されます。







画像







まず、使用するマイクロコントローラーのタイプを選択した後、プロジェクトのプロパティを設定する必要があります。 mikroCプロジェクト構成は、 Shift-Ctrl-E (プロジェクト-プロジェクトの編集)キーボードショートカットによって呼び出されます。 マイクロコントローラのSTM32クロックシステムの難しい内部組織に関連するすべての魅力が設定されるのは、このウィンドウです。 一般に、このファミリのマイクロコントローラのリファレンスマニュアルを少なくとも簡単に理解することをお勧めします。 繰り返し戻ります。







画像







データシートSTM32F103のクロックシステムのブロック図







このウィンドウでは、レジスタRCC_CRおよびRCC_CFGRの構成









MSUクロック周波数、周波数SYSCLOCKを選択-72 MHz (72.000000)







画像







これで、MKの設定を保存できます。 1つのプログラムを作成する準備がすべて整いました。 いつものように、LEDを点滅させます(PB1レッグに接続):







GPIOポート出力をmicroC出力に設定するには、次の機能があります







GPIO_Digital_Output(&GPIO_BASE, _GPIO_PINMASK_ALL);//    
      
      





GPIOxブロックのクロッキングを含み、構成レジスタに値を登録します。 ポートに書き込むデータは、レジスタGPIOx_ODRに入力されます







 GPIO_ODR = ; // c   
      
      





コンパイラを使用すると、レジスタまたは変数の特定のビットにアクセスできます。 これを行うには、レジスタ名の後にドットでビット番号(0から開始)を書き込みます







 REGx.by; //    (y)   ()
      
      





遅延を生成するには、コンパイラの組み込みのDelay_ms() (またはDelay_us() )関数を使用します。 これが最初のプログラムです。







 void main() { GPIO_Digital_Output(&GPIOb_BASE, _GPIO_PINMASK_1); // PB1  GPIOb_ODR.b1 = 0; //   GPIOb_ODR  15  = 0 while(1) //   { GPIOb_ODR.b1=~GPIOb_ODR.b1; // 15  Delay_ms(500); // 500  } }
      
      





1つの初期化コマンドを複数のポートレッグにすぐに適用するには、「or」演算子を使用して_GPIO_PINMASKnを記述します。次に例を示します。







 GPIO_Digital_Output(&GPIOb_BASE, _GPIO_PINMASK_1 | _GPIO_PINMASK_7); //PB1  PB7    GPIO_Digital_Output(&GPIOa_BASE, _GPIO_PINMASK_ALL ); //  PA   
      
      





次に、MKピンの1つに蛇行を出力して、ポートPB15の出力状態を5ミリ秒の間隔で切り替えてみましょう。 :







 void main() { GPIO_Digital_Output(&GPIOb_BASE, _GPIO_PINMASK_15); GPIOb_ODR.b15 = 0; while(1) { GPIOb_ODR.b15=~GPIOb_ODR.b15; Delay_ms(5); //  5 .( 10 ,  100 ) } }
      
      





ピンPB15には、次の信号があります。







画像







ポートのステータスを読み取る必要がある場合は、GPIO_Digital_Input(* port、pin_mask)関数を使用してポートを入力に設定した後、 GPIOx_IDRレジスタを使用します。 ボードには、PB8ポートの出力に接続されたボタンがあります。 次のプログラムは、ボタンが押されている間、ピンPB1で点滅するLEDを点灯します。







 void main() { GPIO_Digital_Output(&GPIOb_BASE, _GPIO_PINMASK_1); GPIO_Digital_Input(&GPIOb_BASE, _GPIO_PINMASK_8); //   PB8   GPIOb_ODR.b1 = 0; while(1) { if (GPIOb_IDR.b8) //    8  GPIOb_IDR  1 { GPIOb_ODR.b1=~GPIOb_ODR.b1; Delay_ms(500); // 500  } else { GPIOb_ODR.b1 = 0; //  ,   } } }
      
      





このパート1で終わりました。 第二部では、PWM変調の実装、タイマーの操作、およびボタンの接触バウンスを抑制する機能を紹介します。








All Articles