デバイス・ボード

STM32

STマイクロのArmマイコン。産業機器で広く使われる。

概要

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+デュアルコア)など無線統合モデルも展開されています。

技術仕様

主要シリーズ比較

シリーズコアクロックFlashRAM特徴
STM32F0Cortex-M0〜48MHz16〜256KB4〜32KB超低コスト
STM32F1Cortex-M3〜72MHz16〜1MB6〜96KB定番・汎用
STM32F4Cortex-M4F〜180MHz512KB〜2MB128〜256KBDSP・FPU・高性能
STM32F7Cortex-M7F〜216MHz1〜2MB256〜512KB高速・外部RAM対応
STM32H7Cortex-M7F (+M4F)〜550MHz2MB1MB最高性能
STM32L0Cortex-M0+〜32MHz16〜192KB2〜20KB超低消費電力
STM32L4Cortex-M4F〜80MHz256KB〜1MB128〜640KB低消費電力・高性能
STM32L5Cortex-M33〜110MHz256〜512KB256KBTrustZone対応
STM32G0Cortex-M0+〜64MHz32KB〜512KB8〜144KB低コスト・豊富なペリフェラル
STM32G4Cortex-M4F〜170MHz128KB〜512KB96〜128KBモーター制御特化
STM32WBCortex-M4+M0+64MHz256KB〜1MB256KBBLE 5.4内蔵
STM32WLCortex-M4+M0+48MHz256KB64KBLoRa/Sub-GHz内蔵

STM32F4(Cortex-M4)の詳細仕様例(STM32F407VGT6)

項目
CPUARM Cortex-M4(168MHz、Thumb-2命令セット)
FPU単精度浮動小数点ユニット(単精度演算をハードウェアで処理)
DSPSIMD・乗算累算命令(信号処理に最適)
Flash1MB(3.3Vで待ち状態なし最大30MHz、アクセラレータ搭載)
SRAM192KB(112KB+64KB+16KB分割)
バックアップRAM4KB(バックアップドメイン)
タイマー17本(高度制御×2、汎用×12、基本×2)
UART6本(最大10.5Mbps)
SPI3本(最大42MHz)
I2C3本(最大400kbps FM / 1MHz FM+対応)
CAN2本(bxCAN 1Mbps)
USBUSB OTG FS + HS(HS外付けPHY経由)
Ethernet10/100 Ethernet MAC(IEEE 802.3準拠、外付けPHY必要)
ADC3本(12bit、最大2.4MSPS、24ch)
DAC2本(12bit)
DMA2系統(8ストリーム×4chずつ)
GPIO140本(最大)
SDIO1本(SDカード接続)
I2S2本(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

項目STM32ESP32
アーキテクチャARM Cortex-MXtensa 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が有力な選択肢です。

関連用語

参考リンク