STM32ARM CORTEX-M32ビット-マイクロコントローラのプログラミングの概要

この詳細な記事では、さまざまな開発ツールを使用してSTM32CORTEX-M32ビット-マイクロコントローラ用の組み込みファームウェアを開発する方法を学びます。

STM32マイクロコントローラ

77株

STM32シリーズは、さまざまな製品で使用される最も人気のあるマイクロコントローラの一部です。 彼らはまた、複数のマイクロコントローラ開発フォーラムからの優れたサポートベースを持っています。

STMicroelectronicsのこのマイクロコントローラ-ファミリは、ARM Cortex-M32ビットプロセッサ-コアをベースにしています。

STM32マイクロコントローラは、センサ、ディスプレイ、カメラ、モーターなどのあらゆる種類の電子部品とインタフェースできる多数のシリアルおよびパラ すべてのSTM32亜種は内部フラッシュ-メモリおよびRAMと来ます。

STM32で利用可能な性能の範囲は非常に広大です。 最も基本的な製品には、クロック周波数がわずか24MHzのstm32F0およびSTM32F1サブシリーズがあり、わずか16ピンのパッケージで提供されています。

他の極端な性能では、STM32h7は最大400MHzで動作し、最大240ピンのパッケージで提供されます。

より高度なモデルは、深刻な数値処理要件を持つアプリケーションのための浮動小数点ユニット(FPU)で利用可能です。 これらのより高度なモデルは、マイクロコントローラとマイクロプロセッサの間の線を曖昧にします。

最後に、STM32Lサブシリーズは、小型バッテリから実行される低電力ポータブルアプリケーション用に特別に設計されています。

開発ツール

開発ツールは、コードを開発し、マイクロコントローラをプログラムし、コードをテスト/デバッグするために必要です。 開発ツールは次のとおりです。

  • コンパイラ
  • デバッガ
  • インサーキットシリアルプログラマ(ICSP)
STM32のプログラミング

インサーキットシリアルプログラマ(ICSP)を介してSTM32をプログラミングする。

