STM32入門(組み込み開発)
■第3話:STM32の基本操作2 -GPIO, UART-
(最終更新日:2025.01.13)
(絵が小さい場合はスマホを横に)
「基本的な使い方を学ぼう」
                第2話では、STM32CubeMXを活用した基本的なプロジェクト作成方法を学んだ。
                GUIを使ったピン設定やクロック設定の流れを解説し、STM32マイクロコントローラーの初期設定を理解した。
                今回は、さらにLED点滅を例にHAL関数を用いたGPIO制御を解説する。
                加えて、UART通信の仕組み、STM32での設定方法、PCとの通信方法についても学ぶ。
            
1.GPIOの解説
前回、クロックやピンの設定を行い、初期化コードを生成し、GPIOでLEDを点滅させることができた。 今回は、前回のコード、HAL(Hardware Abstarct Layer)関数について解説を行う。
生成した初期化コード
「HAL_GPIO_WritePin」は指定したGPIOピンの状態を設定する。 下記コードでは、Aポートの5番ピンをHIGHの状態に設定している。 GPIO_PIN_SETはHIGHを意味する。GPIO_PIN_RESETであれば、LOWになる。
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
GPIOピンの設定
上記のコードをHALを使わないで書くと、下記のようになる。
HAL関数を使わない書き方
HALを使うと何が良いかというと、端的で直観的なコードしてくれることである。 そして、シリーズ(異なるボード)間で内部の構成が変わったとしても、HALを使えば同じ書き方をすることができる。 HAL関数を生成する段階で、違いを吸収してくれる。 ただし、直接記述した場合に比べ、処理速度はやや劣るので、その点は注意しよう。
HALとレジスタ直接操作の比較
| 項目 | HALを使用 | レジスタ直接操作 | 
|---|---|---|
| 可読性 | 高い | 低い(レジスタ名やビット演算を理解する必要あり) | 
| 移植性 | 高い(全STM32シリーズ対応) | 低い(シリーズ間でレジスタ構造が異なる場合がある) | 
| コードの簡潔さ | シンプル(CubeMX自動生成コードと連携) | 詳細なレジスタ操作が必要 | 
| パフォーマンス | やや劣る(抽象化のオーバーヘッドあり) | 高い(直接操作のためオーバーヘッドなし) | 
| 保守性 | 高い(APIが統一されている) | 低い(すべてのレジスタ操作を把握する必要がある) | 
「HAL_DELAY」は指定した時間(ms単位)処理を停止する。 ms以下の高精度なタイミングが必要な場合はタイマーを用いた方が良いが、それほど厳密でない場合はこれで充分である。 下記は0.5秒処理を停止する。
HAL_Delay(500);
処理停止の設定
これらを応用すると、複数のLEDを点滅させたり、ボタンでLEDを制御することができる。 複数LED点滅のコードではHAL_DELAY(処理停止)を上手く活用している。 このWritePinとDelayを使うと、前回用いたToggleを使わなくても、下記のように書くことでLEDを点滅させることができる。 Delayの時間を調節することで、点滅のタイミングも決められる。
複数LED点滅(上)とボタン制御(下)
注意点としては、LEDは電流を流しすぎると壊れてしまうため、必要に応じて抵抗を入れるようにしよう。 また、GPIOのクロックを有効化することも忘れない。 今回のような、時間にシビアでない場合はHAL_DELAYで充分だが、リアルタイム性を追求する場合はタイマーを使用する。
2.UARTの仕組みとSTM32での設定方法
■UARTの概要
            UART(Universal Asynchronous Receiver/Transmitter)は、シリアル通信を実現するための一般的なプロトコルだ。
            本項では、UARTの仕組みとSTM32での設定方法、PCとの通信を実現する具体的な手順を詳しく解説する。
            
            UARTは、データを1ビットずつ逐次的に送受信する通信方式だ。
            スタートビット、データビット、パリティビット(オプション)、ストップビットから構成される。
            送信側はデータをフレーム化し、ビットを1つずつ送信する。受信側はフレームを解析して元のデータに復元する。
           
