概要
STM32はSTMicroelectronics(STマイクロエレクトロニクス)が製造するARMアーキテクチャベースの32ビットマイコンファミリーです。2007年に初代STM32F1シリーズが発売されて以来、世界の産業機器・家電・医療機器・自動車電装・IoT機器に広く採用されています。
現在のSTM32はARM Cortex-Mコア(Cortex-M0/M0+/M3/M4/M7/M33/M55)を採用し、クロック周波数は24MHz〜550MHz、フラッシュは16KB〜数MB、RAMは6KB〜1MB以上という幅広い製品ラインナップを持ちます。充実したペリフェラル(UART・SPI・I2C・CAN・USB・Ethernet・ADC・DAC・DMA・タイマー)と電力管理機能を備えています。
開発環境にはSTM32CubeIDE(Eclipseベースの無償IDE)・STM32CubeMX(グラフィカルな初期設定ツール)・HAL(ハードウェア抽象化レイヤー)が提供され、初期設定からコード生成まで一貫したフローで開発できます。産業分野での長期供給保証(最長15年)も採用の大きな理由の一つです。
歴史・背景
2007年にSTマイクロがARM Cortex-M3コアを採用したSTM32F103シリーズを発売。72MHzのクロック・最大512KBフラッシュ・128KB RAMという当時最高水準の性能を低価格(数百円〜数千円)で提供しました。STM32F1は今も多くの産業機器・評価ボードで使われる定番です。
2011年にはCortex-M4コア(DSP命令・FPU内蔵)のSTM32F4が登場。168MHzの高性能で音声処理・モーター制御に広く採用されました。2014年にはCortex-M7コアのSTM32F7(216MHz)・2017年にはSTM32H7(550MHz、Cortex-M7 + Cortex-M4デュアルコア)が登場し、組み込み向け最高性能マイコンの地位を確立しました。
IoT向けには2017年のSTM32L0/L1(超低消費電力Cortex-M0/M0+)・STM32WB(BLE + M4 + M0+デュアルコア)・STM32WL(LoRa/Sub-GHz + M4 + M0+デュアルコア)など無線統合モデルも展開されています。
技術仕様
主要シリーズ比較
| シリーズ | コア | クロック | Flash | RAM | 特徴 |
|---|---|---|---|---|---|
| STM32F0 | Cortex-M0 | 〜48MHz | 16〜256KB | 4〜32KB | 超低コスト |
| STM32F1 | Cortex-M3 | 〜72MHz | 16〜1MB | 6〜96KB | 定番・汎用 |
| STM32F4 | Cortex-M4F | 〜180MHz | 512KB〜2MB | 128〜256KB | DSP・FPU・高性能 |
| STM32F7 | Cortex-M7F | 〜216MHz | 1〜2MB | 256〜512KB | 高速・外部RAM対応 |
| STM32H7 | Cortex-M7F (+M4F) | 〜550MHz | 2MB | 1MB | 最高性能 |
| STM32L0 | Cortex-M0+ | 〜32MHz | 16〜192KB | 2〜20KB | 超低消費電力 |
| STM32L4 | Cortex-M4F | 〜80MHz | 256KB〜1MB | 128〜640KB | 低消費電力・高性能 |
| STM32L5 | Cortex-M33 | 〜110MHz | 256〜512KB | 256KB | TrustZone対応 |
| STM32G0 | Cortex-M0+ | 〜64MHz | 32KB〜512KB | 8〜144KB | 低コスト・豊富なペリフェラル |
| STM32G4 | Cortex-M4F | 〜170MHz | 128KB〜512KB | 96〜128KB | モーター制御特化 |
| STM32WB | Cortex-M4+M0+ | 64MHz | 256KB〜1MB | 256KB | BLE 5.4内蔵 |
| STM32WL | Cortex-M4+M0+ | 48MHz | 256KB | 64KB | LoRa/Sub-GHz内蔵 |
STM32F4(Cortex-M4)の詳細仕様例(STM32F407VGT6)
| 項目 | 値 |
|---|---|
| CPU | ARM Cortex-M4(168MHz、Thumb-2命令セット) |
| FPU | 単精度浮動小数点ユニット(単精度演算をハードウェアで処理) |
| DSP | SIMD・乗算累算命令(信号処理に最適) |
| Flash | 1MB(3.3Vで待ち状態なし最大30MHz、アクセラレータ搭載) |
| SRAM | 192KB(112KB+64KB+16KB分割) |
| バックアップRAM | 4KB(バックアップドメイン) |
| タイマー | 17本(高度制御×2、汎用×12、基本×2) |
| UART | 6本(最大10.5Mbps) |
| SPI | 3本(最大42MHz) |
| I2C | 3本(最大400kbps FM / 1MHz FM+対応) |
| CAN | 2本(bxCAN 1Mbps) |
| USB | USB OTG FS + HS(HS外付けPHY経由) |
| Ethernet | 10/100 Ethernet MAC(IEEE 802.3準拠、外付けPHY必要) |
| ADC | 3本(12bit、最大2.4MSPS、24ch) |
| DAC | 2本(12bit) |
| DMA | 2系統(8ストリーム×4chずつ) |
| GPIO | 140本(最大) |
| SDIO | 1本(SDカード接続) |
| I2S | 2本(Audio DACとの接続) |
動作原理
STM32の初期化フローはHALライブラリを使うのが一般的です:
// STM32F4 HALを使った基本的な初期化とGPIO制御
#include "stm32f4xx_hal.h"
int main(void) {
// HALライブラリの初期化(SysTick = 1ms)
HAL_Init();
// システムクロックの設定(PLL経由で168MHzへ)
SystemClock_Config();
// GPIOクロック有効化
__HAL_RCC_GPIOD_CLK_ENABLE();
// GPIO設定
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_12 | GPIO_PIN_13;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // プッシュプル出力
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
while(1) {
HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_12); // LED1トグル
HAL_Delay(500); // 500ms待機
}
}
// UARTで文字列送信する例(HAL)
UART_HandleTypeDef huart2;
void UART_Init(void) {
huart2.Instance = USART2;
huart2.Init.BaudRate = 115200;
huart2.Init.WordLength = UART_WORDLENGTH_8B;
huart2.Init.StopBits = UART_STOPBITS_1;
huart2.Init.Parity = UART_PARITY_NONE;
huart2.Init.Mode = UART_MODE_TX_RX;
HAL_UART_Init(&huart2);
}
// 送信(ブロッキング)
const char *msg = "Hello STM32!\r\n";
HAL_UART_Transmit(&huart2, (uint8_t*)msg, strlen(msg), 1000);
// 送信(DMA)
HAL_UART_Transmit_DMA(&huart2, (uint8_t*)msg, strlen(msg));
ADC + DMA による連続計測
ADC_HandleTypeDef hadc1;
DMA_HandleTypeDef hdma_adc1;
uint32_t adc_buf[1024]; // ADCサンプルバッファ
// ADC DMAを使って1024サンプルを連続取得
HAL_ADC_Start_DMA(&hadc1, adc_buf, 1024);
// DMA完了コールバック
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) {
// adc_buf[]にサンプルが揃った
process_adc_data(adc_buf, 1024);
}
用途・ユースケース
STM32が採用される主な用途:
- 産業用モーター制御: STM32G4・STM32F4のPWMタイマーとADCでブラシレスDCモーター・ステッピングモーターをベクター制御
- 医療機器: 血圧計・輸液ポンプ・除細動器などの制御。IEC 62304適合のコード品質
- 電力変換器: インバーター・PFC(力率改善回路)のPWM制御。STM32F7/H7が高速PWM対応
- スマートメーター: 電力・ガス・水道の計量。低消費電力のSTM32L0/L4
- 車載ECU: STM32を採用した自動車部品が多数。CAN FD・LIN対応
- 工業用通信機器: Modbus・CAN・Ethernet通信のゲートウェイ
- セキュリティカメラ: STM32のMIPIインターフェースとUSBでカメラデータを処理
実装・開発のポイント
STM32CubeMXによるコード生成
STM32の開発ではSTM32CubeMXが強力なツールです:
1. CubeMXでチップを選択
2. GUIでクロック・GPIO・ペリフェラルを設定
3. コードを自動生成(HAL初期化コード)
4. STM32CubeIDEでアプリケーションコードを追加
5. ビルド・JTAGデバッグ
デバッグ(SWD/JTAG)
STM32はSWD(Serial Wire Debug)とJTAGの両方に対応します。ST-Link(公式デバッガ)やJ-Linkと組み合わせてOpenOCDまたはSTM32CubeIDEのデバッガを使います:
# OpenOCDを使ったSTM32接続
openocd -f interface/stlink.cfg -f target/stm32f4x.cfg
# GDB接続
arm-none-eabi-gdb build/firmware.elf
(gdb) target extended-remote localhost:3333
(gdb) monitor reset halt
(gdb) load
(gdb) continue
FreeRTOSとの組み合わせ
STM32はFreeRTOSとの組み合わせが定番で、STM32CubeMXからFreeRTOSを選ぶとCMSIS-RTOS v2 APIで自動生成されます:
// FreeRTOS タスク生成
osThreadId_t sensorTaskHandle;
const osThreadAttr_t sensorTask_attributes = {
.name = "sensorTask",
.stack_size = 256 * 4,
.priority = (osPriority_t) osPriorityNormal,
};
void StartSensorTask(void *argument) {
for(;;) {
// センサー読み取り
float temp = read_temperature();
// キューに送信
osMessageQueuePut(dataQueueHandle, &temp, 0, 0);
osDelay(1000); // 1秒待機
}
}
他技術との比較
STM32 vs ESP32
| 項目 | STM32 | ESP32 |
|---|---|---|
| アーキテクチャ | ARM Cortex-M | Xtensa LX6/LX7 |
| Wi-Fi/BT | 外付け必要(一部WBシリーズ除く) | 内蔵 |
| 産業サポート | 充実(15年供給保証) | 限定的 |
| リアルタイム性 | 高い | 中程度(Wi-Fiスタックと競合) |
| 価格 | 中程度(200〜3,000円) | 安い(200〜500円) |
| ペリフェラル | 豊富(CANなど産業向け) | 標準的 |
STM32 vs nRF52(Nordic Semiconductor)
nRF52はBLE特化のARM Cortex-M4マイコンで、低消費電力無線通信に特化しています。STM32はより汎用的で産業向けペリフェラルが豊富ですが、BLE性能ではnRF52に劣ります。BLEデバイス専用ならnRF52、それ以外の産業・汎用用途ではSTM32が有力な選択肢です。