マイコンベンダーは,
ハードウェアの抽象化
開発支援ツールの提供
に注力することになる。
そして,「ハードウェアの抽象化」 の形が,
HAL : Hardware Abstraction Layer
マイコンごとに異なる周辺機能
GPIO, UART, SPI, I2C, ADC, タイマ, DMA など
を抽象化するために,HAL が一般的に採用される。
開発者は
ハードウェア固有のレジスタ操作
を免れ,アプリケーションロジックの実装に集中できる,というわけ。
- HAL の実体
HAL の実体は,
・HAL言語ライブラリ
・C + HAL言語で書いたソースプログラムを
MCU の機械語に翻訳する規則 (「ビルダ」)
- HALライブラリ
HALライブラリは,大きく以下の機能ブロックに分類される:
- 共通HAL
マイコン全体に関わる機能
システムクロック設定,
割り込みコントローラ,
フラッシュメモリ制御
などを扱う。
これは,
`stm32fxxx_hal.h`
`stm32fxxx_hal_rcc.h`
などのヘッダファイルで定義されている。
- 周辺機能HAL :
各周辺機能
GPIO,UART,SPI,I2C,
TIM,ADC,DMA,CAN,USBなど
に対応するドライバ群。
例えば,UARTであれば
`stm32fxxx_hal_uart.h`
`stm32fxxx_hal_uart.c`
で定義され,
初期化,
データ送受信,
割り込み処理
などのAPIが提供されれる。
- MSP (Microcontroller Specific Package) :
マイコン固有の低レベル初期化コードを含む層。
`stm32fxxx_hal_msp.c`
ファイルに実装され,各周辺機能の初期化時に呼ばれるコールバック関数(例: `HAL_UART_MspInit()`)が含まれる。
これにより,ハードウェア依存のピン配置やクロック設定をHALライブラリの汎用コードから分離し,移植性を高めている。
- HAL関数群の構造と命名規則
HALライブラリの関数は,一貫した命名規則に従っているため,その機能を推測しやすい。
一般的な命名規則は以下の通り:
`HAL_PPP_Init()`
周辺機能PPP(Peripheral)の初期化
`HAL_PPP_DeInit()`
周辺機能PPPの初期化解除を行う関数です。
`HAL_PPP_Read()` / `HAL_PPP_Write()`
周辺機能PPPからのデータ読み出し/書き込み
`HAL_PPP_Transmit()` / `HAL_PPP_Receive()`
通信系周辺機能(UART, SPIなど)でのデータ送受信
`HAL_PPP_IRQHandler()`
周辺機能PPPの割り込みハンドラです。
`HAL_PPP_RxCpltCallback()` / `HAL_PPP_TxCpltCallback()`
受信/送信完了時に呼ばれるコールバック
これらの関数は,通常,デバイスのインスタンスを指す構造体へのポインタ(例: `UART_HandleTypeDef *huart`)を引数として受け取り,その構造体を通じてデバイスの状態や設定を管理する。
これにより,複数の同じ周辺機能(例: UART1, UART2)を同時に扱うことが可能となる。
|