学生として、私はマイクロコントローラを非常に厳密に一般化する必要があり、それらは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の構成
- 内部高速クロックイネーブル-内部8MHz(HSI)ジェネレーターを有効または無効にします(オシレーターオフ)
- 外部高速クロックイネーブル-内部8MHz(HSE)ジェネレーターを有効または無効にします(オシレーターオン)
- 外部高速クロックイネーブル-クォーツの代わりにクロックジェネレーターのOSC入力に接続する機能。 クォーツを使用するように調整します(HSEオシレーターはバイパスされません)
- クロックセキュリティシステムの有効化-コントローラーに統合されたクロック保護システムの組み込み。 まだ使用していない(クロック検出器がオフ)
- PLLの有効化-周波数逓倍器モジュールの有効化/無効化(PLL ON)
- システムクロックスイッチ-クロック信号SYSCLOCKを選択します:PLL、外部または内部発振器。 PLLを使用します。 コントローラのコアが機能するのは、HSE周波数にPLL係数を掛けたものです(システムクロックとして選択されたPLL)
- AHBクロックの分周係数を制御するためにソフトウェアによって設定およびクリアされます-MKの周辺モジュールにサービスを提供するAHBバスのSYSCLOCKプリスプリッターをインストールします。 プリスプリッターの切断中* (SYSCLOCKは分割されていません)
- APB低速プリスケーラAPB1-I2CバスなどのMKの低速ペリフェラル用の分周器、最大動作周波数:36 MHz (HCLKを2で除算)
- APB高速プリスケーラーAPB 2-MKの高速周辺機器(入出力ポート、タイマーなど)用の分周器 (HCLKは分割されていません)
- ADCプリスケーラ-APB 2に対するADCモジュールのプリスケーラ(PCLK2を2で除算)
- PLLエントリクロックソース-内蔵RCオシレーターの1/2、またはPREDIV1を介して渡される外部ジェネレーターのいずれか、PLL入力へのクロックソース。 それを使用します(PLL入力クロックとして選択されたPREDIV1からのクロック)
- PLLエントリのHSE分周器-この非常にPREDIV1を設定します。 まだ使用していません(HSEクロックは分割されていません)
- PLL逓倍率-PLL逓倍率。 入力では、8 MHzのクォーツ周波数があり、9倍でSYSCLOCKの72 MHzの周波数があります(PLL入力クロックx 9)
- USBプリスケーラ-USBバス周波数。 USBは仕様に従って、48 MHzの周波数で動作し、1.5スプリッター(PLLクロックを1.5で分周)を選択します。
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変調の実装、タイマーの操作、およびボタンの接触バウンスを抑制する機能を紹介します。