この詳細な記事では、さまざまな開発ツールを使用してSTM32CORTEX-M32ビット-マイクロコントローラ用の組み込みファームウェアを開発する方法を学びます。
STM32シリーズは、さまざまな製品で使用される最も人気のあるマイクロコントローラの一部です。 彼らはまた、複数のマイクロコントローラ開発フォーラムからの優れたサポートベースを持っています。
STMicroelectronicsのこのマイクロコントローラ-ファミリは、ARM Cortex-M32ビットプロセッサ-コアをベースにしています。
STM32マイクロコントローラは、センサ、ディスプレイ、カメラ、モーターなどのあらゆる種類の電子部品とインタフェースできる多数のシリアルおよびパラ すべてのSTM32亜種は内部フラッシュ-メモリおよびRAMと来ます。
STM32で利用可能な性能の範囲は非常に広大です。 最も基本的な製品には、クロック周波数がわずか24MHzのstm32F0およびSTM32F1サブシリーズがあり、わずか16ピンのパッケージで提供されています。
他の極端な性能では、STM32h7は最大400MHzで動作し、最大240ピンのパッケージで提供されます。
より高度なモデルは、深刻な数値処理要件を持つアプリケーションのための浮動小数点ユニット(FPU)で利用可能です。 これらのより高度なモデルは、マイクロコントローラとマイクロプロセッサの間の線を曖昧にします。
最後に、STM32Lサブシリーズは、小型バッテリから実行される低電力ポータブルアプリケーション用に特別に設計されています。
開発ツール
開発ツールは、コードを開発し、マイクロコントローラをプログラムし、コードをテスト/デバッグするために必要です。 開発ツールは次のとおりです。
- コンパイラ
- デバッガ
- インサーキットシリアルプログラマ(ICSP)
インサーキットシリアルプログラマ(ICSP)を介してSTM32をプログラミングする。
STM32マイクロコントローラのコード開発には、いくつかのソフトウェア開発ツールがあります。 ソフトウェアツールは、統合開発環境(IDE)として利用可能であり、必要なすべてのツールを統合環境に組み合わせています。Keil MDK ARM(uvison5IDE)–MDK ARM IDEは非常に安定した開発環境であり、無料でダウンロードできます。 これは、32KBのプログラムサイズまでのコードの開発を可能にします。 大規模なプログラムを開発するには、ライセンス版をここで購入する必要があります。
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ソフトウェアをインストールします。
構成タブで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->ダウンロードを選択してコードをフラッシュします。ダウンロードします。ダウンロードします。ダウンロードします。ダウンロードします。
マイクロコントローラは、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を使用して割込みを設定する方法について説明します。
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