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上でコード補完が正常に動かず、どのクレートに何があるか分かりにくかったため。
以下で解決

https://qiita.com/kyasbal_1994/items/6c7ce7665581fb3c859f