STM32マイクロコントローラのコード開発には、いくつかのソフトウェア開発ツールがあります。 ソフトウェアツールは、統合開発環境(IDE)として利用可能であり、必要なすべてのツールを統合環境に組み合わせています。Keil MDK ARM(uvison5IDE)–MDK ARM IDEは非常に安定した開発環境であり、無料でダウンロードできます。 これは、32KBのプログラムサイズまでのコードの開発を可能にします。 大規模なプログラムを開発するには、ライセンス版をここで購入する必要があります。

  • CoIDE–無料のGCCコンパイラの組み込みARMバージョンと一緒に統合されたEclipse IDEのトリミングダウンバージョンに基づいている無料のツールチェーン。
  • STM32マイクロコントローラで使用できる他のIdeもいくつかあります。 ただし、この記事では、非常に人気のあるKeil MDK ARM uvision5IDEを使用してプログラムを開発して点滅させることに焦点を当てています。

    ソフトウェアツールとは別に、実際のマイクロコントローラでコードをプログラムしてテストするには、インサーキットシリアルプログラマ(ICSP)が必要です。 ICSPは、マイクロコントローラをUSBポート経由でPCソフトウェアツールにインタフェースするために必要です。

    ARM Cortex-Mマイクロコントローラは、jtag(electronics industry association The Joint Test Action Group)とSerial Wire Debug(SWD)の二つのプログラミングプロトコルをサポートしています。

    これらのプロトコルをサポートするいくつかのICSPプログラマがあります。

    • Keil U-Link2
    • Segger J-Link
    • ST-Link

    最初のアプリケーションの開発

    容易に利用できる基本的なコードフレームワークから始めるのが常に最も簡単です。 次に、マイクロコントローラの特定のアプリケーションとモデルに必要なコードを追加します。

    幸いなことに、STMicroelectronicsはStm32Cubemxと呼ばれる非常に便利なグラフィカルツールを提供しており、これは任意のSTM32マイクロコントローラ用の基本的なアプリケーシ また、マイクロコントローラの多重化ピン上のペリフェラルを設定するためにも使用できます。Stm32Cubemxツールはここからダウンロードできます。

    Stm32Cubeには、あらゆるタイプのペリフェラル用の広範なドライバセットと、コードと事前統合されたオプションのFreeRTOS(無料のリアルタイムOs)のサポートが付属しています。

    次のセクションでは、端末ウィンドウに入力されたものをエコーするSTM32F030マイクロコントローラ用の単純なUARTアプリケーションを作成する方法Stm32Cubemxソフトウェアをインストールします。

  • アプリケーションを実行し、”新規プロジェクト”を選択します。 次に、以下に示すようにMCU Selectorウィンドウが開きます。
  • ダブルクリックして、使用しているマイクロコントローラモデルを選択します。 この例では、STM32F030K6を使用しています。 次に、選択したマイクロコントローラのピン配置ページに移動します。STM32F030K6は、32KBのフラッシュメモリと4KBのRAMメモリを備えたARM Cortex-M0コアです。 このコード例では、緑色のピンを使用して、以下に示すように、PA9ピンとPA10ピンを使用してシリアルデータを送受信するUARTを有効にしています。

    Stm32CubemxのSTM32F030K6のピン配置を示すスクリーンショット

    構成タブでUART設定を構成し、以下に示すようにUART設定を選択します。 NVIC設定タブのNVICグローバル割込みオプションを有効にします。次に、プロジェクト–>設定に移動して、新しいプロジェクト名を追加し、使用するツールチェーンIDEを選択します。 この例では、プロジェクト名を’UARTEcho’に設定し、プロジェクト開発用のKeil-MDK5IDEを選択します。最後に、プロジェクトをクリックしてプロジェクトコードを生成します->コードを生成します。ここで、生成されたMDK-ARMプロジェクトファイルUARTECHO\MDK-ARM\UartEchoを開きます。uprojx。

    これまでのところ、このプログラムはUARTペリフェラルを初期化し、無限ループで停止します。Stm32Cubeは、ユーザー固有のコードを実装するために、/*USER CODE BEGIN x*/および/*USER CODE END x*/コメントブロックを生成することに注意することが重要です。 ユーザーコードは、これらのコメントブロック内に記述する必要があります。 変更された設定でコードが再生成されるたびに、STMCubeツールはこれらのユーザーコメントブロック内にユーザーコードを保持します。

    次に、メインのUARTからバイトを受け取るグローバル変数を定義します。cソースファイル:

    /* USER CODE BEGIN PV *//* Private variables ———————————————————*/static uint8_t recv_data;/* USER CODE END PV */

    すべての初期化コードの後、ドライバが1バイトを受信できるようにします。 次の機能は、rxne割込みビットをイネーブルします。

    /* USER CODE BEGIN 2 */HAL_UART_Receive_IT(&huart1, &recv_data, 1);/* USER CODE END 2 */

    ここで、受信割り込みを処理し、受信バイトを送信するコールバック関数を追加します。

    /* USER CODE BEGIN 0 */void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){HAL_UART_Transmit(huart, huart->pRxBuffPtr, 1, 1000);}/* USER CODE END 0 */

    最後に、コードをコンパイルしてマイクロコントローラにフラッシュ(ダウンロード)する必要があります。Keil MDK ARM IDEがインストールされている場合、ST-LINK V2、J-Link、およびUlink2用のドライバが利用可能です。 デフォルトではST-Linkデバッガが選択されます。 プロジェクト–>Targetのオプションに移動し、デバッグタブで使用されるICSPプログラマを選択します。P>

    Flash->ダウンロードを選択してコードをフラッシュします。ダウンロードします。ダウンロードします。ダウンロードします。ダウンロードします。

    注:あなたの新しい電子ハードウェア製品を開発するためにあなたの自由なPDFガイド15のステップをダウンロードしてください。

    マイクロコントローラは、UART経由で受信したデータをエコーします。 それはPCにUSB-To-Serialコンバーターの使用によって接続することができる。 PCでは、115200-8-N-1の設定を使用して、端末アプリケーションでCOMポートを開きます。 これで、端末から送信されたものはすべてマイクロコントローラを介してエコーバックされます。STM32割込みシステムは、ARM Cortex MコアNVICペリフェラルをベースにしています。 STM32Mcuは、ARMコアの16個の割込みチャネルとは別に、複数のマスク可能な割込みチャネルをサポートします。たとえば、STM32F0MCUシリーズは、32個のマスク可能な割り込みをサポートしています。 このファミリのMcuの例外と割り込みベクタテーブルを以下の表に示します。

    Interrupt Description Vector Address
    Reserved 0x00000000
    Reset Reset 0x00000004
    NMI Non maskable interrupt. The RCC clock security system (CSS) is linked to the NMI vector 0x00000008
    HardFault All class of faults 0x0000000C
    SVCall System service call via SWI Instruction 0x0000002C
    PendSV Pendable request for system service 0x00000038
    SysTick System tick timer 0x0000003C
    WWDG Window watchdog interrupt 0x00000040
    PVD_VDDIO2 PVD and VDDIO2 supply comparator interrupt (combined with EXTI lines 16 and 31) 0x00000044
    RTC RTC interrupts (combined EXTI lines 17, 19 and 20) 0x00000048
    Flash Flash global interrupt 0x0000004C
    RCC_CRS RCC and CRS global interrupts 0x00000050
    EXTI0_1 EXTI line interrupts 0x00000054
    EXTI2_3 EXTI line interrupts 0x00000058
    EXTI4_15 EXTI line interrupts 0x0000005C
    TSC Touch sensing interrupt 0x00000060
    DMA_CH1 DMA channel 1 interrupt 0x00000064
    DMA_CH2_3
    DMA2_CH1_2
    DMA channels 2 and 3 interrupts
    DMA2 channel1 and 2 interrupts
    0x00000068
    DMA_CH4_5_6_7
    DMA2_CH3_4_5
    DMA channel 4,5,6 and 7 interrupts
    DMA2 channel 3, 4, and 5 interrupts
    0x0000006C
    ADC_COMP ADC and COMP interrupts (Combined EXTI lines 21 and 22) 0x00000070
    TIM1_BRK_UP_TRG_COM TIM1 break, update, trigger and commutation interrupts 0x00000074
    TIM1_CC TIM1 capture compare interrupt 0x00000078
    TIM2 TIM2 global interrupt 0x0000007C
    TIM3 TIM3 global interrupt 0x00000080
    TIM6_DAC TIM6 global interrupt and DAC underrun interrupt 0x00000084
    TIM7 TIM7 global interrupt 0x00000088
    TIM14 TIM14 global interrupt 0x0000008C
    TIM15 TIM15 global interrupt 0x00000090
    TIM16 TIM16 global interrupt 0x00000094
    TIM17 TIM17 global interrupt 0x00000098
    I2C1 I2C1 global interrupt (combined with EXTI line 23) 0x0000009C
    I2C2 I2C2 global interrupt 0x000000A0
    SPI1 SPI1 global interrupt 0x000000A4
    SPI2 SPI2 global interrupt 0x000000A8
    USART1 USART1 global interrupt (combined with EXTI line 25) 0x000000AC
    UART2 USART2 global interrupt (combined with EXTI line 26) 0x000000B0
    USART3_4_5_6_7_ 8 USART3, USART4, USART5, USART6, USART7, USART8 global interrupts (combined with EXTI line 28) 0x000000B4
    CEC_CAN CEC and CAN global interrupts (combined with EXTI line 27 0x000000B8
    USB USB global interrupt (combined with EXTI line 18) 0x000000BC

    Extended Interrupts and Events Controller(EXTI)

    STM32Mcuには拡張interrupts and Events controllerがあり、外部および内部の非同期イベント/割り込みを管理し、CPU/割り込みコントローラへのイベント要求と電源マネージャへのウェイクアップ要求を生成します。

    一つ以上のEXTIラインのそれぞれは、NVIC割り込みベクトルの一つにマッピングされます。

    外部割込みラインに対して、割込みを生成するには、割込みラインを設定してイネーブルする必要があります。 これを行うには、2つのトリガ-レジスタを所望のエッジ検出でプログラミングし、割り込み-マスク-レジスタの対応するビットに”1″を書き込むことによ

    外部割込みとGPIOマッピング

    システム上で使用可能なGPIOのそれぞれは、割込みを生成するように設定することができます。 ただし、EXTI割込みラインのそれぞれは、複数のGPIOピンにマップされます。 たとえば、使用可能なすべてのGPIOポート(A、B、Cなど)でPIO0。)はEXTI0行にマップされます。 すべてのポートのPIO1は、EXTI1行などにマッピングされます。

    EXTIラインの一部は、単一のNVICベクトルに結合されます。 たとえば、EXTI4_15は単一のベクトルアドレスにマップされるため、PIO4からPIO15までのすべての割り込みに対して単一の割り込みルーチンがあります。 ただし、割込みの発生源は割込み保留レジスタを読み出すことによって識別できます。STM32Mcuを使用するシステムを設計する際に考慮すべき重要なことの1つは、割込み用のGPIOピンの選択です。 MCUは、デバイス上で使用可能なGpioが16個を超える場合がありますが、使用可能な外部割込みラインは16個のみです。たとえば、EXTI_0はPA0またはPB0のいずれかにマップできますが、両方にマップすることはできません。 したがって、外部割込み用のピンを選択する際には、EXTIラインのいずれかに一意にマッピングできるように選択する必要があります。次の項では、STM32Cubeを使用して割込みを設定する方法について説明します。

    screenshot configuring interrupt Stm32Cubemx

    Configurationタブを選択し、割り込みを設定する必要があるハードウェアモジュールを選択します。 モジュール設定ウィンドウが開きます。

    次に、NVIC設定タブを選択し、グローバル割込みを有効にします。

    モジュールの割込みを有効にするコードは、stm32f0xx_hal_mspに生成されます。HAL_<>_Mspinit(…)関数内のc。STM32キューブによって生成されたコードには、すべての割り込みのIrq_Handler実装があります。 割り込みが有効になると、コードはアプリケーションに含まれます。

    通常、生成されたコードはすでにIRQを処理し、割り込みを生成したフラグをクリアします。 次に、モジュールの割り込みを生成したイベントに対応するアプリケーションコールバックを呼び出します。

    STM32HAL(Hardware Abstraction Layer)は、ドライバの一部として、各モジュール内の各イベントタイプのコールバックを実装します。 この例では、rx Transfer Completeコールバックをstm32f0xx_hal_uartからコピーする必要があります。cファイル。

    ドライバ内のコールバック関数は、__weakリンカ属性で実装されます。 ユーザーは、アプリケーションファイルのいずれかで__weak属性を削除し、その関数内で必要な特定の処理を記述することにより、必要なコールバック関数のコ

    /*** @brief Rx Transfer completed callback.* @param huart UART handle.* @retval None*/__weak void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){/* Prevent unused argument(s) compilation warning */UNUSED(huart);

    /* NOTE : This function should not be modified, when the callback is needed,the HAL_UART_RxCpltCallback can be implemented in the user file.*/}

    結論

    このチュートリアルでは、STM32ファミリのマイクロコントローラで動作するアプリケーションを作成する方法を紹介します。 アプリケーションを作成するには他にもいくつかの方法がありますが、説明したStm32Cubeは簡単で直感的な方法です。

    このツールは、マイクロコントローラ周辺機器の初期化を簡素化します。 また、特に信号を異なるピンに再マッピングする必要があるハードウェアリビジョンがある場合には、コードの保守性が向上します。

    Stm32Cubeツールを使用するもう一つの利点は、マイクロコントローラのユーザー設定のレポートを生成することです。 このレポートでは、クロックツリー、ピンマッピング、ハードウェアモジュール構成について詳しく説明します。

    すべてのSTM32バリアントで利用可能な他のコードライブラリとサンプルプログラムもいくつかあります。 いくつかのIdeのサポートも含まれています。

    あなたのプロジェクトが洗練された32ビットマイクロコントローラを必要とするなら、私はSTM32シリーズを強くお勧めします。 彼らは強力で人気があるだけでなく、STM32マイクロコントローラも非常に手頃な価格です。

    STM32マイクロコントローラのプログラミングに関するより多くの訓練が必要ですか? もしそうなら、ここであなたがチェックアウトする必要があり、より詳細な入門コースです。

    この記事はVithamas TechnologiesのMohan Kashivasiによって書かれました。 彼はまた、ハードウェアアカデミー内の製品のお手伝いをするために利用可能な専門家の一人です。

    最後に、無料のPDFをダウンロードすることを忘れないでください: あなたの新しい電子ハードウェア製品を開発し、販売するための究極のガイド。 また私が私のblogで利用できない優れた内容を共有する私の週間時事通信を受け取る。

    あなたが好きかもしれない他のコンテンツ:

    • STM32マイクロコントローラ用Stm32Cubeideの紹介
    • 新製品のマイクロコントローラを選択する方法
    • Arduinoを組: Entry-Level STM32 Cortex-M0 Microcontroller (Blog + Video)
    • Introduction to the Ultra High-Performance STM32H7 32-bit Microcontroller
    4.52votes
    Article Rating

  • コメントを残す

    メールアドレスが公開されることはありません。