UARTのフレーム内容
| フレーム内容 | ビット数 | 説明 | 
|---|---|---|
| スタートビット | 1ビット | データの開始を示す | 
| データビット | 8ビット | 実際のデータ | 
| パリティビット | 0 or 1ビット | エラー検出用 | 
| ストップビット | 1ビット | データの終了を示す | 
UART通信は非同期通信で、クロック信号を使用せず、送受信者がボーレート(通信速度)を共有する。 それぞれ独立した回路、バッファを持つため、同時にデータを送受信可能である。短い距離の通信に適している。
■STM32での設定
                STM32ボード(評価用ならNucleoボード)、USBシリアルアダプタ(PCとUARTを接続)、ST-LINK経由の仮想COMポートを用意する。
                STM32CubeMXを起動し、新しいプロジェクトを作成、使用する評価ボードを選択する。
                ペリフェラルタブまたはチップ図で、USART1をクリックして有効化する。
                これにより、TXピン(PA9、送信)とRXピン(PA10、受信)が自動割り当てられる。
                ボーレートを9600など適切な値に設定、データ長8bit、パリティNone、ストップビット1bitなどを設定する。
                RCC設定で外部クロック(HSE)または内部クロック(HSTM32CubeIDEを選択してコードを生成SI)を有効化し、クロックツリーでUSART1のクロックが有効になっていることを確認する。
                プロジェクト名と保存場所を指定し、例えばSTM32CubeIDEを選択してコードを生成する。
            
■生成されたプロジェクトの確認
                main.c(メインプログラム)とusart.c(UART初期化コード)が生成されている。
                UART初期化コードは以下の通りになる。CubeMXで自動生成される。
            
UART初期化コード
■送信プログラム
                生成されたmain.cに「Hello UART!」が送信できるようにしてある。
                1秒間隔でデータを送信できるようになっている。
            
初期化コードから送信可能に
■送受信プログラム
                UART受信データを処理するように、下記のように編集する。
                これで、送受信が可能になる。
            
送受信可能に
3.PCとの通信を実現する
PCと接続するには、USBケーブルを利用する。 評価用のNucleoボードの場合は、仮想COMポート(ST-LINK経由)を使用するだけでよい。 開発用のボードの場合は、USBシリアルアダプタを使用し、UARTピンをPCに接続し、TX(STM32)→RX(アダプタ)、RX(STM32)→TX(アダプタ)を設定する。 GNDを共有する。 WindowsからTeraTermなどの通信を確認できるソフトを起動し、 ボード側で設定した、ボーレート:9600bps、データ長:8ビット、パリティ:None、ストップビット:1ビットと合わせる。 これにより、STM32から送信されたデータがシリアルモニタに表示される。 シリアルモニタから入力したデータがSTM32に届き、エコーバック(返信)される。
TeraTermでCPUボードと接続する
■応用例(非同期通信プログラム)
                UARTの割り込みを使用して非同期でデータを送受信する。
                下記のようなプログラムになる。      
            
UARTの割り込み
4.まとめ
このセクションでは、UART通信の仕組み、STM32での設定方法、PCとの通信実現を学んだ。 UARTはデバッグや外部デバイスとのデータ交換に非常に有用だ。 DMAや割り込みを活用すれば、さらに効率的な通信が可能になる。 必要に応じて応用例に挑戦し、UART通信の理解を深めよう。
▼参考図書、サイト
                 
                STM32マイコン公式日本語サイト
                 STマイクロエレクトロニクス
  
                 「WindowsではじめるSTM32」 インプレスR&D 山本 小鉄 
                 
                    Q&Aで学ぶマイコン講座(64) HAL(ハードウェア抽象化レイヤー)って何?   EDN Japan