🐼
STM32マイコンをRustで開発するときの割り込み設定
経緯
STM32L476をRustで動かす勉強をしていた時に割り込み設定関係で時間がかかったので備忘録。
前半はRust関係なし。
以下の項目について記載。
No. | 項目 | 備考 |
---|---|---|
1 | マニュアルのどこに書いているか | Rustに関係ないマイコン仕様の話 |
2 | Rustでの設定方法 | Rustの話 |
マニュアルのどこに書いているか
割り込みの設定は、動かしたいペリフェラルの個別設定の他にNested vectored interrupt controller(NVIC)
の設定が必要。
マニュアルは複数に記載が分かれており、STM32L476
では以下に必要情報が記載されている。
マニュアル | 章 | 記載内容 |
---|---|---|
Cortex-M4製品プログラミングマニュアル | 4.3章 Nested vectored interrupt controller (NVIC) | NVIC設定するためのレジスタ情報 |
STM32L4x6リファレンスマニュアル | 13章 Nested vectored interrupt controller (NVIC) | STM32L4x6のベクタテーブル一覧とオフセット情報 |
STM32L476xxデータシート | 3.14.1章 Nested vectored interrupt controller (NVIC) | 機能概要 |
Rustでの設定方法
RustでのNVIC設定はcortex_m
クレートを使用して以下のように書ける。
設定に使用するInterrupt列挙体はstm32l4
クレートを使用する。
use cortex_m::peripheral::NVIC;
use stm32l4::stm32l4x6::Interrupt;
fn test() {
//TIM2割り込みを有効にする
NVIC::unmask(Interrupt::TIM2);
}
useはstm32l4::stm32l4x6::NVIC
とも書けるが、その先でcortex_m::peripheral::NVIC
参照しているので中身は同じ。
もちろん上記クレートを使用せずレジスタのアドレスに直書きしても動く。
使用したクレートのバージョン
クレート | バージョン |
---|---|
cortex-m | 0.7.4 |
stm32l4 | 0.14.0 |
備考
そもそもRustでの設定に躓いた要因が、vscode上でコード補完が正常に動かず、どのクレートに何があるか分かりにくかったため。
以下で解決
Discussion